Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

first commit

  • Loading branch information...
commit d685678676847bf7e81824c59250d7165ed9f182 0 parents
@emmett9001 emmett9001 authored
Showing with 10,077 additions and 0 deletions.
  1. +4 −0 .gitignore
  2. +39 −0 README.md
  3. 0  __init__.py
  4. +116 −0 docs/rdf.html
  5. +116 −0 docs/rdf_errors.html
  6. +123 −0 docs/schema.html
  7. +134 −0 docs/schema_errors.html
  8. +17 −0 example.schemato_config.py
  9. +16 −0 manage.py
  10. +161 −0 mrSchemato/__init__.py
  11. +15 −0 mrSchemato/errors.py
  12. +243 −0 mrSchemato/graph.py
  13. +80 −0 mrSchemato/parsely_page.py
  14. +13 −0 mrSchemato/settings.py
  15. +8 −0 prod_server.py
  16. +8 −0 requirements.txt
  17. +64 −0 schemato_web.py
  18. +1,040 −0 static/bootstrap/css/bootstrap-responsive.css
  19. +9 −0 static/bootstrap/css/bootstrap-responsive.min.css
  20. +5,624 −0 static/bootstrap/css/bootstrap.css
  21. +9 −0 static/bootstrap/css/bootstrap.min.css
  22. BIN  static/bootstrap/img/glyphicons-halflings-white.png
  23. BIN  static/bootstrap/img/glyphicons-halflings.png
  24. +2,027 −0 static/bootstrap/js/bootstrap.js
  25. +6 −0 static/bootstrap/js/bootstrap.min.js
  26. +58 −0 static/css/style.css
  27. BIN  static/img/footer_logo.png
  28. BIN  static/img/loading.gif
  29. +4 −0 static/js/jquery.min.js
  30. +143 −0 templates/index.html
4 .gitignore
@@ -0,0 +1,4 @@
+*.pyc
+.*.swp
+.*.un~
+schemato_config.py
39 README.md
@@ -0,0 +1,39 @@
+schema.org/rNews Validator
+==========================
+
+This is a validator for the a number of embedded metadata standards. It
+works by reading the object ontology and comparing each of a set of
+parsed tuples from a document against this ontology.
+
+To test the validation, clone this repo and run
+
+ >>> from mrSchemato import Validator
+ >>> validator = Validator()
+ >>> validator.validate("docs/rdf.html")
+
+this will run a validation on a correctly-implemented RDFa document (rdf.html). To run
+a validation on a document with errors, use one of the error test files
+
+``>>> validator.validate("docs/schema_errors.html")``
+
+The full schema.org standard is now also supported. You can validate any page
+that uses this standard against the RDFa ontology hosted at schema.org. To
+test this, you can find an arbitrary nytimes.com article, or copy and paste
+this example
+
+``>>> validator.validate("http://www.nytimes.com/2012/07/19/world/middleeast/.....html")``
+
+The ``docs`` directory also includes four documents for testing the validation in RDFa
+and microdata, both with and without errors built in. Running the validator on
+either of the correct files should yield no errors.
+
+Hosted Service
+--------------
+
+The mrSchemato module is also incorporated into a web service that provides
+a nice frontend for the validation. To test this service locally, run
+``python server/schemato_web.py``. Then navigate to localhost:5000, paste
+a url into the search bar, and click "Validate" to run a validation on the document.
+
+Running this service locally also requires celery and rabbitmq to be running
+and properly configured.
0  __init__.py
No changes.
116 docs/rdf.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
+<html xmlns:rnews="http://iptc.org/std/rNews/2011-10-07#" xmlns:og="http://ogp.me/ns#">
+<head>
+ <meta name="og:title" content="The Title"/>
+ <meta property="og:type" content="video.movie" />
+ <meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
+ <meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
+ <meta name="parsely-page" content='{"title": "Obama gives speech on Iraq", "link": "http://nytimes.com/2152/obama-iraq","image_url": "http://nytimes.com/img/2152.jpg","type": "post","post_id": "2152","pub_date": "2011-05-25T13:00:00Z","section": "Politics","author": "Josh Jones"}'/>
+</head>
+<body about="http://dev.iptc.org/rnews/sample_story.html" typeof="rnews:Article">
+<div>
+ <div>
+ <div property="rnews:headline">Allies Are Split...</div>
+ <span property="rnews:alternativeHeadline">NATO Takes Command</span>
+ <div rel="rnews:associatedMedia">
+ <div about="http://graphics8.nytimes.com/images/2011/03/25/world/africa/Policy/Policy-articleLarge.jpg"
+ typeof="rnews:ImageObject">
+ <img src="img/libya_sample_reuters.jpg"/>
+ <div>Credit:
+
+ <!-- Declaring the Person Object for the creator -->
+ <span rel="rnews:creator ">
+ <span about="http://blogs.reuters.com/goran-tomasevic/"
+ typeof="rnews:Person">
+ <span property="rnews:name">Goran Tomasevic</span>
+ </span>
+ </span>/
+ <span rel="rnews:copyrightHolder rnews:sourceOrganization rnews:provider">
+
+ <!--
+ Declaring the Organization Object for coprightHolder/source/provider
+ -->
+ <span about="http://www.reuters.com"
+ typeof="rnews:Organization">
+ <span property="rnews:name">Reuters</span>
+ </span>
+ </span>
+ </div>
+ <div property="rnews:description">Rebel fighters take...</div>
+
+ <!-- Adding hidden triples to our image object. -->
+ </div>
+ </div>
+ <div rel="rnews:creator">
+ <div about="http://topics.nytimes.com/topics/reference/timestopics/people/m/steven_lee_myers/"
+ typeof="rnews:Person">By
+ <span property="rnews:name">STEVEN LEE MYERS</span>
+ </div>
+ </div>
+ <div>
+ <span property="rnews:dateline">WASHINGTON</span> |
+ <span property="rnews:dateCreated" content="2011-03-24">March 24, 2011</span>
+ </div>
+ <div property="rnews:articleBody">
+ <p>Having largely succeeded...</p>
+ </div>
+ <div>
+ <p>
+ <a href="http://www.nytimes.com/content/help/rights/copyright/copyright-notice.html"
+ rel="rnews:copyrightNotice">
+ © Copyright 2011
+ </a>
+ <span>The New York Times Company</span>
+ </p>
+ <p>
+ <a href="http://www.nytimes.com/ref/membercenter/help/agree.html"
+ rel="rnews:usageTerms">
+ Disclaimer
+ </a>
+ </p>
+ </div>
+ </div>
+ <div>
+ <div>
+ <div>Section</div>
+ <div property="rnews:articleSection">World</div>
+ </div>
+ <div>Tags</div>
+ <div>
+ <div rel="rnews:about">
+ <div>People</div>
+ <div about="http://data.nytimes.com/91178019641520997503" typeof="rnews:Person">
+ <span property="rnews:name">Qaddafi, Muammar el-</span>
+ </div>
+ </div>
+ </div>
+ <div rel="rnews:comment">
+ <div>Discussion</div>
+ <div about="http://community.nytimes.com/comments/www.nytimes.com/2011/03/25/world/africa/25policy.html?permid=4#comment4" typeof="rnews:UserComment">
+ <div property="rnews:commentText">So the question is...</div>
+ <div rel="rnews:creator">
+ <span about="http://timespeople.nytimes.com/view/user/27242827" typeof="rnews:Person">
+ <a href="http://timespeople.nytimes.com/view/user/27242827"
+ property="rnews:name">Chuck</a>
+ </span>
+ </div>
+ <div property="rnews:commentTime" content="2001-03-25T08:27:00">March 25th, 2011 8:27 am</div>
+ </div>
+ </div>
+ </div>
+</div>
+<div style="display:none">
+ <div property="rnews:description">The questions about the...</div>
+ <div property="rnews:inLanguage">en</div>
+ <div rel="rnews:thumbnailUrl"
+ href="http://http://graphics8.nytimes.com/images/common/icons/t_wb_75.gif"></div>
+ <div rel="rnews:copyrightHolder rnews:sourceOrganization rnews:provider">
+ <div about="http://www.nytimes.com" typeof="rnews:Organization">
+ <div rel="rnews:tickerSymbol">
+ NYSE NYT
+ </div>
+ </div>
+ </div>
+</div>
+</body>
+</html>
116 docs/rdf_errors.html
@@ -0,0 +1,116 @@
+<html xmlns:rnews="http://iptc.org/std/rNews/2011-10-07#" xmlns:og="http://ogp.me/ns#">
+<head>
+ <meta property="og:tit" content="The Title"/>
+ <meta property="og:type" content="video.movie" />
+ <meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
+ <meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
+ <meta name="parsely-page" content='{"title": "Obama gives speech on Iraq", "link": "/2152/obama-iraq","image_url": "http://nytimes.com/img/2152.jpg","type": "post","postid": "2152","pubdate": "2011-05-25","section": "Politics","author": "Josh Jones"}'/>
+</head>
+<body about="http://dev.iptc.org/rnews/sample_story.html" typeof="rnews:Article">
+<div>
+ <div>
+ <div property="rnews:headline">Allies Are Split...</div>
+ <div property="rnews:headline">Something different!</div>
+ <span property="rnews:alternativeHeadline">NATO Takes Command</span>
+ <div rel="rnews:associatedMedia">
+ <div about="http://graphics8.nytimes.com/images/2011/03/25/world/africa/Policy/Policy-articleLarge.jpg"
+ typeof="rnews:imageObject">
+ <img src="img/libya_sample_reuters.jpg"/>
+ <div>Credit:
+
+ <!-- Declaring the Person Object for the creator -->
+ <span rel="rnews:creator ">
+ <span about="http://blogs.reuters.com/goran-tomasevic/"
+ typeof="rnews:Person">
+ <span property="rnews:name">Goran Tomasevic</span>
+ </span>
+ </span>/
+ <span rel="rnews:copyrightHolder rnews:sourceOrganization rnews:provider">
+
+ <!--
+ Declaring the Organization Object for coprightHolder/source/provider
+ -->
+ <span about="http://www.reuters.com"
+ typeof="rnews:Organization">
+ <span property="rnews:articleBody">Reuters</span>
+ </span>
+ </span>
+ </div>
+ <div property="rnews:description">Rebel fighters take...</div>
+
+ <!-- Adding hidden triples to our image object. -->
+ </div>
+ </div>
+ <div rel="rnews:creator">
+ <div about="http://topics.nytimes.com/topics/reference/timestopics/people/m/steven_lee_myers/"
+ typeof="rnews:Persons">By
+ <span property="rnews:body">STEVEN LEE MYERS</span>
+ </div>
+ </div>
+ <div>
+ <span property="rnews:dateline">WASHINGTON</span> |
+ <span property="rnews:dateCreated" content="2011-03-24">March 24, 2011</span>
+ </div>
+ <div property="rnews:articleBody">
+ <p>Having largely succeeded...</p>
+ </div>
+ <div>
+ <p>
+ <a href="http://www.nytimes.com/content/help/rights/copyright/copyright-notice.html"
+ rel="copyrightNotice">
+ © Copyright 2011
+ </a>
+ <span>The New York Times Company</span>
+ </p>
+ <p>
+ <a href="http://www.nytimes.com/ref/membercenter/help/agree.html"
+ rel="rnews:usageTerms">
+ Disclaimer
+ </a>
+ </p>
+ </div>
+ </div>
+ <div>
+ <div>
+ <div>Section</div>
+ <div property="rnews:articleSection">World</div>
+ </div>
+ <div>Tags</div>
+ <div>
+ <div rel="rnews:about">
+ <div>People</div>
+ <div about="http://data.nytimes.com/91178019641520997503" typeof="rnews:Person">
+ <span property="rnews:name">Qaddafi, Muammar el-</span>
+ </div>
+ </div>
+ </div>
+ <div rel="rnews:comment">
+ <div>Discussion</div>
+ <div about="http://community.nytimes.com/comments/www.nytimes.com/2011/03/25/world/africa/25policy.html?permid=4#comment4" typeof="rnews:comment">
+ <div property="rnews:commentText">So the question is...</div>
+ <div rel="rnews:creator">
+ <span about="http://timespeople.nytimes.com/view/user/27242827" typeof="rnews:Person">
+ <a href="http://timespeople.nytimes.com/view/user/27242827"
+ property="rnews:name">Chuck</a>
+ </span>
+ </div>
+ <div property="rnews:commentTime" content="2001-03-25T08:27:00">March 25th, 2011 8:27 am</div>
+ </div>
+ </div>
+ </div>
+</div>
+<div style="display:none">
+ <div property="rnews:description">The questions about the...</div>
+ <div property="rnews:inLanguage">en</div>
+ <div rel="rnews:thumbnailUrl"
+ href="http://http://graphics8.nytimes.com/images/common/icons/t_wb_75.gif"></div>
+ <div rel="rnews:copyrightHolder rnews:sourceOrganization rnews:provider">
+ <div about="http://www.nytimes.com" typeof="rnews:Organization">
+ <div rel="rnews:tickerSymbol">
+ NYSE NYT
+ </div>
+ </div>
+ </div>
+</div>
+</body>
+</html>
123 docs/schema.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html itemscope itemtype="http://schema.org/NewsArticle" itemid="http://dev.iptc.org/rnews/sample_story.html" xmlns:og="http://ogp.me/ns#">
+<head>
+ <meta name="og:title" content="The Title"/>
+ <meta property="og:type" content="video.movie" />
+ <meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
+ <meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
+ <meta name="parsely-page" content='{"title": "Obama gives speech on Iraq", "link": "http://nytimes.com/2152/obama-iraq","image_url": "http://nytimes.com/img/2152.jpg","type": "post","post_id": "2152","pub_date": "2011-05-25T13:00:00Z","section": "Politics","author": "Josh Jones"}'/>
+ <style type="text/css">@import url(/files/Simple-Sample/iptc_times2.css);</style>
+ <meta itemprop="description" content="The questions about the command mirrored the strategic divisions over how the coalition will end the operation." />
+ <meta itemprop="inLanguage" content="en-US" />
+ <meta itemprop="thumbnailUrl" content="http://graphics8.nytimes.com/images/common/icons/t_wb_75.gif" />
+</head>
+<body>
+ <div class="article" style="height:623px">
+ <div class="a_column">
+ <div itemprop="headline" class="headline">Allies Are Split on Goal and Exit Strategy in Libya</div>
+ <div itemprop="alternativeHeadline" class="rider">NATO Takes Command</div>
+ <div
+ itemprop="associatedMedia"
+ itemscope
+ itemtype="http://schema.org/ImageObject"
+ itemid="http://graphics8.nytimes.com/images/2011/03/25/world/africa/Policy/Policy-articleLarge.jpg"
+ class="main_image">
+ <img class="image" src="/files/Simple-Sample/libya_sample_reuters.jpg"/>
+ <div class="image_credit">Credit:
+ <span
+ itemprop="creator"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://blogs.reuters.com/goran-tomasevic/">
+ <span itemprop="name">Goran Tomasevic</span>
+ </span>
+ /
+ <span
+ itemprop="copyrightHolder sourceOrganization provider"
+ itemscope
+ itemtype="http://schema.org/Organization"
+ itemid="http://www.reuters.com">
+ <span itemprop="name">Reuters</span>
+ </span>
+ </div>
+ <div itemprop="description" class="image_caption">Rebel fighters take cover during a shelling near Ajdabiyah, Libya on Thursday.</div>
+ </div>
+ <div
+ itemprop="creator"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://topics.nytimes.com/topics/reference/timestopics/people/m/steven_lee_myers/"
+ class="byline">By
+ <span itemprop="name">STEVEN LEE MYERS</span>
+ </div>
+ <div class="publication_date">
+ <span itemprop="dateline">WASHINGTON</span> |
+ <meta itemprop="dateCreated" content="2011-03-24"/>March 24, 2011
+ </div>
+ <div class="article_text">
+ <p itemprop="articleBody">Having largely succeeded in stopping a rout of Libya&rsquo;s rebels, the inchoate coalition attacking Col. Muammar el-Qaddafi&rsquo;s forces remains divided over the ultimate goal &mdash; and exit strategy &mdash; of what officials acknowledged Thursday would be a military campaign that could last for weeks. </p>
+ </div>
+ <div class="legalese">
+ <p>
+ <span itemprop="copyrightYear">2011</span>
+ <span
+ itemprop="copyrightHolder provider sourceOrganization"
+ itemscope
+ itemtype="http://schema.org/Corporation"
+ itemid="http://www.nytimes.com">
+ <span itemprop="name">The New York Times Company</span>
+ <meta itemprop="tickerSymbol" content="NYSE NYT"/>
+ </span>
+ </p>
+ </div>
+ </div>
+ <div class="b_column">
+ <div class="b_module">
+ <div class="section_head">Section</div>
+ <div class="tag" itemprop="articleSection">World</div>
+ </div>
+
+ <div class="section_head">Tags</div>
+ <div class="b_module tag_module">
+ <div>
+ <div class="tag_head">People</div>
+ <div
+ itemprop="about"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://data.nytimes.com/91178019641520997503"
+ class="tag tag_first tag_last">
+ <span itemprop="name">Qaddafi, Muammar el-</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="b_module">
+ <div class="section_head">Discussion</div>
+ <div
+ itemprop="comment"
+ itemscope
+ itemtype="http://schema.org/UserComments"
+ itemid="http://community.nytimes.com/comments/www.nytimes.com/2011/03/25/world/africa/25policy.html?permid=1#comment1"
+ class="comment">
+ <div>&quot;<span itemprop="commentText" class="comment_text">So the question is: Why is Secretary of Defense Hillary Clinton speaking as the Defense Secretary...</span>&quot;</div>
+ <div
+ itemprop="creator"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://timespeople.nytimes.com/view/user/27242827/activities.html"
+ class="username">
+ <a href="http://timespeople.nytimes.com/view/user/27242827/activities.html">
+ <span itemprop="name">Chuck</span>
+ </a>
+ </div>
+ <div class="username">
+ <meta itemprop="commentTime" content="2011-03-2011T08:27Z"/>March 25th, 2011 8:27 am
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </span>
+</body>
+</html>
134 docs/schema_errors.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html itemscope itemtype="http://schema.org/NewsArticle"
+itemid="http://dev.iptc.org/rnews/sample_story.html" xmlns:og="http://ogp.me/ns#">
+<head>
+ <meta property="og:tit" content="The Title"/>
+ <meta property="og:type" content="video.movie" />
+ <meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
+ <meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
+ <meta name="parsely-page" content='{"title": "Obama gives speech on Iraq", "link": "/2152/obama-iraq","image_url": "http://nytimes.com/img/2152.jpg","type": "post","postid": "2152","pubdate": "2011-05-25","section": "Politics","author": "Josh Jones"}'/>
+ <style type="text/css">@import url(/files/Simple-Sample/iptc_times2.css);</style>
+ <meta itemprop="description" content="The questions about the command mirrored the strategic divisions over how the coalition will end the operation." />
+ <meta itemprop="inLanguage" content="en-US" />
+ <meta itemprop="thumbnailUrl" content="http://graphics8.nytimes.com/images/common/icons/t_wb_75.gif" />
+</head>
+<body>
+ <div class="article" style="height:623px">
+ <div class="a_column">
+ <div itemprop="headline" class="headline">Allies Are Split on Goal and Exit Strategy in Libya</div>
+ <div itemprop="alternativeHeadline" class="rider">NATO Takes Command</div>
+ <div
+ itemprop="associatedMedia"
+ itemscope
+ itemtype="http://schema.org/ImageObject"
+ itemid="http://graphics8.nytimes.com/images/2011/03/25/world/africa/Policy/Policy-articleLarge.jpg"
+ class="main_image">
+ <img class="image" src="/files/Simple-Sample/libya_sample_reuters.jpg"/>
+ <div class="image_credit">Credit:
+ <span
+ itemprop="creator"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://blogs.reuters.com/goran-tomasevic/">
+ <span itemprop="name">Goran Tomasevic</span>
+ </span>
+ /
+ <span
+ itemprop="copyrightHolder sourceOrganization provider"
+ itemscope
+ itemtype="http://schema.org/Organization"
+ itemid="http://www.reuters.com">
+ <span itemprop="name">Reuters</span>
+ </span>
+ </div>
+ <div itemprop="description" class="image_caption">Rebel fighters take cover during a shelling near Ajdabiyah, Libya on Thursday.</div>
+ </div>
+ <div
+ itemprop="createdBy"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://topics.nytimes.com/topics/reference/timestopics/people/m/steven_lee_myers/"
+ class="byline">By
+ <span itemprop="name">STEVEN LEE MYERS</span>
+ </div>
+ <div class="publication_date">
+ <span itemprop="dateline">WASHINGTON</span> |
+ <meta itemprop="dateCreated" content="2011-03-24"/>March 24, 2011
+ </div>
+ <div class="article_text">
+ <p itemprop="articleBody">Having largely succeeded in stopping a rout of Libya&rsquo;s rebels, the inchoate coalition attacking Col. Muammar el-Qaddafi&rsquo;s forces remains divided over the ultimate goal &mdash; and exit strategy &mdash; of what officials acknowledged Thursday would be a military campaign that could last for weeks. </p>
+ </div>
+ <div class="legalese">
+ <p>
+ <a itemprop="copyrightNotice"
+ href="http://www.nytimes.com/content/help/rights/copyright/copyright-notice.html">
+ &copy; Copyright
+ </a>
+ <span itemprop="copyrightYear">2011</span>
+ <span
+ itemprop="copyrightHolder provider sourceOrganization"
+ itemscope
+ itemtype="http://schema.org/Organization"
+ itemid="http://www.nytimes.com">
+ <span itemprop="name">The New York Times Company</span>
+ <meta itemprop="tickerSymbol" content="NYSE NYT"/>
+ </span>
+ </p>
+ <p>
+ <a itemprop="usageTerms"
+ href="http://www.nytimes.com/ref/membercenter/help/agree.html">
+ Usage Terms
+ </a>
+ </p>
+ </div>
+ </div>
+ <div class="b_column">
+ <div class="b_module">
+ <div class="section_head">Section</div>
+ <div class="tag" itemprop="articleSection">World</div>
+ </div>
+
+ <div class="section_head">Tags</div>
+ <div class="b_module tag_module">
+ <div>
+ <div class="tag_head">People</div>
+ <div
+ itemprop="about"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://data.nytimes.com/91178019641520997503"
+ class="tag tag_first tag_last">
+ <span itemprop="name">Qaddafi, Muammar el-</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="b_module">
+ <div class="section_head">Discussion</div>
+ <div
+ itemprop="comment"
+ itemscope
+ itemtype="http://schema.org/UserComment"
+ itemid="http://community.nytimes.com/comments/www.nytimes.com/2011/03/25/world/africa/25policy.html?permid=1#comment1"
+ class="comment">
+ <div>&quot;<span itemprop="commentText" class="comment_text">So the question is: Why is Secretary of Defense Hillary Clinton speaking as the Defense Secretary...</span>&quot;</div>
+ <div
+ itemprop="creator"
+ itemscope
+ itemtype="http://schema.org/Person"
+ itemid="http://timespeople.nytimes.com/view/user/27242827/activities.html"
+ class="username">
+ <a href="http://timespeople.nytimes.com/view/user/27242827/activities.html">
+ <span itemprop="name">Chuck</span>
+ </a>
+ </div>
+ <div class="username">
+ <meta itemprop="commentTimeBoner" content="2011-03-2011T08:27Z"/>March 25th, 2011 8:27 am
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </span>
+</body>
+</html>
17 example.schemato_config.py
@@ -0,0 +1,17 @@
+BROKER_HOST = '127.0.0.1'
+BROKER_PORT = 5672
+BROKER_USER = "myuser"
+BROKER_PASSWORD = "mypassword"
+BROKER_VHOST = "myvhost"
+
+CELERY_IMPORTS = ("mrschemato",)
+CELERY_RESULT_BACKEND = "amqp"
+CELERY_TASK_PUBLISH_RETRY = {
+ "max_retries": 3,
+ "interval_start": 1,
+ "interval_step": 0.2,
+ "interval_max": 2
+}
+
+CELERYD_HIJACK_ROOT_LOGGER = False
+CELERYD_LOG_LEVEL = 'DEBUG'
16 manage.py
@@ -0,0 +1,16 @@
+from __future__ import absolute_import
+from flask.ext.script import Manager
+from flask.ext.celery import install_commands as install_celery_commands
+import os
+
+from schemato_web import create_app
+
+parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+os.sys.path.insert(0,parentdir)
+
+app = create_app()
+manager = Manager(app)
+install_celery_commands(manager)
+
+if __name__ == "__main__":
+ manager.run()
161 mrSchemato/__init__.py
@@ -0,0 +1,161 @@
+import urllib
+import re
+from collections import defaultdict
+import sys
+
+from parsely_page import ParselyPageValidator
+from errors import _error
+from graph import Graph
+from settings import *
+
+
+def prettyprint(dict_2d):
+ for k in dict_2d:
+ print k
+ for g in dict_2d[k]:
+ print " %s" % str(g)
+ print
+
+
+class Validator(object):
+ def __init__(self):
+ self.namespaces = [RNEWS_ROOT, SCHEMA_ROOT, OG_ROOT, OG_ALT_ROOT]
+ self.ppage = ParselyPageValidator()
+ super(Validator, self).__init__()
+
+ ##################################################################
+ # FRONTENDS #
+ ##################################################################
+ def validate(self, stream):
+ """frontend, returns a list of errors"""
+ errors = []
+ ret = defaultdict(list)
+
+ try:
+ text, url = self._read_stream(stream)
+ except IOError, e:
+ ret['msg'] = e.message
+ return dict(ret)
+
+ ret['url'].append(stream)
+
+ ppage = self.ppage.validate(text, self.doc_lines)
+ if ppage:
+ ret['errors'].append(ppage)
+
+ self.graphs = self._graphs_from_source(stream)
+ if not self.graphs:
+ ret['msg'] = "No recognized namespaces found"
+ prefixes = self.search_prefixes(text)
+ if prefixes:
+ ret['msg'] += " - did you forget to include a namespace for one of these prefixes : %s ?" % ", ".join(["'%s'" % a for a in prefixes])
+ return dict(ret)
+
+ for graph in self.graphs:
+ for ns in graph.ns_ont.keys():
+ ret['ontology'].append(graph.ns_ont[ns])
+ ret['ont_name'].append(ns)
+ ret['errors'].append(graph.check(self.doc_lines))
+
+ ret['errors'] = sum(ret['errors'], [])
+ ret['msg'] = "Validation complete - %s errors found" % (len(ret['errors']) if len(ret['errors']) > 0 else "no")
+ return dict(ret)
+
+ ######################################################################
+ # WRAPPERS #
+ ######################################################################
+ def _graphs_from_source(self, url):
+ """wrapper for _graphs_from_namespaces, builds a list of namespaces
+ used in the document"""
+ # make sure these are not still set from a previous run
+ graphs = []
+
+ text, url = self._read_stream(url)
+
+ namespaces = [a for a in RDFA_NAMESPACES+MICRODATA_NAMESPACES if a in text]
+ if not namespaces:
+ return None
+
+ if OG_ROOT in namespaces:
+ namespaces.append(OG_ALT_ROOT)
+ if OG_ALT_ROOT in namespaces:
+ namespaces.append(OG_ROOT)
+ graphs = self._graphs_from_namespaces(url, namespaces)
+
+ if not graphs:
+ raise ValueError('No supported namespace found.\nSupported namespaces: %s' % self.namespaces)
+
+ return graphs
+
+ def _graphs_from_namespaces(self, url, namespaces):
+ """parse a stream (either a web document or a local file)
+ into graphs based on rdf and/or microdata"""
+ rdf_graph, microdata_graph = None, None
+ ret = []
+
+ for ns in namespaces:
+ if ns in RDFA_NAMESPACES:
+ rdf_graph = Graph(url, 'rdfa')
+ rdf_graph.ns_ont[ns] = ns2ont[ns]
+ elif ns in MICRODATA_NAMESPACES:
+ microdata_graph = Graph(url, 'microdata')
+ microdata_graph.ns_ont[ns] = ns2ont[ns]
+
+ if rdf_graph:
+ rdf_graph.build_graph()
+ ret.append(rdf_graph)
+ if microdata_graph:
+ microdata_graph.build_graph()
+ ret.append(microdata_graph)
+
+ return ret
+
+ #################################################################
+ # HELPERS #
+ #################################################################
+ def _document_lines(self, text):
+ """helper, get a list of (linetext, linenum) from a string with newlines"""
+ doc_lines, num = [], 0
+ for line in text.split('\n'):
+ num += 1
+ line = re.sub(r'^ +| +$', '', line)
+ line = line.replace("<", "&lt;").replace(">", "&gt;")
+ doc_lines.append((line, num))
+ return doc_lines
+
+ def search_prefixes(self, text):
+ print COMMON_PREFIXES
+ print text
+ print "og: in text: %s" % ('og:' in text)
+ return [a for a in COMMON_PREFIXES if a in text]
+
+ def _get_document(self, url):
+ """helper, open a file or url and return the doctype and content separately"""
+ try:
+ if "http://" not in url:
+ scheme_url = "http://%s" % url
+ else:
+ scheme_url = url
+
+ try:
+ text = urllib.urlopen(scheme_url).read()
+ url = scheme_url
+ except:
+ text = open(url, "r").read()
+ except:
+ raise IOError('Failed to read stream from %s' % url)
+
+ doctype = re.search(r'<!DOCTYPE.*?>', text)
+ if doctype:
+ doctype = doctype.group(0)
+
+ return (doctype, text, url)
+
+ def _read_stream(self, url):
+ """wrapper, given a url returns the text read from that url
+ also sets self.doc_lines as an array of tuples of the form
+ (line number, line text) containing all lines of the read text"""
+ doctype, text, url = self._get_document(url)
+ self.doc_lines = self._document_lines(text)
+ return text, url
+
15 mrSchemato/errors.py
@@ -0,0 +1,15 @@
+def error_line(string, doc_lines=None):
+ for line,num in doc_lines:
+ if string in line:
+ return line,num
+ return ('', 0)
+
+def _error(message, *strings, **kwargs):
+ for s in strings:
+ if not s:
+ return None
+ search_string = kwargs['search_string'] if 'search_string' in kwargs.keys() else strings[0]
+ doc_lines = kwargs['doc_lines']
+ message = message.format(*strings)
+ line,num = error_line(search_string, doc_lines=doc_lines)
+ return {'num': num, 'line': line, 'err': message}
243 mrSchemato/graph.py
@@ -0,0 +1,243 @@
+import rdflib.term as rt
+from pyMicrodata import pyMicrodata
+from pyRdfa import pyRdfa
+import rdflib
+
+from errors import _error
+
+from collections import defaultdict
+import os
+
+RNEWS_ROOT = "http://iptc.org/std/rNews/2011-10-07#"
+SCHEMA_ROOT = "http://schema.org/"
+OG_ROOT = "http://opengraphprotocol.org/schema/"
+OG_ALT_ROOT = "http://opengraphprotocol.org/schema/"
+
+def deepest_node((subj, pred, obj), graph):
+ """recurse down the tree and return a list of the most deeply nested
+ child nodes of the given triple"""
+ to_return = []
+ def _deepest_node((subj, pred, obj), graph):
+ children = []
+ if isinstance(obj, rt.BNode):
+ for s,p,o in graph:
+ if str(s) == str(obj):
+ children.append((s,p,o))
+ for s,p,o in children:
+ s1,p1,o1 = _deepest_node((s, p, o), graph)
+ if "rNews" in str(o1) and (s1,p1,o1) not in to_return:
+ to_return.append((s1,p1,o1))
+ return (s1,p1,o1)
+ else:
+ return (subj, pred, obj)
+ _deepest_node((subj, pred, obj), graph)
+ return to_return
+
+
+class Graph(object):
+ """a graph may have multiple ontologies but must have exactly one self.graph"""
+ def __init__(self, url, impl):
+ self.ns_ont = {}
+ self.attribs_by_class = defaultdict(list)
+ self.ontologies = []
+ self.attributes = []
+ self.source = url
+ self.impl = impl
+ if 'rdfa' == impl:
+ self.range_uri = "http://www.w3.org/2000/01/rdf-schema#range"
+ self.domain_uri = "http://www.w3.org/2000/01/rdf-schema#domain"
+ self.type_uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
+ self.subclass_uri = "http://www.w3.org/2000/01/rdf-schema#subClassOf"
+ self.parser = pyRdfa()
+ elif 'microdata' == impl:
+ self.range_uri = "http://schema.org/range"
+ self.domain_uri = "http://schema.org/domain"
+ self.type_uri = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
+ self.subclass_uri = "http://www.w3.org/2000/01/rdf-schema#subClassOf"
+ self.parser = pyMicrodata()
+ return super(Graph, self).__init__()
+
+ ####################################################################
+ # MAIN FRONTENDS #
+ ####################################################################
+ def check(self, doc_lines):
+ """iterates over self.graph, calling check_triple on each triple
+ tracks the errors and returns a list thereof"""
+ self.doc_lines = doc_lines
+ errors = []
+ for s,p,o in self.graph:
+ error = self.check_triple((s,p,o))
+ if error and error not in errors:
+ errors.append(error)
+ return errors
+
+ def build_graph(self):
+ """build a graph from the document and assemble the ontologies
+ necessary to validate it"""
+ try:
+ self.graph = self.parser.graph_from_source(self.source)
+ except Exception, e:
+ raise ValueError("Error parsing source: %s" % e)
+
+ for ns in self.ns_ont:
+ self.ontologies.append(self.parse_ontology(self.ns_ont[ns]))
+
+ return self
+
+ #####################################################################
+ # VALIDATION WRAPPERS #
+ #####################################################################
+ def parse_ontology(self, source=None):
+ """parse the given ontology into two special data formats
+ self.ontology is a dict containing triples of the form {subj: (pred, obj)}
+ self.attribs_by_class is a dict like {class: [class_data_members]}
+ """
+ source = source or self.ont_source_url
+ ontology = defaultdict(list)
+
+ parse_func = self.get_filetype(source)
+
+ try:
+ # this call takes a really long time when given the schema.org ontology
+ graph = parse_func(source)
+ except:
+ raise IOError('Error parsing ontology %s' % source)
+
+ for subj, pred, obj in graph:
+ ontology[subj].append((pred, obj))
+
+ deep_nodes = [(subj, pred, obj)]
+ if type(obj) == rt.BNode:
+ deep_nodes = deepest_node((subj, pred, obj), graph)
+
+ for s,p,o in deep_nodes:
+ if "ogp.me" in source or "opengraph" in source:
+ if s not in self.attribs_by_class[self.source] and not isinstance(s, rt.BNode):
+ self.attribs_by_class[self.source].append(s)
+ else:
+ if pred == rt.URIRef(self.domain_uri):
+ self.attribs_by_class[o].append(subj)
+
+ return ontology
+
+ def check_triple(self, (subj, pred, obj)):
+ """take a triple and compare it to the ontology, return indication
+ of whether it's adherent or not"""
+ # don't bother with special 'type' triples
+ if self.field_name(pred) in ['type', 'item', 'first', 'rest']:
+ return
+ if self.namespace_from_uri(pred) not in self.ns_ont.keys():
+ return
+
+ classes = []
+
+ instanceof = self.is_instance((subj, pred, obj)) or self.source
+
+ class_invalid = self.validate_class(instanceof)
+ if class_invalid:
+ return class_invalid
+
+ classes = self.superclasses_for_subject(self.graph, instanceof)
+ classes.append(instanceof)
+
+ # is this attribute a valid member of the class or superclasses?
+ # in the case of OG, this just means "is it a valid og field"
+ member_invalid = self.validate_member(pred, classes, instanceof)
+ if member_invalid:
+ return member_invalid
+
+ dupe_invalid = self.validate_duplication((subj, pred), instanceof)
+ if dupe_invalid:
+ return dupe_invalid
+
+ # collect a list of checked attributes
+ self.attributes.append((subj,pred))
+
+ return
+
+ #################################################################
+ # VALIDATION BACKENDS #
+ #################################################################
+ def validate_class(self, cl):
+ """return error if class `cl` is not found in the ontology"""
+ if cl not in self.attribs_by_class.keys():
+ search_string = str(cl)
+ if self.impl != 'microdata':
+ search_string = self.field_name(cl)
+ return _error("{0} - invalid class", self.field_name(cl),
+ search_string=search_string, doc_lines=self.doc_lines)
+ return
+
+ def validate_member(self, member, classes, instanceof):
+ """return error if `member` is not a member of any class in `classes`"""
+ valid = False
+ for ns in self.ns_ont.keys():
+ name = "%s%s" % (ns, self.field_name(member))
+ if rt.URIRef(name) in sum([self.attribs_by_class[cl] for cl in classes], []):
+ valid = True
+ if not valid:
+ return _error("{0} - invalid member of {1}",
+ self.field_name(member), self.field_name(instanceof),
+ doc_lines=self.doc_lines)
+ return
+
+ def validate_duplication(self, (subj, pred), cl):
+ """returns error if we've already seen the member `pred` on `subj`"""
+ if (subj,pred) in self.attributes:
+ return _error("{0} - duplicated member of {1}", self.field_name(pred),
+ self.field_name(cl), doc_lines=self.doc_lines)
+
+ #################################################################
+ # HELPERS / UTILITIES #
+ #################################################################
+ def get_filetype(self, source):
+ """returns the function that can be used to parse the given
+ document into an rdflib.Graph"""
+ name, ext = os.path.splitext(source)
+ if ext in ['.ttl']:
+ def _parse_func(s):
+ return rdflib.Graph().parse(s, format='n3')
+ else:
+ def _parse_func(s):
+ return pyRdfa().graph_from_source(s)
+ return _parse_func
+
+ def superclasses_for_subject(self, graph, typeof):
+ """helper, returns a list of all superclasses of a given class"""
+ classes = []
+ superclass = typeof
+ while True:
+ found = False
+ for ont in self.ontologies:
+ for (p, o) in ont[superclass]:
+ if self.subclass_uri == str(p):
+ found = True
+ classes.append(o)
+ superclass = o
+ if not found:
+ break
+ return classes
+
+ def is_instance(self, (subj, pred, obj)):
+ """helper, returns the class type of subj"""
+ for s,p,o in self.graph:
+ if s == subj and str(p) == self.type_uri:
+ return o
+ return None
+
+ def field_name(self, uri):
+ """helper, returns the name of an attribute (without namespace prefix)"""
+ uri = str(uri)
+ parts = uri.split('#')
+ if len(parts) == 1:
+ return uri.split('/')[-1]
+ return parts[-1]
+
+ def namespace_from_uri(self, uri):
+ """returns the expanded namespace prefix of a uri"""
+ uri = str(uri)
+ parts = uri.split('#')
+ if len(parts) == 1:
+ return "%s/" % '/'.join(uri.split('/')[:-1])
+ return "%s#" % '#'.join(parts[:-1])
+
80 mrSchemato/parsely_page.py
@@ -0,0 +1,80 @@
+from lxml import etree
+from lepl.apps.rfc3696 import HttpUrl
+
+from StringIO import StringIO
+import json
+import urllib
+import re
+from HTMLParser import HTMLParser
+
+from errors import _error
+
+PARSELY_PAGE_SCHEMA = "http://parsely.com/parsely_page_schema.html"
+
+class ParselyPageValidator(object):
+ def __init__(self):
+ self.stdref = self.get_standard()
+ self.url_validator = HttpUrl()
+ return super(ParselyPageValidator, self).__init__()
+
+ def get_standard(self):
+ """get list of allowed parameters"""
+ text = urllib.urlopen(PARSELY_PAGE_SCHEMA).read()
+ tree = etree.parse(StringIO(text))
+ stdref = tree.xpath("//tbody/tr/td[1]/text()")
+ return stdref
+
+ def _get_parselypage(self, doc_lines):
+ """related to the <meta name="parsely-page"> tag, used as the default impl"""
+ h_parser = HTMLParser()
+
+ meta = [a[0] for a in doc_lines if "parsely-page" in a[0]]
+ if not meta:
+ return None
+ meta = meta[0]
+
+ pagemeta = [a for a in meta.split('<') if "parsely-page" in a]
+ if not pagemeta:
+ return None
+ pagemeta = pagemeta[0]
+
+ pagemeta = re.search('{.*?}', pagemeta).group(0)
+ if not pagemeta:
+ return None
+
+ try:
+ pagemeta = json.loads(pagemeta)
+ except ValueError,e:
+ raise ValueError("Error loading parsely-page data: %s" % e)
+
+ for k in pagemeta.keys():
+ if pagemeta[k] and type(pagemeta[k]) is not int:
+ pagemeta[k] = h_parser.unescape(pagemeta[k])
+
+ return pagemeta
+
+ def validate(self, text, doc_lines):
+ errors = []
+
+ try:
+ self.parsely_page = self._get_parselypage(doc_lines)
+ except IndexError, ValueError:
+ return [_error("Failed to parse parsely-page content", doc_lines=doc_lines)]
+
+ if self.parsely_page:
+ for key in self.parsely_page.keys():
+ err = self.check_key(key, doc_lines)
+ if err:
+ errors.append(err)
+
+ return errors
+
+ def check_key(self, key, doc_lines):
+ if key not in self.stdref:
+ return _error("{0} - invalid parsely-page field", key,
+ doc_lines=doc_lines)
+ if key in ["link", "image_url"]:
+ if not self.url_validator(self.parsely_page[key]):
+ return _error("{0} - invalid url for field '{1}'", self.parsely_page[key], key,
+ doc_lines=doc_lines)
+ return None
13 mrSchemato/settings.py
@@ -0,0 +1,13 @@
+RNEWS_ROOT = "http://iptc.org/std/rNews/2011-10-07#"
+SCHEMA_ROOT = "http://schema.org/"
+OG_ROOT = "http://ogp.me/ns#"
+OG_ALT_ROOT = "http://opengraphprotocol.org/schema/"
+RDFA_NAMESPACES = [RNEWS_ROOT, OG_ROOT, OG_ALT_ROOT]
+MICRODATA_NAMESPACES = [SCHEMA_ROOT]
+
+COMMON_PREFIXES = ['og:', 'rnews:']
+
+ns2ont = {RNEWS_ROOT: "http://dev.iptc.org/files/rNews/rnews_1.0_draft3_rdfxml.owl",
+ SCHEMA_ROOT: "http://schema.org/docs/schema_org_rdfa.html",
+ OG_ROOT: "http://ogp.me/ns/ogp.me.ttl",
+ OG_ALT_ROOT: "http://ogp.me/ns/ogp.me.ttl"}
8 prod_server.py
@@ -0,0 +1,8 @@
+from tornado.wsgi import WSGIContainer
+from tornado.httpserver import HTTPServer
+from tornado.ioloop import IOLoop
+from schemato_web import app
+
+http_server = HTTPServer(WSGIContainer(app))
+http_server.listen(80, address='0.0.0.0')
+IOLoop.instance().start()
8 requirements.txt
@@ -0,0 +1,8 @@
+#pyRdfa - clone and install
+#pyMicrodata - clone and install
+rdflib
+# httpheader steal from Paste
+flask
+flask-celery
+lepl
+tornado
64 schemato_web.py
@@ -0,0 +1,64 @@
+from flask import Flask, jsonify, render_template, request
+from flask_celery import Celery
+import os
+import re
+from collections import defaultdict
+import json
+
+parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+os.sys.path.insert(0,parentdir)
+
+from mrSchemato import Validator
+
+def create_app():
+ return Flask("mrschemato")
+
+app = create_app()
+app.config.from_pyfile('schemato_config.py')
+celery = Celery(app)
+
+@celery.task(name="mrschemato.validate_task")
+def validate_task(url):
+ v = Validator()
+ try:
+ res = v.validate(url)
+ except Exception, e:
+ print e
+ res = {'msg': e.message}
+ return res
+
+
+@app.route('/')
+def main():
+ try:
+ return render_template('index.html')
+ except Exception, e:
+ print "main: Erorr: %s" % e
+
+@app.route('/validate', methods=['GET', 'POST'])
+def validate():
+ try:
+ res = validate_task.apply_async(args=[request.form['link']])
+ status_url = "/status/%s" % (res.task_id,)
+ return jsonify({
+ "url": status_url
+ })
+ except Exception, e:
+ print "validate: error: %s" % e
+
+@app.route('/status/<task_id>', methods=['GET'])
+def status(task_id):
+ if validate_task.AsyncResult(task_id).ready():
+ retval = jsonify({
+ "status": "DONE",
+ "data": validate_task.AsyncResult(task_id).get()
+ })
+ else:
+ retval = jsonify({
+ "status": "WORKING"
+ })
+ return retval
+
+if __name__ == "__main__":
+ print "python manage.py celeryd -l info -E"
+ app.run()
1,040 static/bootstrap/css/bootstrap-responsive.css
@@ -0,0 +1,1040 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+ *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.clearfix:after {
+ clear: both;
+}
+
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+
+.visible-phone {
+ display: none !important;
+}
+
+.visible-tablet {
+ display: none !important;
+}
+
+.hidden-desktop {
+ display: none !important;
+}
+
+.visible-desktop {
+ display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+ .visible-desktop {
+ display: none !important ;
+ }
+ .visible-tablet {
+ display: inherit !important;
+ }
+ .hidden-tablet {
+ display: none !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .hidden-desktop {
+ display: inherit !important;
+ }
+ .visible-desktop {
+ display: none !important;
+ }
+ .visible-phone {
+ display: inherit !important;
+ }
+ .hidden-phone {
+ display: none !important;
+ }
+}
+
+@media (min-width: 1200px) {
+ .row {
+ margin-left: -30px;
+ *zoom: 1;
+ }
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ margin-left: 30px;
+ }
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 1170px;
+ }
+ .span12 {
+ width: 1170px;
+ }
+ .span11 {
+ width: 1070px;
+ }
+ .span10 {
+ width: 970px;
+ }
+ .span9 {
+ width: 870px;
+ }
+ .span8 {
+ width: 770px;
+ }
+ .span7 {
+ width: 670px;
+ }
+ .span6 {
+ width: 570px;
+ }
+ .span5 {
+ width: 470px;
+ }
+ .span4 {
+ width: 370px;
+ }
+ .span3 {
+ width: 270px;
+ }
+ .span2 {
+ width: 170px;
+ }
+ .span1 {
+ width: 70px;
+ }
+ .offset12 {
+ margin-left: 1230px;
+ }
+ .offset11 {
+ margin-left: 1130px;
+ }
+ .offset10 {
+ margin-left: 1030px;
+ }
+ .offset9 {
+ margin-left: 930px;
+ }
+ .offset8 {
+ margin-left: 830px;
+ }
+ .offset7 {
+ margin-left: 730px;
+ }
+ .offset6 {
+ margin-left: 630px;
+ }
+ .offset5 {
+ margin-left: 530px;
+ }
+ .offset4 {
+ margin-left: 430px;
+ }
+ .offset3 {
+ margin-left: 330px;
+ }
+ .offset2 {
+ margin-left: 230px;
+ }
+ .offset1 {
+ margin-left: 130px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.564102564102564%;
+ *margin-left: 2.5109110747408616%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+ .row-fluid .span11 {
+ width: 91.45299145299145%;
+ *width: 91.39979996362975%;
+ }
+ .row-fluid .span10 {
+ width: 82.90598290598291%;
+ *width: 82.8527914166212%;
+ }
+ .row-fluid .span9 {
+ width: 74.35897435897436%;
+ *width: 74.30578286961266%;
+ }
+ .row-fluid .span8 {
+ width: 65.81196581196582%;
+ *width: 65.75877432260411%;
+ }
+ .row-fluid .span7 {
+ width: 57.26495726495726%;
+ *width: 57.21176577559556%;
+ }
+ .row-fluid .span6 {
+ width: 48.717948717948715%;
+ *width: 48.664757228587014%;
+ }
+ .row-fluid .span5 {
+ width: 40.17094017094017%;
+ *width: 40.11774868157847%;
+ }
+ .row-fluid .span4 {
+ width: 31.623931623931625%;
+ *width: 31.570740134569924%;
+ }
+ .row-fluid .span3 {
+ width: 23.076923076923077%;
+ *width: 23.023731587561375%;
+ }
+ .row-fluid .span2 {
+ width: 14.52991452991453%;
+ *width: 14.476723040552828%;
+ }
+ .row-fluid .span1 {
+ width: 5.982905982905983%;
+ *width: 5.929714493544281%;
+ }
+ .row-fluid .offset12 {
+ margin-left: 105.12820512820512%;
+ *margin-left: 105.02182214948171%;
+ }
+ .row-fluid .offset12:first-child {
+ margin-left: 102.56410256410257%;
+ *margin-left: 102.45771958537915%;
+ }
+ .row-fluid .offset11 {
+ margin-left: 96.58119658119658%;
+ *margin-left: 96.47481360247316%;
+ }
+ .row-fluid .offset11:first-child {
+ margin-left: 94.01709401709402%;
+ *margin-left: 93.91071103837061%;
+ }
+ .row-fluid .offset10 {
+ margin-left: 88.03418803418803%;
+ *margin-left: 87.92780505546462%;
+ }
+ .row-fluid .offset10:first-child {
+ margin-left: 85.47008547008548%;
+ *margin-left: 85.36370249136206%;
+ }
+ .row-fluid .offset9 {
+ margin-left: 79.48717948717949%;
+ *margin-left: 79.38079650845607%;
+ }
+ .row-fluid .offset9:first-child {
+ margin-left: 76.92307692307693%;
+ *margin-left: 76.81669394435352%;
+ }
+ .row-fluid .offset8 {
+ margin-left: 70.94017094017094%;
+ *margin-left: 70.83378796144753%;
+ }
+ .row-fluid .offset8:first-child {
+ margin-left: 68.37606837606839%;
+ *margin-left: 68.26968539734497%;
+ }
+ .row-fluid .offset7 {
+ margin-left: 62.393162393162385%;
+ *margin-left: 62.28677941443899%;
+ }
+ .row-fluid .offset7:first-child {
+ margin-left: 59.82905982905982%;
+ *margin-left: 59.72267685033642%;
+ }
+ .row-fluid .offset6 {
+ margin-left: 53.84615384615384%;
+ *margin-left: 53.739770867430444%;
+ }
+ .row-fluid .offset6:first-child {
+ margin-left: 51.28205128205128%;
+ *margin-left: 51.175668303327875%;
+ }
+ .row-fluid .offset5 {
+ margin-left: 45.299145299145295%;
+ *margin-left: 45.1927623204219%;
+ }
+ .row-fluid .offset5:first-child {
+ margin-left: 42.73504273504273%;
+ *margin-left: 42.62865975631933%;
+ }
+ .row-fluid .offset4 {
+ margin-left: 36.75213675213675%;
+ *margin-left: 36.645753773413354%;
+ }
+ .row-fluid .offset4:first-child {
+ margin-left: 34.18803418803419%;
+ *margin-left: 34.081651209310785%;
+ }
+ .row-fluid .offset3 {
+ margin-left: 28.205128205128204%;
+ *margin-left: 28.0987452264048%;
+ }
+ .row-fluid .offset3:first-child {
+ margin-left: 25.641025641025642%;
+ *margin-left: 25.53464266230224%;
+ }
+ .row-fluid .offset2 {
+ margin-left: 19.65811965811966%;
+ *margin-left: 19.551736679396257%;
+ }
+ .row-fluid .offset2:first-child {
+ margin-left: 17.094017094017094%;
+ *margin-left: 16.98763411529369%;
+ }
+ .row-fluid .offset1 {
+ margin-left: 11.11111111111111%;
+ *margin-left: 11.004728132387708%;
+ }
+ .row-fluid .offset1:first-child {
+ margin-left: 8.547008547008547%;
+ *margin-left: 8.440625568285142%;
+ }
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 30px;
+ }
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 1156px;
+ }
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 1056px;
+ }
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 956px;
+ }
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 856px;
+ }
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 756px;
+ }
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 656px;
+ }
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 556px;
+ }
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 456px;
+ }
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 356px;
+ }
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 256px;
+ }
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 156px;
+ }
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 56px;
+ }
+ .thumbnails {
+ margin-left: -30px;
+ }
+ .thumbnails > li {
+ margin-left: 30px;
+ }
+ .row-fluid .thumbnails {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+ .row {
+ margin-left: -20px;
+ *zoom: 1;
+ }
+ .row:before,
+ .row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row:after {
+ clear: both;
+ }
+ [class*="span"] {
+ float: left;
+ margin-left: 20px;
+ }
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container {
+ width: 724px;
+ }
+ .span12 {
+ width: 724px;
+ }
+ .span11 {
+ width: 662px;
+ }
+ .span10 {
+ width: 600px;
+ }
+ .span9 {
+ width: 538px;
+ }
+ .span8 {
+ width: 476px;
+ }
+ .span7 {
+ width: 414px;
+ }
+ .span6 {
+ width: 352px;
+ }
+ .span5 {
+ width: 290px;
+ }
+ .span4 {
+ width: 228px;
+ }
+ .span3 {
+ width: 166px;
+ }
+ .span2 {
+ width: 104px;
+ }
+ .span1 {
+ width: 42px;
+ }
+ .offset12 {
+ margin-left: 764px;
+ }
+ .offset11 {
+ margin-left: 702px;
+ }
+ .offset10 {
+ margin-left: 640px;
+ }
+ .offset9 {
+ margin-left: 578px;
+ }
+ .offset8 {
+ margin-left: 516px;
+ }
+ .offset7 {
+ margin-left: 454px;
+ }
+ .offset6 {
+ margin-left: 392px;
+ }
+ .offset5 {
+ margin-left: 330px;
+ }
+ .offset4 {
+ margin-left: 268px;
+ }
+ .offset3 {
+ margin-left: 206px;
+ }
+ .offset2 {
+ margin-left: 144px;
+ }
+ .offset1 {
+ margin-left: 82px;
+ }
+ .row-fluid {
+ width: 100%;
+ *zoom: 1;
+ }
+ .row-fluid:before,
+ .row-fluid:after {
+ display: table;
+ line-height: 0;
+ content: "";
+ }
+ .row-fluid:after {
+ clear: both;
+ }
+ .row-fluid [class*="span"] {
+ display: block;
+ float: left;
+ width: 100%;
+ min-height: 30px;
+ margin-left: 2.7624309392265194%;
+ *margin-left: 2.709239449864817%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .row-fluid [class*="span"]:first-child {
+ margin-left: 0;
+ }
+ .row-fluid .span12 {
+ width: 100%;
+ *width: 99.94680851063829%;
+ }
+ .row-fluid .span11 {
+ width: 91.43646408839778%;
+ *width: 91.38327259903608%;
+ }
+ .row-fluid .span10 {
+ width: 82.87292817679558%;
+ *width: 82.81973668743387%;
+ }
+ .row-fluid .span9 {
+ width: 74.30939226519337%;
+ *width: 74.25620077583166%;
+ }
+ .row-fluid .span8 {
+ width: 65.74585635359117%;
+ *width: 65.69266486422946%;
+ }
+ .row-fluid .span7 {
+ width: 57.18232044198895%;
+ *width: 57.12912895262725%;
+ }
+ .row-fluid .span6 {
+ width: 48.61878453038674%;
+ *width: 48.56559304102504%;
+ }
+ .row-fluid .span5 {
+ width: 40.05524861878453%;
+ *width: 40.00205712942283%;
+ }
+ .row-fluid .span4 {
+ width: 31.491712707182323%;
+ *width: 31.43852121782062%;
+ }
+ .row-fluid .span3 {
+ width: 22.92817679558011%;
+ *width: 22.87498530621841%;
+ }
+ .row-fluid .span2 {
+ width: 14.3646408839779%;
+ *width: 14.311449394616199%;
+ }
+ .row-fluid .span1 {
+ width: 5.801104972375691%;
+ *width: 5.747913483013988%;
+ }
+ .row-fluid .offset12 {
+ margin-left: 105.52486187845304%;
+ *margin-left: 105.41847889972962%;
+ }
+ .row-fluid .offset12:first-child {
+ margin-left: 102.76243093922652%;
+ *margin-left: 102.6560479605031%;
+ }
+ .row-fluid .offset11 {
+ margin-left: 96.96132596685082%;
+ *margin-left: 96.8549429881274%;
+ }
+ .row-fluid .offset11:first-child {
+ margin-left: 94.1988950276243%;
+ *margin-left: 94.09251204890089%;
+ }
+ .row-fluid .offset10 {
+ margin-left: 88.39779005524862%;
+ *margin-left: 88.2914070765252%;
+ }
+ .row-fluid .offset10:first-child {
+ margin-left: 85.6353591160221%;
+ *margin-left: 85.52897613729868%;
+ }
+ .row-fluid .offset9 {
+ margin-left: 79.8342541436464%;
+ *margin-left: 79.72787116492299%;
+ }
+ .row-fluid .offset9:first-child {
+ margin-left: 77.07182320441989%;
+ *margin-left: 76.96544022569647%;
+ }
+ .row-fluid .offset8 {
+ margin-left: 71.2707182320442%;
+ *margin-left: 71.16433525332079%;
+ }
+ .row-fluid .offset8:first-child {
+ margin-left: 68.50828729281768%;
+ *margin-left: 68.40190431409427%;
+ }
+ .row-fluid .offset7 {
+ margin-left: 62.70718232044199%;
+ *margin-left: 62.600799341718584%;
+ }
+ .row-fluid .offset7:first-child {
+ margin-left: 59.94475138121547%;
+ *margin-left: 59.838368402492065%;
+ }
+ .row-fluid .offset6 {
+ margin-left: 54.14364640883978%;
+ *margin-left: 54.037263430116376%;
+ }
+ .row-fluid .offset6:first-child {
+ margin-left: 51.38121546961326%;
+ *margin-left: 51.27483249088986%;
+ }
+ .row-fluid .offset5 {
+ margin-left: 45.58011049723757%;
+ *margin-left: 45.47372751851417%;
+ }
+ .row-fluid .offset5:first-child {
+ margin-left: 42.81767955801105%;
+ *margin-left: 42.71129657928765%;
+ }
+ .row-fluid .offset4 {
+ margin-left: 37.01657458563536%;
+ *margin-left: 36.91019160691196%;
+ }
+ .row-fluid .offset4:first-child {
+ margin-left: 34.25414364640884%;
+ *margin-left: 34.14776066768544%;
+ }
+ .row-fluid .offset3 {
+ margin-left: 28.45303867403315%;
+ *margin-left: 28.346655695309746%;
+ }
+ .row-fluid .offset3:first-child {
+ margin-left: 25.69060773480663%;
+ *margin-left: 25.584224756083227%;
+ }
+ .row-fluid .offset2 {
+ margin-left: 19.88950276243094%;
+ *margin-left: 19.783119783707537%;
+ }
+ .row-fluid .offset2:first-child {
+ margin-left: 17.12707182320442%;
+ *margin-left: 17.02068884448102%;
+ }
+ .row-fluid .offset1 {
+ margin-left: 11.32596685082873%;
+ *margin-left: 11.219583872105325%;
+ }
+ .row-fluid .offset1:first-child {
+ margin-left: 8.56353591160221%;
+ *margin-left: 8.457152932878806%;
+ }
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 20px;
+ }
+ input.span12,
+ textarea.span12,
+ .uneditable-input.span12 {
+ width: 710px;
+ }
+ input.span11,
+ textarea.span11,
+ .uneditable-input.span11 {
+ width: 648px;
+ }
+ input.span10,
+ textarea.span10,
+ .uneditable-input.span10 {
+ width: 586px;
+ }
+ input.span9,
+ textarea.span9,
+ .uneditable-input.span9 {
+ width: 524px;
+ }
+ input.span8,
+ textarea.span8,
+ .uneditable-input.span8 {
+ width: 462px;
+ }
+ input.span7,
+ textarea.span7,
+ .uneditable-input.span7 {
+ width: 400px;
+ }
+ input.span6,
+ textarea.span6,
+ .uneditable-input.span6 {
+ width: 338px;
+ }
+ input.span5,
+ textarea.span5,
+ .uneditable-input.span5 {
+ width: 276px;
+ }
+ input.span4,
+ textarea.span4,
+ .uneditable-input.span4 {
+ width: 214px;
+ }
+ input.span3,
+ textarea.span3,
+ .uneditable-input.span3 {
+ width: 152px;
+ }
+ input.span2,
+ textarea.span2,
+ .uneditable-input.span2 {
+ width: 90px;
+ }
+ input.span1,
+ textarea.span1,
+ .uneditable-input.span1 {
+ width: 28px;
+ }
+}
+
+@media (max-width: 767px) {
+ body {
+ padding-right: 20px;
+ padding-left: 20px;
+ }
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ margin-right: -20px;
+ margin-left: -20px;
+ }
+ .container-fluid {
+ padding: 0;
+ }
+ .dl-horizontal dt {
+ float: none;
+ width: auto;
+ clear: none;
+ text-align: left;
+ }
+ .dl-horizontal dd {
+ margin-left: 0;
+ }
+ .container {
+ width: auto;
+ }
+ .row-fluid {
+ width: 100%;
+ }
+ .row,
+ .thumbnails {
+ margin-left: 0;
+ }
+ .thumbnails > li {
+ float: none;
+ margin-left: 0;
+ }
+ [class*="span"],
+ .row-fluid [class*="span"] {
+ display: block;
+ float: none;
+ width: auto;
+ margin-left: 0;
+ }
+ .span12,
+ .row-fluid .span12 {
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .input-large,
+ .input-xlarge,
+ .input-xxlarge,
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ display: block;
+ width: 100%;
+ min-height: 30px;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+ .input-prepend input,
+ .input-append input,
+ .input-prepend input[class*="span"],
+ .input-append input[class*="span"] {
+ display: inline-block;
+ width: auto;
+ }
+ .modal {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ left: 20px;
+ width: auto;
+ margin: 0;
+ }
+ .modal.fade.in {
+ top: auto;
+ }
+}
+
+@media (max-width: 480px) {
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0);
+ }
+ .page-header h1 small {
+ display: block;
+ line-height: 20px;
+ }
+ input[type="checkbox"],
+ input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+ .form-horizontal .control-group > label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+ .form-horizontal .controls {
+ margin-left: 0;
+ }
+ .form-horizontal .control-list {
+ padding-top: 0;
+ }
+ .form-horizontal .form-actions {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+ .modal {
+ top: 10px;
+ right: 10px;
+ left: 10px;
+ }
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+ .carousel-caption {
+ position: static;
+ }
+}
+
+@media (max-width: 979px) {
+ body {
+ padding-top: 0;
+ }
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ position: static;
+ }
+ .navbar-fixed-top {
+ margin-bottom: 20px;
+ }
+ .navbar-fixed-bottom {
+ margin-top: 20px;
+ }
+ .navbar-fixed-top .navbar-inner,
+ .navbar-fixed-bottom .navbar-inner {
+ padding: 5px;
+ }
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+ .navbar .brand {
+ padding-right: 10px;
+ padding-left: 10px;
+ margin: 0 0 0 -5px;
+ }
+ .nav-collapse {
+ clear: both;
+ }
+ .nav-collapse .nav {
+ float: none;
+ margin: 0 0 10px;
+ }
+ .nav-collapse .nav > li {
+ float: none;
+ }
+ .nav-collapse .nav > li > a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > .divider-vertical {
+ display: none;
+ }
+ .nav-collapse .nav .nav-header {
+ color: #555555;
+ text-shadow: none;
+ }
+ .nav-collapse .nav > li > a,
+ .nav-collapse .dropdown-menu a {
+ padding: 9px 15px;
+ font-weight: bold;
+ color: #555555;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ }
+ .nav-collapse .btn {
+ padding: 4px 10px 4px;
+ font-weight: normal;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ }
+ .nav-collapse .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > li > a:hover,
+ .nav-collapse .dropdown-menu a:hover {
+ background-color: #f2f2f2;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a:hover,
+ .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+ background-color: #111111;
+ }
+ .nav-collapse.in .btn-group {
+ padding: 0;
+ margin-top: 5px;
+ }
+ .nav-collapse .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ display: block;
+ float: none;
+ max-width: none;
+ padding: 0;
+ margin: 0 15px;
+ background-color: transparent;
+ border: none;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ }
+ .nav-collapse .dropdown-menu:before,
+ .nav-collapse .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .dropdown-menu .divider {
+ display: none;
+ }
+ .nav-collapse .navbar-form,
+ .nav-collapse .navbar-search {
+ float: none;
+ padding: 10px 15px;
+ margin: 10px 0;
+ border-top: 1px solid #f2f2f2;
+ border-bottom: 1px solid #f2f2f2;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+ }
+ .navbar .nav-collapse .nav.pull-right {
+ float: none;
+ margin-left: 0;
+ }
+ .nav-collapse,
+ .nav-collapse.collapse {
+ height: 0;
+ overflow: hidden;
+ }
+ .navbar .btn-navbar {
+ display: block;
+ }
+ .navbar-static .navbar-inner {
+ padding-right: 10px;
+ padding-left: 10px;
+ }
+}
+
+@media (min-width: 980px) {
+ .nav-collapse.collapse {
+ height: auto !important;
+ overflow: visible !important;
+ }
+}
9 static/bootstrap/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#555;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
5,624 static/bootstrap/css/bootstrap.css
5,624 additions, 0 deletions not shown
9 static/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-righ