From 824aed84f8050ecf5372725495114b24806c1f80 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 Aug 2015 00:19:46 -0400 Subject: [PATCH] Blog Page d acceuil et autre modif mineur --- blog/migrations/0001_initial.pyc | Bin 1057 -> 1085 bytes blog/migrations/__init__.pyc | Bin 140 -> 154 bytes blog/templates/blog/index.html | 21 +- blog/views.py | 5 +- member/migrations/0001_initial.pyc | Bin 1049 -> 1077 bytes member/migrations/0002_auto_20150616_2213.pyc | Bin 958 -> 986 bytes member/migrations/0003_auto_20150721_1829.pyc | Bin 955 -> 983 bytes member/migrations/__init__.pyc | Bin 142 -> 156 bytes member/templates/member/index.html | 2 +- project/migrations/0001_initial.pyc | Bin 1280 -> 1308 bytes project/migrations/__init__.pyc | Bin 143 -> 157 bytes static/css/freelancer.css | 6 +- static/css/projet.css | 7 +- static/css/reset.css | 0 static/css/style.css | 145 +- static/css/timeline.css | 218 +++ static/css/timeline2.css | 473 ++++++ static/img/MTLGJ_logo.png | Bin 0 -> 31567 bytes static/js/timeline.js | 26 + static/js/timelinemod.js | 1406 +++++++++++++++++ templates/index.html | 25 + templates/template.html | 7 +- 22 files changed, 2316 insertions(+), 25 deletions(-) create mode 100644 static/css/reset.css create mode 100644 static/css/timeline.css create mode 100644 static/css/timeline2.css create mode 100644 static/img/MTLGJ_logo.png create mode 100644 static/js/timeline.js create mode 100644 static/js/timelinemod.js diff --git a/blog/migrations/0001_initial.pyc b/blog/migrations/0001_initial.pyc index 4860cd2ee66cfac9c8d9bb09e29e641511682d1e..efbc348000dec96b76f3c33f6bfb698b6375ea7f 100644 GIT binary patch delta 146 zcmZ3;v6q9L`7?oNV*TX&ysXlqRQ;r! c{B-@?%=DtflFa~wfV}*?tkR;? e;>?oN7%-8Plb;@wo0(peSdy8aR~$1jTM+2A!{fU)|0H;J2H~;_u diff --git a/blog/templates/blog/index.html b/blog/templates/blog/index.html index 7085ad9..c0770c0 100644 --- a/blog/templates/blog/index.html +++ b/blog/templates/blog/index.html @@ -1,7 +1,22 @@ {% extends 'template.html' %} - +{% load staticfiles %} {% block content %} -
-

blog

+
+ {%for article in articles%} +
+
+
+
+

{{article.title}}

+ {% if article.photo %} + + {% else %} + + {% endif %} +

{{ article.text|safe|truncatewords:50 }}

+ En savoir plus +
+
+ {%endfor%}
{% endblock %} diff --git a/blog/views.py b/blog/views.py index fd4b53f..b4db08e 100644 --- a/blog/views.py +++ b/blog/views.py @@ -1,5 +1,6 @@ from django.shortcuts import render - +from blog.models import * def index(request): - return render(request, 'blog/index.html', {}) + articles = Article.objects.all + return render(request, 'blog/index.html', {'articles':articles}) diff --git a/member/migrations/0001_initial.pyc b/member/migrations/0001_initial.pyc index 4add9495a663bb2f4b1163d820292f53f3b492b0..fbf6991e390c9b4485523ca7a6ff0ccc4b6bba33 100644 GIT binary patch delta 150 zcmbQqv6X|J`7V^fU5vQ}t7GGjme)i!)17i}jQ9^Rh~dQuT9F ebCXhw^m8-QixNvR^Ye=JCxej!DibO^PWf%FjwoE&=lL^Rh~d qQj0T7Qe(hGZfb5)YEevXW_nR#NoIatam?h?O#PG_AvJjkvlIZpraO87 delta 122 zcmcb`zK@-q`7{FNw+!z=b^fU5vQ}t7GGjme)i!)17i}jQ9^Rh~dQuT9F ebCXhw^m8-QixNvR^Ye=JC*Nf1CtcGrW)lD{QY)GO diff --git a/member/migrations/0003_auto_20150721_1829.pyc b/member/migrations/0003_auto_20150721_1829.pyc index bcf47f99b6a1381850a3d2b4cc6ea92828ba01ef..4bdaeac035b3a23b2b160a1cfda1c4df0b898077 100644 GIT binary patch delta 150 zcmdnZex042`7ej!DibO^PWf%FjwoE&=lL^Rh~d oQj0T7Qe(hGZfb5)YEevXW_nR#NoIatam?gPOs$j}(avlF0Mc_g`v3p{ delta 126 zcmcc4zMGw$`7E~vq7bTWt=I0gbPkzAEN{%L}$$Ocl0LJnx>;M1& diff --git a/member/migrations/__init__.pyc b/member/migrations/__init__.pyc index 092f019b191f93413b971bc917de88961468cf6c..9f9b8ea69944985c6e348f3805fc1f7cec425316 100644 GIT binary patch delta 81 zcmeBUoWsb@{F#^Q`=Rv{+0E=+85kIxtztrpQ;UjYl5~wfV}*?tkR;? g;>?oN7%-8Wnwykb6qB2oUX)mpnV(l2Gci{Y0H^OBtpET3 delta 67 zcmbQk*vH7u{F#?4e0IY`b~6KW1_lQGjQreG{nXsdoK*ed%#ze%{p9?-tkR-X{oK^t Wq|_q)+|2Z%#FEVXykh-{)rtVjcoyaW diff --git a/member/templates/member/index.html b/member/templates/member/index.html index f1e790b..3400a09 100644 --- a/member/templates/member/index.html +++ b/member/templates/member/index.html @@ -1,7 +1,7 @@ {% extends 'template.html' %} {% load staticfiles %} {% block content %} -
+
diff --git a/project/migrations/0001_initial.pyc b/project/migrations/0001_initial.pyc index 6131b4e813bc026f722825765d1f1b5f66ef7f83..c999873949eb7d01ebca53217c88595bb162ce04 100644 GIT binary patch delta 152 zcmZqRn#0A;{F#^Q`=Rw4*}pK`doeIDI9tVp7N-^!$0X;JCdCvKAwl9``Z95Y#mrHW!RuCr(Y01E>;XaE2J delta 124 zcmbQk)xgEh{F#@lWMRWb_AktaHVh05`WgATsrsq8nK`NY#hE3k#rnzld0C}Jsrm&) f`B|ySCHlFU=|zbpnfZCe`jf3#s>smwnMD%-RpKlG diff --git a/project/migrations/__init__.pyc b/project/migrations/__init__.pyc index 169781349d3e5e714d68cd53398ef7531cb06c5c..d7654dd9e316e533ee23d118ca80a7d14c196171 100644 GIT binary patch delta 82 zcmeBYoXg10{F#^Q`=Rv{+0E?T7#J9wtztrpQ;UjYl5~wfV}*?tkR;? c;>?oN7%%~qiOJ1OFG?)Q%+D*1nV6>t0Lld)F#rGn delta 68 zcmbQs*w4t${F#?4e?h}Ub~8f@1_lQGjQreG{nXsdoK*ed%#ze%{p9?-tkR-X{eq(W XtkmQZ{oKs-qQsKS{JdiQi8YD p + p { + margin-top: 5px; +} + +/** media queries **/ +@media (max-width: 991px) { + .timeline li .timeline-panel { + width: 44%; + } +} + +@media (max-width: 700px) { + .page-header h1 { font-size: 1.8em; } + + ul.timeline:before { + left: 40px; + } + + .tldate { width: 140px; } + + ul.timeline li .timeline-panel { + width: calc(100% - 90px); + width: -moz-calc(100% - 90px); + width: -webkit-calc(100% - 90px); + } + + ul.timeline li .tl-circ { + top: 22px; + left: 22px; + margin-left: 0; + + } + ul.timeline > li > .tldate { + margin: 0; + } + + ul.timeline > li > .timeline-panel { + float: right; + } + + ul.timeline > li > .timeline-panel:before { + border-left-width: 0; + border-right-width: 15px; + left: -15px; + right: auto; + } + + ul.timeline > li > .timeline-panel:after { + border-left-width: 0; + border-right-width: 14px; + left: -14px; + right: auto; + } +} \ No newline at end of file diff --git a/static/css/timeline2.css b/static/css/timeline2.css new file mode 100644 index 0000000..c69a1e2 --- /dev/null +++ b/static/css/timeline2.css @@ -0,0 +1,473 @@ +.cd-container { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.cd-container *, .cd-container *:after, .cd-container *:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.cd-container { + width:100%; + margin-left:10px; + margin-right:10px; + font-size: 100%; + font-family: "Droid Serif", serif; + color: #7f8c97; +} + +.cd-container a { + color: #acb7c0; + text-decoration: none; + font-family: "Open Sans", sans-serif; +} + +.cd-container img { + text-align:middle; + max-width: 100%; + max-height:300px; +} + +.cd-container h1, h2 { + font-family: "Open Sans", sans-serif; + font-weight: bold; +} + +/* -------------------------------- + +Modules - reusable parts of our design + +-------------------------------- */ +.cd-container { + /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */ + width: 100%; + margin: 0 auto; + max-width:100%; +} +.cd-container::after { + /* clearfix */ + content: ''; + display: table; + clear: both; +} + +/* -------------------------------- + +Main components + +-------------------------------- */ +.cd-container header { + height: 200px; + line-height: 200px; + text-align: center; + background: #303e49; +} +.cd-container header h1 { + color: white; + font-size: 18px; + font-size: 1.125rem; +} +@media only screen and (min-width: 1170px) { + .cd-container header { + height: 300px; + line-height: 300px; + } + .cd-container header h1 { + font-size: 24px; + font-size: 1.5rem; + } +} + +#cd-timeline { + position: relative; + padding: 2em 0; + width:100%; + /*margin-top: 2em; + margin-bottom: 2em;*/ +} +#cd-timeline::before { + /* this is the vertical line */ + content: ''; + position: relative; + top: 0; + left: 18px; + height: 100%; + width: 4px; + background: #d7e4ed; +} + +.cd-timeline-block { + position: relative; + margin: 2em 2em; +} +.cd-timeline-block:after { + content: ""; + display: table; + clear: both; +} +.cd-timeline-block:first-child { + margin-top: 0; +} +.cd-timeline-block:last-child { + margin-bottom: 0; +} +/*@media only screen and (min-width: 1170px) { + .cd-timeline-block { + margin: 4em 0; + } + .cd-timeline-block:first-child { + margin-top: 0; + } + .cd-timeline-block:last-child { + margin-bottom: 0; + } +}*/ + +.cd-timeline-img { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 40px; + border-radius: 50%; + box-shadow: 0 0 0 4px white, inset 0 2px 0 rgba(0, 0, 0, 0.08), 0 3px 0 4px rgba(0, 0, 0, 0.05); +} +.cd-timeline-img img { + display: block; + width: 24px; + height: 24px; + position: relative; + left: 50%; + top: 50%; + margin-left: -12px; + margin-top: -12px; +} +.cd-timeline-img.cd-picture { + background: #75ce66; +} +.cd-timeline-img.cd-movie { + background: #c03b44; +} +.cd-timeline-img.cd-location { + background: #f0ca45; +} +@media only screen and (min-width: 1170px) { + .cd-timeline-img { + width: 60px; + height: 60px; + left: 50%; + margin-left: -30px; + /* Force Hardware Acceleration in WebKit */ + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; + } + .cssanimations .cd-timeline-img.is-hidden { + visibility: hidden; + } + .cssanimations .cd-timeline-img.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-1 0.6s; + -moz-animation: cd-bounce-1 0.6s; + animation: cd-bounce-1 0.6s; + } +} + +@-webkit-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -webkit-transform: scale(0.5); + } + + 60% { + opacity: 1; + -webkit-transform: scale(1.2); + } + + 100% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes cd-bounce-1 { + 0% { + opacity: 0; + -moz-transform: scale(0.5); + } + + 60% { + opacity: 1; + -moz-transform: scale(1.2); + } + + 100% { + -moz-transform: scale(1); + } +} +@keyframes cd-bounce-1 { + 0% { + opacity: 0; + -webkit-transform: scale(0.5); + -moz-transform: scale(0.5); + -ms-transform: scale(0.5); + -o-transform: scale(0.5); + transform: scale(0.5); + } + + 60% { + opacity: 1; + -webkit-transform: scale(1.2); + -moz-transform: scale(1.2); + -ms-transform: scale(1.2); + -o-transform: scale(1.2); + transform: scale(1.2); + } + + 100% { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + -o-transform: scale(1); + transform: scale(1); + } +} +.cd-timeline-content { + position: relative; + margin-left: auto; + background: white; + border-radius: 0.25em; + padding: 1em; + box-shadow: 0 3px 0 #d7e4ed; +} +.cd-timeline-content:after { + content: ""; + display: table; + clear: both; +} +.cd-timeline-content h2 { + color: #303e49; +} +.cd-timeline-content p, .cd-timeline-content .cd-read-more, .cd-timeline-content .cd-date { + font-size: 13px; + font-size: 0.8125rem; +} +.cd-timeline-content .cd-read-more, .cd-timeline-content .cd-date { + display: inline-block; +} +.cd-timeline-content p { + margin: 1em 0; + line-height: 1.6; +} +.cd-timeline-content .cd-read-more { + float: right; + padding: .8em 1em; + background: #acb7c0; + color: white; + border-radius: 0.25em; +} +.no-touch .cd-timeline-content .cd-read-more:hover { + background-color: #bac4cb; +} +.cd-timeline-content .cd-date { + float: left; + padding: .8em 0; + opacity: .7; +} +.cd-timeline-content::before { + content: ''; + position: absolute; + top: 16px; + right: 100%; + height: 0; + width: 0; + border: 7px solid transparent; + border-right: 7px solid white; +} +@media only screen and (min-width: 768px) { + .cd-timeline-content h2 { + font-size: 20px; + font-size: 1.25rem; + } + .cd-timeline-content p { + font-size: 16px; + font-size: 1rem; + } + .cd-timeline-content .cd-read-more, .cd-timeline-content .cd-date { + font-size: 14px; + font-size: 0.875rem; + } +} +@media only screen and (min-width: 1170px) { + .cd-timeline-content { + margin-left: 0; + padding: 1.6em; + width: 45%; + } + .cd-timeline-content::before { + /*top: 24px;*/ + left: 100%; + border-color: transparent; + border-left-color: white; + } + .cd-timeline-content .cd-read-more { + float: left; + } + .cd-timeline-content .cd-date { + position: absolute; + width: 100%; + left: 122%; + top: 6px; + font-size: 16px; + font-size: 1rem; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content { + float: right; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content::before { + top: 24px; + left: auto; + right: 100%; + border-color: transparent; + border-right-color: white; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { + float: right; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { + left: auto; + right: 122%; + text-align: right; + } + .cssanimations .cd-timeline-content.is-hidden { + visibility: hidden; + } + .cssanimations .cd-timeline-content.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-2 0.6s; + -moz-animation: cd-bounce-2 0.6s; + animation: cd-bounce-2 0.6s; + } +} + +@media only screen and (min-width: 1170px) { + /* inverse bounce effect on even content blocks */ + .cssanimations .cd-timeline-block:nth-child(even) .cd-timeline-content.bounce-in { + -webkit-animation: cd-bounce-2-inverse 0.6s; + -moz-animation: cd-bounce-2-inverse 0.6s; + animation: cd-bounce-2-inverse 0.6s; + } +} +@-webkit-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -webkit-transform: translateX(-100px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(20px); + } + + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes cd-bounce-2 { + 0% { + opacity: 0; + -moz-transform: translateX(-100px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(20px); + } + + 100% { + -moz-transform: translateX(0); + } +} +@keyframes cd-bounce-2 { + 0% { + opacity: 0; + -webkit-transform: translateX(-100px); + -moz-transform: translateX(-100px); + -ms-transform: translateX(-100px); + -o-transform: translateX(-100px); + transform: translateX(-100px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(20px); + -moz-transform: translateX(20px); + -ms-transform: translateX(20px); + -o-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + -o-transform: translateX(0); + transform: translateX(0); + } +} +@-webkit-keyframes cd-bounce-2-inverse { + 0% { + opacity: 0; + -webkit-transform: translateX(100px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes cd-bounce-2-inverse { + 0% { + opacity: 0; + -moz-transform: translateX(100px); + } + + 60% { + opacity: 1; + -moz-transform: translateX(-20px); + } + + 100% { + -moz-transform: translateX(0); + } +} +@keyframes cd-bounce-2-inverse { + 0% { + opacity: 0; + -webkit-transform: translateX(100px); + -moz-transform: translateX(100px); + -ms-transform: translateX(100px); + -o-transform: translateX(100px); + transform: translateX(100px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-20px); + -moz-transform: translateX(-20px); + -ms-transform: translateX(-20px); + -o-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + -webkit-transform: translateX(0); + -moz-transform: translateX(0); + -ms-transform: translateX(0); + -o-transform: translateX(0); + transform: translateX(0); + } +} diff --git a/static/img/MTLGJ_logo.png b/static/img/MTLGJ_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3c08f616879587f2cfa6c71c132069a36ecbd87c GIT binary patch literal 31567 zcmYgX1yqzzwEuSLUO>7Q1W8d5B!wlUML-%U0a02&N?ex4f~6IaPM1bN%0*Err35J{ z1?iBkg*WT}y>p)DaNPZNzL|UP-1*&{$A$)4bkv;G5CqZbXlocl5D60e@l%q6CkTn5 zZ{R;FZ*5Co2%=#o{=uO140iC4!|$4f-%YPOegO_X&XB5;*KKE{j)#Mbv$3;-Q_%fR zXC(*<{;8v(Y7#iMGC`M|JoI|~=z6!}gfy!HHF?u-2~s8=MBgXM0W3!%m2In~_&n!> z@}JB;p4`LFzrNP_At!%MU+JaOxlYrX%{tG-q@Jtkay?EkUKvi|zGgwrAV#L=*_YMN z8f`ye8S~7)X6s47Er;b67cB*i9tG{9GuK_p3_hbv$|rYBYC>C1Pg`PMD+L+Dpy~<> zi5{^D{o<{ho-S*qU~#WndKT)a*GhU2_E8%p5}J08Ej~GA7CS9_bMmn8x60c4^hyEP z9G1;O?DTpd41!ZaNX^OxlOpr8jbiniQ#{X%7y5pYrA~Hnsgglp0_-bHe}O@Tu}OuQ zguS0}Rn@utl~U4V-e_{-uhVL+8*0~F=DyKzlF|l{JYmxZBq-{^<`C*65GexEmbx1V z%fp>>e|uS>q0gLIH+Z)0jD9c&Cxpa6sEq8Hvb%v^OwtzLP-nTsbDWCyzC59V5GW|y zc4VQHifdEzyR6?v`mcv?)O0Si!7&gVI-upUd9o=g*em{9Ao<@cX#JIA{1V z=LwM+du4CGRL@j%GWuXytji2U*zcqv5T4}eVNGNaHT}LiDYyTtg{`3n&mMf{u za+r}YCl6EPj6M^Q;o|N4fngC5Cy?)z;IK%a^TcOCG(6oyi?;M;@|fA6IV(3k2dDFG zFu)AbEiCWmYuh=CFR{=M%OZn{xNRwJA|dbmV$Zy(6~Ww?n(&wax#{!I$f0lOV!3Su1S3Tid~!|6tsp^3<=f?3 z)9pMZQU@NR!`rE^J!Zl9d6beSct*p)R(9N3*zm7PtoPR>#Rwe&Su^_g!@*io2&Lw} z53Ur@c$F9&h+d9UL1D?kq}thIl^nsvG;q3e{XPw$28Yo7J#t#9=R4*#3O;!F(x0|sbx$&hdzM8J5$$*9=Qu5jqyz=}PavRW+=?zhdjOhc^DKMcY*-& zB&Ftk{Y04o!YFUY0P?dvH>Q!Q5JrdFi4xFvbH=fO(^abICpBcBnCz^RbZ8X~Cq*E$ zKIGjr@+5<_d7UjgWc)v<*|xPW4SX~BNC6?qHoba#y71RfYnAZuX0mw6&ueB7^sv&J zl@f{4jG&02f_E^gTMNH8t2om8Qb=VR3xr%B5vA$5O-3q77H{zR4Fv?%I>|W67Zn4N z7wGsh?$ARR6$2v*7-`=brE|%iYoaX^AHkY^gA96JI14%$j5L;2xpA=XjTS{73_{r- z4feSb4*^$yB)#=N36cW|LOGrI*IXmzY;|C%Ios}R(|d#Hwj!ct};&wFg;=L2}h(Ci34yQC`;KQ-ZKLq?zfbZu;KB#4E^xHHxL?u8FG5~EMa>nc; zEfRw)ndblY=W0RyO8^s4LoIIm$2DJtkGZ5Y4s9{guhs>L5_>4cHe&gb3ks`(hhLn@ z)1zDUyM_nUZfuw2@Kgu0Qpyl(aK44%6^6hJ7 z5c4I^=GU$4lL+w>_iuzl(1$8@a6n?uD2*%v5o&yG`Xr z1aN}?XeJULrad~eT!H63ST2xWKHlmr(x5>`BGpI8o`N60Z13!RJ`5HecLgiA-m5qH zbFPEY47JIuBsam0%8lbuEZkk6s+fD9ujSO0EJ`bewaG}&JX?wZe7DBdPX_C`z32}L zg-Xx*CTDhKko^+~Qfbu3yr_N({YsULC^;e(E=gqpi{lWHxk&K!arP~0AU0A2&@#b4 z8#8TV>%N12rqgSME*o4A>_n9J|LLZpcNGs9UlL6?rYw&4>Ko!F>?n)k z;fQ_);$)v__-u%zF0Zc-qqFj~;_ukQK2h=85J{Z@M|$9!6?k=3KiRJT6oxFUO=&no ziKJvy4%YQr1*huOOA&nHfVk)fIELMcen_2?AA_{me~}$+unSICW#;2e@$_EUU0VK$ zlm-?`~-lkelPiIO=bQKI4*&3nR1dI-erXMu}`-;1k!C z4YocN|1MT%{XVHo9H;{{B)0j3z0A;DSRx_KeYtW1cXSkECe zUECJK;D)~e2oU_Fcs4&N2Z@;#4e2oRcBA5hZu$NCM727;Zj2^FMj@(GSA(dKK>{-o ztNt)Kz$?UYsYXhe1SU8xX5D(;9?;ySaWM4ak|VnXbkCx7x0w`M8WYd*gg9KktHJ^X z!(OVdyvzy{#LcMtTkpfp!djgRKgMhWm;DL4wZ{UCkBT>tdHb6Ml6yW;0XeZNIx?c9 zn3YHVQlst|0xH@@IG#d@96o(WMOzp$WIvJtP;TK=_zQa%9^0);6`Yd0$c@q@4i)w+ z`8tDw?n{RFrFgF05rmwg9mySTJWo6HS$SOx51BR&W#4@RIk2uM-{&M$3Jft?((^xa-C zdayEbsccWQz#RPSZK&nkLjl)r)YS=muy}{#EDZVd@aU*^N*Konao3ef?WxnY8DuJT zifAzK0WXX087Zc83?GW$Wx+m`Y%Km6Ne|Im1EUbk9(~sW_Lx_B;RrZwgqmvW|#ph3Eoi=3fWVuC!9ehVI*U+dvIq$6dd^xI`;~X?Ae4g=-7qSghCJ9gL#*To@1ZcA@yI zkSat~m~7FcD_ajv-sUHheJn2m>c|-v_tiz9(xVwHC6|HH&C-E0jPajHzRie&+lV|F z5QpS70G{3*&e?Cf0?SV@RSLzD6qKkVp$0ySKq_y|E+>Y@tlZzBf4=WRQ2}DdZy- zVi-(@90rHKwzl?CCFFfYw~7+!yeFbt0nM@l+EBNhdK%K9M8}ji2hW*W2uU=o05LI6 zb0?UOKgkhbAO@UuZJlzxs?BD2wblJ;Bqk&8m>M$f&+)nSB&8cN*3GB^a`0Ux>8Jsq z`o^(6?q16c(Ux2=2;R^lB@6&ZLv~mR)BGRsmZBlZ*BGw-+<4%YDcG|edgS_lm<#26 zE&Y1k*LkEfNqFmwvVxwhBFi`syu2tr_+T!rcCskh_WDbys1IZq??YX$8tN!DFI)6< za~a0_4+SK0xyg|_6_Fm$&T3C6ypLrQ0ow2tb#;}t!B%8|1|+g*O@!Kvn`yGj%oF=2xYLx3m2r;Is3 zg!&!er*kCQ1%E?Wh9#j4O`tz=&Zf==deD7R;Y<<~9rK*It`C2C{;H>2Jr!*j*X20%VNLwsuwbr zf8h)p=7$E`XCeTs(%e$X=-Xkz4&91?45y~2kzlv6*A05ZUeh5{NGvS~5X7ey&pY(b z1Y=lO--XEKbc-W#4ZBe5)ZgFj0A0Zwt+(XTVEKvr3h&my<5oZHWr?W5N3Y z%cmjY0=`h+i?tdB;*@_rHP9jp@`Z&nYYt)1^$yplo<7tm1!Mu#Mb^KoGD-MG;~8ZT zNd>bMfn7pY)BFe{p|~xZulM35z)lisXm?S(olzO?6{jeE|C`;t03kRvJGWP}q zhsMS@m(e{}_im9hLo0)}FV8Bry<|a{sX)j~aKcg;&aJGkGt>$QxP;#F>%T^eghskc zOc7~jC_o&BJ^z{O@&4bri~MsY^I4(j@4SrnoYGj%K$xKnE3*5y$s&gspo?0E8cxnY z*uO{i7m$gcoJzO-CF#`cmDR z3-#o4F6}LfVGv|M2wg2_Ne>~nhbY~MA9@gRjKHY5$QcEX5PP%o|DFHS?NzbZl>eK* z%Cdp__5`)IXow#W8U$fR6vTYp;M&Z%1`w`8826sCGO-VD1mDu#5+;7XLPHa!7Jr`M z&O7Ibn($>32!p9xHC%enCth3Yr+Cr(kWf~pYa?%6(%_qH^%hmqnZz!RoN|iuxDHj_ zApHJcx$&Fhy>M+6BdpA?8f_WTBJL&`2sH1G*9WPIvcXB}dJJQ@fDApIui*sy@8;?xoQs%v<-~`b(+)vE%2c z?s;*t#CvI*vm^)iy+kpk0++vbtb(xao4!;Q^_nYNgHh-w<)sX#4PHt}ftAT^A_wE@1C^rKdA%0q5dcw7v zfPa6w;-VscdTla#+Q=(WBD6M3)+;kz`B7s{*jm#Rp*;BabJ@~I&xUXLK5twseAQ#i zV!3m#;EKD{)^(w0KaZ;h#_5_7VJnB-#!y2Hlq(mASWBAzd$?R-&8EN^mEhZZ)%-c1 zN~UmcuG@l^%AwIg#b!Acs`i=FEi%(|3c>HStjqtkDAIqKyY}vP+;@Hr-HMa%S+7pN zFln5O&&PDVg`A$VP%sys2={?hiorgnTQIPBcg(FPl7TC=P#!!vniW zX{qyWt4Fareu~W4bxwC5akRH?Zg)74);05X!50c!)1}|_Vzp}ywi&2hKa)R` z2lPlG+&k9kH&dr4d#)(+^ZwMcRm^Gw417|ZNtWa9M@}7YVCYfmj1RU^kl6MOuRgO!2IqE&9+)QeM+WfC| z{>#poYZKW>^jGS(&#-@Rj6_|$fPZ~Og$di+K>S+z@$vt(uklp7rv zIscPEPV^~`top%49I{j1bU2HDyxyyR^S;Mq^XTIJ*Av4PUwBnACrPpyNIPB3aztTPGntnXhFxOSDr zim`hOjYWH1r=wY?f2Ac|Rh>ttTes-^{jcoo!8Y{23rJ8Eaa|cod@zlwLzqRU;x``s zCp8~;HgQkmY2Q57nwoh`iY<{3`UT6cULBUo^lCMTVc@%ipzXeWkn&tmzsVLYv;O>Y zx4=!&w#1}uf434iO7K9rv=uL70CEv3L?2~KewM^&RtOCo7Jv?q1 zqIQK8v~EaXObo2^54cGY6o%2C^IudM3fM5ozTZozK&!N|G1z((w_VD?191`wj)loQi4?J zy_>+{+Z3v52o`_=sOvG7<0$p?#`z$?fnQGst}FHmPxE$F5+zj)l!w=KPu%f8(uZtcHZ}45lU1=q zRBD1b@7oBS4MCBj5 z`e%{BoYveW&q12=8-*kt)R`&>)K4uAv+Ze3NGC4YPQK-kvHG~{h4XeObWt%zmK7zY zCwn>Q1mmusFWN>OzmdQV{8oU9UBio&4s9979Hk=obiW+q?~-%j@QdG_I8r-V5IrZT zKh6Z{?J*cP*cKSCNW)9;Br1@Pc43qa;tN zDBvtcB)wM^>U5`6z4%Jj>kfkHSDADJH+KG$1b%?20caJrFJsaKA_^7RRT-Xu?^vJ0 zXN75BT+!LbzGo0NSJ9nu{Cc0}_$ull28J0ZT^B@g^^mujT1G@mm2y;YEA zMb5~-UxU;RSbT(U6y-b=X?qjDiJK*fC8e`Wz|r%SCp*}LI2m47Iy5+B03ZfY_5Q6T z12kfevuV3S)t=3kt8#dy1>n>7G_w+p=vsDt=iDVlpl^52w+&dfz7L-#4@z!VMtH$T z#A<)bMS;27Y#*FzafV9x>|HiQ`g*xy;J%iEUgbZgwGIyt12=Jo=#&uXZ&yW6I!5@6+Bt)aVzcsFmh^nL zC!2$ocE`OKwrdN!E8rF3#2`4T;e9GG98zSNGe?zkUkx_lQS^TnR-BGFJNmcWhM+wL zBH{{=AAR`csPIOXE!ypi$${xz>1-0p@;s^edZ008Dpl^4^+k+FRrh8e0MojbiZI9TV*bz-iL zI(MyaZ{_P&a*|>1@MYQQ7oO(LXzRby1qW#G&k3k|Rn4~0E*GTP<{pd9Kmu<9@VbpK z8#7tgSG{h)l`2|0N)p4nx-LEd%AP@wv{7Q{Xj00IUh90wk(xok%m&Vx50DshDJP13 zNLK;Qc5lP}uczJP+dqh^Nd77FsGS=5`L+=+O0ky&>lGx~mPmCekso*67(GWeDeaGE zQmq@^Icm=Ds^CoA#C0ZtP1hK*?SvLd5!Vh_3{&@%vCXLtoss*`WhbY}un4c(5?hjB zV^s|^8K(zlW5=XQs|wlyVql)droeuYVuCy1fCAg46YGwr$(D#G0zs`)G6_P&muY4bx+H68Ld-|YV`i5F|H z(_s^nSv3YnkhpFFoN{~}u6&_5mG!~N!8{J+$3)UxB4!Kz$t5U;;YWF;PzyB^(1x+E zdXhRV$GV#HBelccmtcK5b-!PySU^S~oS}QpEpL21U0TP+`vY0S7{B<1f1+~R`tz;G zK>0@FdfQnXdv!YF=kWU;X3u_mNiI&`hG$#nOG&^f?XfH2XPMKKc4B57SR%ps*FG3J zAspREv6G?ZITxY*Vl}|+_35jrLghHGXWTh;JNQmAGE}|xOXT*m;(w>0^06F3E%Q*F zoSa;Wum$*+08r<(hs)>e%i9jks7B{0yxf#io>JHyw18tYX~afb-T#rDFk7Iap<9`M zMjS`9nC58H3R2u5Eh0%(@ay9I&POfL6r6)-{O>p_4`OmX5&@ly>>&r`QHOJf>a)ro ziE~mC0HV(}y#YAh@;*1;Oj#p&HQ>f*<)xkbNu_ze`roxB$F6f-DQ}vZtS170KYw|Z^81ln%XX+qg^!?3I7|Jp*iPTiN&g=&;F!y> zeB<9TN%zUOAAjc);QvCyQ=Kk=6T2earTT3ZT(3(J^l6h=@3AvtWn6= z20awpiDZ(;m~>Sb^R-hIkx)8YK(sG7>KFu9^b4L|BH!LRR2PhmTx2M*`HMwJp^pQ_ z(S;JJ4x`5J1#Z1^KT}e!E};HAZ!T8bzxB z6Ea^#V={a@<{78VQt4i8{rG*&yFa=rouu5=4^m1)I=alu;^N}IKCdrcJKY!$9_|`q zaIic`@lfT2V382qLc>heNk+qe>YjAK_Q`(Wn5eCIO2T6KyA^X>L8N3)$tMRilx z9hYqwceZ_N=gA7_n}dHeB~8W!1dP9{nG{yFI(!MW9ztrT6j&wEqC_N9T`944W2ST> zk>W7AVeTke({&U2Yo>DiF=i3TG!JH3n`vA(2v(frS>1WqJz~I#xs!8<`dEtjdfPp0 zw)07JX(SL$0tdA;_Hs}18s z{UPn4cDN&A^GqC@d6B>mO!-Sh(YNsfF$S1MSH&ByJ~wmaQcu*LD1KAWG}^S~$n<jdq4HWS`TJIg z5&ES<%)?x6&*E3h#PeBjdGelYww5G5cn)Ly&{jW`n=9Eah**-N=T+*spbL#9OQ~lo zW3xkf3t&9nhSt`vSmN7&&Rcg?2&9q7%S{f1NM1#%!edI1Ov~H8G%KETKS;iaQ9|Du z{fG$5>>ZzcmrTB|Puje@(p?mP*cYRm{B+qgJ=d+f!c|?9iEg2)P653zgUY&7&G_i_ zMgP)t2V)!og)liD4x+8u#WOB z`v;0T2PqlX?}Nlq;Y^zo;xWrUJk{>?p**e9$;CPIpJ}dEA+#Quq4`LJ;G3 zDGu|S_4Q=>!()7@(an?k)7&p!K~jHX?(c6nxI}*iWkD*wE881_GLzMZ{HjA2oGd0V zy!ZFSC!8%Dx+~mienL_?_x$b2NIN1rlaj3hR~OmPqLli_OD(Qlp$95MBW#IBxH9oj z=h}i}u?sl90n+nx=958}?#X1gkF5o&zlCzQiUJ*HWBcaJfd@eT$r@H7on3!94n;1Z zbc7k0Ih|Tw3h(`CxyHZ|RNT9-?p;9J9o;zs3S2(SsOG=rlY}={oCNzZya(I9qWG~& z(VhE0Cns5#<+EvNFy~fNXc^BFy(Y|x#oN|B^#MMg{wJsEuTM{pTLVL5SDh`SsJ0Fn z2LxLvgFptlMkN1Om!7XwxCHs@a3;d~+?S(={7nw9zPqe2QVjP~v?hny)v|bH+ck!l z8y$|C!uwb94wNj7(Lydp!29@LX@8adM1xc~1kuYoY%#=C(xsq510)_Yparcru}(18M|HN%BE=l7WkS&D%y1)MF)%EFX~ zoI+#EoGqB1xxa|~mZhR1o0gw!rz4V5kK}JNK|JP0)qTO+`W;K(@2-e+Zw6K9Y@N3( z2+qDR+88WCe>-NR5q`US)(v>24e!p(DPT8o!9`iZU@s50x9EZoRemKqEQ;Va4Wr3W zNzu<2&Ko7sKw9T-Ar`y+c4J1YqMg;D$F(e_j?I73N2~QDJHaog1*!~Gh6gdc^TH3` zKX5O!C4rIlk*LRzY zx+>!`zUTVCt#{t6g}{4Ay;Pf`InQ5!Nwa9@wtR6jQ7oWS*?(oE#GWx9W+OX#U&5#J z)t@bu++)9SnV9&^M*|da)3t`f*(wsyc9{#zcy?BH~f837I=JrP6c-;M$LXQ~p*O*X#2bL#wD0F`7`u*{I0o>&RS{hM2auaSyD@A) z%fwd6{VWOWidR0e);+W}Tx!LY#Q$EayZ>d)x~r0ivw-r)M6jgk2rC%oIA#3?tTJTc z)t3InX@ooo^c&#I_4bP;ak_c1tD8&hjWN%kUw@J1qxH~D(v}O#_`z}x<0oZ{qL;8v z?5Mx@gD>&Ug;=_z(vHx_0oZ5t88SxWA+{G{Uo0KP@*L8F3`2ObgU))p^?Zio_I>xs z=9g0m(61$0X4D9brX!;6N&&0wtC9MxWd1^3xJClTZC4=l^v5p(} zZtvl&Kr*n1mIif;Ck#%hXb+RG@mBpcRo$rKw4d-{u&dIYlFx_!8gF++J_Ql1JBqTn zB=FP^Ryif{iSt^McQq*x<}L0W5iW@ zQ~nHnVvSJ#aaYB`&kG@>i;Ps_n{U3?IjJpoM$f2+9;C3zHOuxEUVpXELxn6SZpLLD zjvoU;C669fs5q^Jo`y0L-Wyw0Kipdzj8VCPA&ma&=81uA2YCiI-+vtt%977#!BCexsU1kG9?naoescX!X7LhjeYB(eGa32kdmC5 zfBr_3ooSlg5c!k*LuI9eo>T40<0TWQm@R{5H3uGJw?N5k=2VLXrtp%)U3QQ+x-INT zIy?AH)&hY_6m6>p7;nrMo;O>u0FvNt@5W!+U5H&9ir022&o@Myt{3etpT-(nvHWqX z_nhbg=OQ6R>I>-Y-l)7+UI9{TIt@nPmuK29stvkO_w>PNtGGo4A`vr*G=7 zN9~RfxK-P9SC2d_WJssq61VX%)y72?x?~MdLqlv+^k>|^)!t;zMvn%Yn|LgwhbdXModV3OE34pgkx8}Oj|!Dv&& zWoBjI>CczRnR?-0nIRrauT^u_^G|$l72|g;rfaF( zx+3G5oawYhqMMTXfc~Q2?eS@PmEqE_U%8^e--NbngMCI^o}jcm zbo0j5&p`f0(zjsuTtYAzuatC38dx)WJnVnDs2`YS8YqV@m(_QP8=!%e0E)zS`0hja z_udQpBs&8OMqzE&Mh4zwyF^v;T)?o8Et6w!S9L5=VEFaY@=w{Ny&k&ifjQu@^}hr| zD{1m=jHp-zZUuj#$Vs_;f-7gYYYju=sbLza2LWRWKfkh;4_ zTcXDenN)|>lf~a9r`iJ%*dpMDAZ!BwmWg%t7=i)e1#^RIeiE|pGS?+vp z(?C4_8Q=&a32u6Y)q$HrPK^v4&zQ7-RM_vmZyXmWD5gwI!w`U%l`qsG_-W zZS0V%HpJfWImab|e!gqz*;~L^0O$A)N$~9V-t%`+=H~Qd@q6$0T3kW7^}4!NvLWLY zY$X>fCU&VD;He~Jkf2UwZTw^z^V;f=1 z7h5v$1{wD0Xg%xnc>Wkonk|F@9ir3vmLhFqTj9nOwmXE4&syX|Q%XC}4hO>`z8tCp zuwq}OrPk_PY6q=5JywLfKWJ{}!X_3sap@}1tp`J<*CQgz`}$W1c*3gJ0f7=(+9+gk znS%{-xsJJYq0Nd-qV+3!=fO^Gkw51mL#N}x&|_xdp1UZ9o3{%t$7+C-#K%qXOQ1l% zQy$QQbMU^%q40*V7J$E5@%~T@>~`d(8e0g4sX1RWt&f!peNKN+3u0%1>)||gkB)XP zgMdu8QeQS(?{}z{me&4-pLJIWsvyI$`4zZPCdHJT3LklGMbHP`cAG>!oFgXan%JqK z9g>a*iz?B@&KB3ZDvlRc7!r6Rl~U|lHa^nKZHj}~-&HmEsvmhmhxiTFRJ$N2S&0b( zw^1+S;^N}W-dT)ca~q{44AwXDRxhSUK>OyPROy4ihgyEyF@d2~Jx|%}LaIWn$1%MA z?czMDg2ty>pZeZR{5(_)u<_{>TKehROUI%RPM)Hfb@Rff=Ht!orPeS|t5$nq$b$lC zIo%s=iWLb>`LUh0B1hm4QaDmy8LzM4R(49{%pcA>Jbg8SuJ6|v*SI@W_<`PU$KYB# zv%<%6tO@><4Zlx@2NfH7WJWlB>l(yVN88$Rpo{wGq|CaWC^GhBdl=>2O~Hb~>(}=#MV@by z0z`q}ln=yWK0yt%^z@l5%A8TO%)q5G%LFl+Yc*kK$lR{1>}}UNK~??P_A%{9r6W63 z6bJ*B8tUsaZttq3Jrz>a4%MCn$+)Qae6GH;DR!fkhx~AENWtxgL>YnmzS>u!Ne22< z46qz3OA`1Up6Vd9pXQD~LA-?Ys0=4NM)_3Lqf5yBnhKIW2jT&F-6Y_?yt{iYO7qv)30A2bZ9;)9rdv=jQx)*Q zi_blJX!{n4A*DG?vqJ~XdgtVcwj2@^1J+Ck1j2C~DFT$Np|>~Uo>4PN8jBVDJyd@` z_7E8m!w?*o_62D`(nz21F$?&_=HxUt*lYuH(v^a$f1u+k9SRN|lO14`#We~Tzl*$3 zdUXyhZd9W`T=Un~AG@S+y?o2ZDT{y=!Y%(+>WS08ShDf;E=`8&0rtM14ZhELq}X>u z5?rz#rB1~|;S0s|NT@Gku<(LS;+iAYyT2GjO}^aj7NXTkvHOnMg>PJWZXcai+GvJQ5bk^E+U=_9>#OEK4SXrn zt7ub?rNNT9oBa=XrP#OKT=53}D$79m!zmCFm@`j5OGd*`#X5=l)!zk~zXV^e*t?o- zGUmbroX8_RL3fhI9wgJfBO5M%Jhdg-lq({w>me5iRaG;CfixerR(s5Jq_edY2)Dvl>Ub6zZhi9gp9F|ozzHl% z4DeD^8Bx$X`A+l#V}UXnXFPRMZhX3Ur$9Nt{4oCBK$PzFrsU;3)sBn(do%Zg_i(W} z=#%4vu_O6(GJ5>Fu(QSTaK*eD1wsU)Z_f@zN(JopIVpN>^gM^hmUQtdk3MAZ&bT>gB0X>}x@8_jaCZg+Y(+zc8sE~~;jB)-5dXz5v`rk{tBla|EugagoP|3V?a_j$d9Z9I83KL#3L3|uBo7{eD~vAkej0Q_ zMjbgJIitX8ZPogHlNlEDUka)@QuJHE27}b5jp3FLUflhG zDZd=jvAE2`!`Snk7>3`O!bVmQ+Y}wVDVcQr$}*0(i&W;W5o4)V>?@To?13UWG~Bw! z;o2qu4GJ4)6ZHhPL*2W+KDg}og|@6Hv)xjDw9bQzO$k#7%YW(swdN~EM-3aJO@$2w zhcG8cQ>V5zk9LMUd6kPxlJA2+E=)~}>H6Yk2na8;VZkWq6Eewj@lnSkh(DH$PT(A8 z-_g<0(1!?$wns*qT@^~-3$NeI(|k@nRG-rXPM0J8aHt}X5!$#68jg{fuRQH(EvTMw z>xOe1k91gjwG>REk34op9OI*o)VR!0TW?rbi|65Zs5PA=M#1|p$ z{B!1@s7qn`K|r4*_}0KF|Bo_jHpviLS_|*hg-5H+r-XIcI%c!Jioea9UE;2%Cxm7s z@d^(+GRf;@&aTX(?aoH)z0$pRudz}3(5)PKpl4`>wnqW_qEmx7SMdgeqRim z&!eor{V1?`h#`JEJmm0umRZ2h`!T0%9^(m}o8mWiN*0U)ng@0+fmGnWJ(~o?38Dtx zhpG}+=}uk;Op2yC)mjd|`ZY|$Bpe$^;H%B&(>UZ`DvvH**9pByTb^O_aJ9C|Ox}-- zY5ma+6@oOd9)qsJ7^v^8m$OB6)Y8vUGZl>rr4pGBLnXmD?sIjMEVbgu+8GTqb>+>3 z_~NS%cTLE!?!ZV+0ux?B#e7bKp5BP$@zn6~W*UAL6hdo&h!2?}% ziVGC>Kncc|7h(4b>+8*JLJ2!_)urk;u9gjknST#eqopvvrzvY{#p0JH(OYiQWMXH> z2M8nXRkgcL9Qwy{#>0+k0f83&fwPGw3wK%Na>)}kaeO=4mOt{cj-TF&9Cj;j&~#g% zJd{CaZGB?CvC+f`F2F%an-xnpLbcE)N+Mc`s{$!^@v<*(Y+Goh?-`3UFdpB3*lgU(!aMw~h zg|+7F(pUp<18VntBW?Ig&??^+h}ZqTcD62|)V~*s$pjhyK}#?b_zS~hr*@m3AOEeK zS!D15MZhBXFog=cyqxq=hRFQWf8qFZ;;Xa?oelZ}HA{tDQb&1<3k*~>JD$dL3v6_5 zM&Er*&_ZM5<3oHWGkmV=^Rb+_K{DmTx+X+S(VhS1eL0w3_bW&YEqJ0B8VR1Y3}e7F zmuDm`)F<8X18$Imn%2&Ihv-hc@}UU+pJXoTFbI8M;^Yb>@ZVR9nQBk6A|Qsx`%V+o z7AG_0ec=?5n(GW)w~ycZgTsI9NlKJMto~aG6(J=n$ge;n1!w~u|L@c;(8X;2(a-3rTA1}}n zsT$1)ym#%uG{0|V?=L79oxT&A0tudyn?;=G%c!?xd;}Cg(S*2_2F=p$bLo3j`A_*Z z0!SKb#@7uRFYZK$t89cZkka!Q>EhC(;>O}DENi0KsDON+bL(^yAtb$y&o1Vkjg7P+ zfTZ5FE2S6XO}-f0Q*}Bq9*|+pmA6Bo1hH-|7YN%8iH|j2uX1%zY-_>1;*FGdK-Ittp=X!{A%Y9~*eeBNXxu zZ2J8{?FZhsKRlUt?9aXSI6Cf*xN!W{UG@u1K)4Y3#37X|U;TE4g!RWQ7i4lIqcbq| zT@}3YQrRc7H%>GjZM~Y(CsYx`gE2L&5##dU_0!={g1Ig6ZYo5ZD0PPIhUV#4JD**x zNNi3M?CQ#H6W?3V5AyACz~HzS-i97Y!zO7Gue7P{8b23*vJh|b@L|&~I&xET?s z@;6@quaZ>`8A-=xr1tej=;2LU!T(4q(-w++hcYPlpQ}<}RsKkxpgq2BRSDnR?mUb? zSS-pill|!((fB(~kttN4hE<|3cq!;7;vcZ65%09xzi`(%j8a@>;F~(VQee&+$-o%A zlXphhiDvRG;du7aRJ@MmkH!bfgTQ>EADj~Qgm+)0N?0<9Azygvh60EA?9LtpE- zjDKuTpH}+1l)gGK|ELAe`E(bm%07N$_u527<$menypC5lfTU|X3GpF^7Oz>U6+C+cIVk{r~$SqFGZKF$cupXA#_z6{YUf*~f$ ztE;BNcA<|NB$lT?L}>Dj%M9Q8E`968UERH-kw4#F1@%Mn(i!{^meZ0hq28Qcr1rs4 zpGRVO#_vCCx8leXD#HX7&NVFbz-}47dn2R3$J;K$yQ93ECu$WCT9z z8{ES_D#odE9^<$s2|aot>Hc2E-Q)-Bj<2qG{E8x(r3K1|wGg2a1M2oYrnb1VZQxY+ zyz4;<-)Nn=!Oh_YkBXmmSPVkgB=TSkxbI>AokY})h1jN}q1v z*Y|gGHyu>|?48hYUD^0ZlpFmeS_qn$IlHvf4x;I<(ACqY`2DAid}+wdg}nGwlCEN- zJSl7RoK|~X%Vf#I^YDnpKBLu_E}1i*NoL#m51zLq-G`tTlmb3nS7M)m(tDY0OCwM% zDCpN?;X#kfk~P0vt{8y=aI&*az{G<&o0?owY-Ns`%R+IBooL%(TId0rtsF{uB_DXO z_JScALXUXoUkBJ`A0_nGI2_r0pEF12OX$JD`&SQUlfv+8AmlX#UXdy2u%+V`<0NC^ ziD4_Z!)LNFV41;L#w2Vo%EUI$UtOp2)4cYQ+qPl;^I+&&(GA`kJ4bq!KiXAJ{u++& z8oZRcMn_AV9Kd}U_y&L6vO-USYynu3LQqSNVC-m(3&m;r4p-SeN7B;iUCv0c@!b=` z)aj$|y%Y6bSqk$RzJrSE%{S=<1|BlY`u#JtcHrN^Uy=?jD2IX+%9iogupzuqeiYmw zEm9f7Ye1Nv@ZF3IKA5F)`(k$}y4JM*K6-q&>&OmxO*ebfNHO4YSDIe6Uz%A|&}jsN zat94%$NSeS;bc(dx!8`S7`HidH-l!!x&4RZyXfsazN>jE8g&~j%jHc==x-pSVi1L} zDKJH^SFm~3fvhPFMaO&fHV)7`-P6Yi`u+|r*Vz7k9~j6b=J=`{ z+Xq3JtcRL$Cp^{;MYVOZ)CU47G=%}YgB&>FkQr$L(2dl9T55OoL)fRfP28QNBh8sS zg-C7{^s$MZc3#TUF%aNd62d5Wr^!g2GDT z4Aj<1Z8nV|WuC_buBZLk|97aEu||nkMLxixd|r*&ij`^-v*`)|aZ4#l!h@b#T@}Bu zWx)k!^f(72+=sY?{07nPt7Emzu^8Gdc!zQ{9Kxo8aw6B2f|D1anSY1k$55ip zpj<;k-Qf+)JCY>_cre+=uGz_Dn^tJkc=w@Y^F$UIY~cFCjSmzY_Q;54=%Ygk?gf>O-elM8x-)z01EK5AazN1R&haJH>YB8!lp2|lzfnvPZydtMPoLK(vd zhnN@yF5me|d2+y{Oin&RbyNNm0yBwE^k~C%UpRge@nMIpS!z4P<&-33YgWG zzQz9p@eZ_u$eW@ItgKV4-ew<%7F~Z;*x1xGWd44Wov*Bd+_U+qbbJeBSY)o?- zA43m|LT?*}l@c^6MahhJnAPj zEzP0=f*aY?IHQ1b!Easf>5K|{wjo6U5-b>#NCiU3I6Y`aJO*V1=4Q6@R-clrsrZ>B z3skRm>BhPYm)p>u!(JMKMViZjTe3O+c&n+T6OwW<{N`D@ohg8=T`>y}{Qdu&$frWT zRufHIIGLiQ>!w0a3C;G<-s&4R)Ljh<=HIaBn5xs}!|F#-YEa2cMm}bLY;TnLBgloaZ@*IsN3><8NVGvFJM z2Xo+{?!&*sN-qg*@Of;CV~wix-oOLqRI0-3mKPtvD13$dF@L zhnesARSq`wKwLxd%gKj$9s97{$w!ANk(5u&O`NYy%%jIl4T)o3ki6IpsXLla$q$0) zTzE0g*N_kkarb+4Va91kRHehlLF2{QAIGtky$}_+E%v%RGkmgeIUjJ?as93(8~7je z<3g_Iz2&KqF;EOtPhdsc^y0C zmTGm2gg5b>yEE>>g5MWI&|Q3$59bsBRFY_#WV-+Ej^^2p?1h_Sh<< zxvv`(2IMMC$tI-%d1uk-tk0M!F|w3Zr=Dv2_p_oLARcZ8;r(gGy;wa&^#%6#<=-M5 zaPDU>8rvTl%RS(dJt7w5Zn{CHkMgBshA_napYKuVp$8|527r1>cJeB&Qjf9ml`nVb>B|8h<98-6&4jTX+=i>r% z9HC>!>!5Su`cVf*Y-Urx4@)Ii2XS`qAJ=!s_ZLxs_`k zE+SKz%xBz!{w$WTtfVbG$g6Fs7yAw%M>p?*bE62DiNH)YH-N40yDu0;kJAW!_Z4eNaXuUjV~=c z2fCCC*g`(|VAjU=)eaAbDjReKnDNb}C-{GHV|t13pvY)6Ns2L0b9|K@1u`C=jT@zI ziOZO&pnsbs{$w!Dw$pYq#ghO41;Elvcrq(3$n7yXxXZjNuP3`)0u~GsfvOM2Om`1) zr%6a%rMka%d{2Onsgp})>(yj>-MWS3rRZ%wGh3%IK53p(BmGInL7Z+2YCkNKJt-St zZUNZ7mVzH6_t6#qfu1qRDwbdg@QF#g+DsH32k8Jpv$|+N1S3=>r^QHNd~AjB-=KG@ zyLCu=A3ewJ1U?s{PuR7DlQXbB8kzdQCbJsU65+I{WDZ&g6Yvii&8iwViJXv(KVd4i z?B#9@S8RU%%E8atLn*n-sb-1u5}mVt3#lBi=R_P0e3r>h6f{d~JBTfK)VLWU7_VL= zzqIlBlo!7aOnQEGAiMV23utZ#r{Is0v$WtwTAB)##cl_{U3O>3d)Y_mM(hcbsAFpK zEz6gWYTRu%%Vg}@mqW=yDZ1aceE;}7-nxAZ962=i+SsDLjE|4^9w0eP;*DWPa26cD zd+Frs;}Wqv;NHa&4y}&?f;Udj$`)83?`dm$De>m+)SM?lbb6t#-8Q=bc~_eMwkq!A zmbZ}Rr&SL~PYvl@^-Q;Ix*r0498o9<-l(fm#{CgG9?V1ewhX|yn1MsR(_<65%aRl7 z7cLrLL3?qq<Cxx}qxR zz6gV+{pK*zT?^_(Ge;_6w8HZ}={@Gq=x}*RCP&lz-J6jRbmM&M0-L$32FUWz+g@Qw z0%8{7kND7ZTtXCC%BnZN4jRWWefzP#xes^ZJB!wa8MjDrSQiczeg5&OUZqkl)~EvX!bEH?Dl^SW{%%X78EF0tGd}x{KZx%UC5LU z7Or|)tGD>vz&$D+^)6#cE;#LRiFfQRLWrpSa_f6DI4zvU)X3KeArR4)8@}qk*UPpa z`Mr-r?eCs=Au)9G!+mbjenyn?J(>CqevTEv!IMb!lPPj4c;)W8BaoPVrQw~3rxnHdiyWB10n4T(?t zkUl~+t+j*?gOXIPRP6?shXH~Qq(PiY-AoY8^n)5=*k0QZx|9ZR&=nCaM6jk003PWK z0kJ1kO|Euv!2n62=N;~O(%P~s>SfY3*`!WD>MEIctnasyCbi#I;TdT8NPzic<) z&rXyv5fq)Oa9n3dPz(M^BW9O1a^f{kTUaDBs7{m?~IS=oS&AK5HQ_kSBF< zHYS{kkE#I|EV%BaMeO~3{rzJqdZc>?xQ{wKEKne#dh!bxJ8M?l>?=s1rPwtuu5Z;Z zXvio&h60yY{9ErD8F;ljsE&MOOpdG9r&1}PV$^DNW8}ZS8m2&lXPN zYmP3Z89~JgtJShVYKT+LwGD?Ng1O7DT#bJ&i&LZtAitzNESCB+_t#zUSeIv28x+`JLcmEHCdEO zu*zBWkSOG_)v8zGufE}}?q{Oywl@}Px1;0}>kVx#zb(~B%p5|Gn&Y0b?K2nP^^`8L1*TfLY7 zC|5yZr##8*6^#M~He~@<%sDwmTpG+a2tqw}^JU{O2vQ)%HNnPK+Q0bG>#szbwPW5viTSe~H&E{hJP; z3YtteZ$O8;&%K-IIJCt8yfi^t2Kw(>YUxn1D)&JO`tz=qiyC$8Er6>pZ_k<)CqOBL z>moq1$@3YXn^z^iijrs#jzVo-0hoPvdtf*qKr~SAQR)U5Bi~-y+K<&NOnN_ zzq|yhlsqmv)FN1%+ZJ^m(e(*8f+4vZHds zRdA@_CWPz6=(1|>WIh%^p>ABL#xd5Zyc{#`i^cyC)p8)r+Qz?#USI;bDgzY#mzi@e zMPCLp1~h}A>+1tDmh9PzGWW8WXCMbs`SzoOK`I@V^)Y1ymu_qQBU!<@YiHk%8`5h@ zzlUlEAMw*gI2Pib!gAu~Xrza-QXe1hGm;#}z32xM;5FfP*WV&3y?o5WOOJ2-%QgS@ zh`u?r_%Wd(uvvHab(t381{+oDm4v5KL`Lx~kqMzo7wrM)K5QIaYkD1*cJ?BrL06sG&HLtcF2#m&U%U)2>Jd@MmPa8nF3k}u|6 ztoJ(mMMd%ou2F5{slPj@5nulmMZ8PMWB&MkTF$7;(8@={ zx%5y3AQ`(oWaN~S1jwBE2meo_Cq+O_ce=sZajGyPm-H!5a2s#iLiG>x7t9xjt;;dW zOxnPZJa5QcyIR^g5X+%H0QAV2b0^>=qO>;Ac#$6kv=`Z@0XS>nz}fGK(|OUkqQL!8 zn=5p2IK37SF@GIwwPl@4P8@aTw6aB+$(Xf@efQX$l-nyyKhtoSXfUbY`a$22F6uI^ zC<2VsB2ME{A_2$lGjb|S{Q!Hv@)GGo>YDf3*hbQGl{;|a5zs}ZVbcv8qE0o0=Jy(U zR!7S^o#fJPZ#1~awU&5qJua9rS_8&W?fUxqNLz)r8GNLjcaz&B2+>_8kCY zI**Yb7b`nPrW)eLqKW38LIE5{cRs~!y`dNVk=#UZBr^>}z?_qSCtb<9qE&Bc=C|6! z*8bLt4o+^>Zv+VTvFkOr0kNLgQf{`>?A*1bm1E+fuy(z#l$Y)6%!=8CZ%Ypy;6@*v zw9o#TJ)kr@Th>oOGgmWL%RT@c{{4y~y6O!8LDB|lvz7dVz)5^&?t33*Vu@=`&uy&$ zdf~Tx+m(A#8Gz$>9UbW}c$D_3@t(4BXbmumABA4_nI2dUed=QCzC`%^hLv>&ogrOJ z<9_QF#lIO#8O$s zM&B{qJNy-e&YEkmV)X|@e<}GJ5l6OC4d=3i>Z?Z&OMhP#zPdv0?!y{)$`a>HXKC`B ziG+gvjzvWi71^BnQ{)uK%Y9=MRr}_(+${M%Hs(jlw~werQ_+C)+9!hp+l|ItPvA-jAdk?nZ;1u2 zGqHo*jgu^rQtgp?Z?J(0s!Q8*ot-eHj;h=jLH+@~(KJ>;P7;W3NK0;6zvu$j%$K=h z?EY`ZS;a}F*tA%}6grBV(XxONT(;`!v8PZjCUeMFbv}tFF328HHK#9@a++PKy)?L1 zIl<&De?xBeLHhAS@d%a8Xx9SC^(uu5)*JT+q}I`I6DINwYO00 z$3f%J;`jP5vnBIc#2R-Ptd!)`azFODz|BQKO9Z_S3;Mo|GKq%Y%o7k;N6!HVJ)o|* zp6s5M4PVWgZ#+M9fnPw>{(M6>QM4M~DRP+Ap0*qS?D=k=a(;E2|M`oF^`l+6&ZNk@ z6G8+r!6)*r*Yx~=eR4N*JCBm>Zv4fC60ONqNyH+;eK2I3Z<1fuJz$UR3XGjk6*1~O zYMqoLh~9ebAxmRrt>F1_o3GJ#F(dTac^Rh zbvN+D6vm)1(ON-FFCR7m!*q2NpW=m^eUbCWG6-|kx*uuIKhw88-|8M z%3)AwOkTNi$Dq_o^$P}x;~6{*fno#RaBf#TSI~2?BFso*`CO+=nSE3b+Na8t`j!Zt zM;o|F6zDv3lB=(1hadJzC?5x#;ceMIG04}2P*J<=VCd6<2l!6Z<-W@W zGQy9fZ&u6|*y9^VnbGNGZu0?>xxxvr+n=9L+b847gI2EE#+4E^#`T za!PH+*@r`tb`Vh{_kIC=x7%(Mv&m%RfDtOO$xVea#qxMUK7*G9l%ZH%kDftBK_dA7TMKcICERZ8^aM#(H&S8 zFVFg1vQl!L5I;|C?tFrUZc+4Mf|=^=+6gmWiyu+IGFQgAw>|M}xbQ~0jZ43#sBJn5 za3KftAF7gb<#dEnP!n_e?%2-a?ls`Yzya%MrFcr#3vzC^ZQBj;$-^4IX%4^b(j!=Z1fh zyIpq}9anWu>clY>*rf=u@|+)`21I{E4lthOgBp9!6=#tDi4nE3ThvG|+G zdU{l1xg`cRK!YoMmhwkfQ}d6BXSm%Xq@f^nO- zt1iw@p4}_ZqSMp$9DIo0Te=tc=xFfz?7&7L(QNk51roDE`56m86MU8TTm3y_%{u)# zi##olUVgfPY4vKc;|)~%@cYwvxF*18)})0$H9C8{f6Ia6zVhHzRIY9mwkP29&}G8? z*y=O(@0un=7ZU9@*F{)lF=YFQ4(Rf`Vu=C1?R0KxP`Elh)%&v(yIfXIQl{pE9GwR_ z4~C73k~9F$JD(O_}Ya`!47F5Xw|idsia;Ud3$$08PqVo>5-)|}J#_?+Hz9hFP{%33(U zhB`|CBOD+-xD%Y_&FVI6a>44f)GoTCfyVl1mI;)l&BYL3O<}V(6vv+(n>hFUOdOym zl7>EB%3-ej@}M)tvs3Mw!4NXMjES?VU-DkW7#yn_39zlPcDP7=bfbDn#ioYPY(txh!|I0XM8sB z+PH(WJmnQ6o&onRo@CS=MR&|N`-zdnY)cMrTgzW;|L9?OH>A-J3B}$V5_y)h5RzEpmkgt6+QTHKm2>L`;C_53gg#%s)pKH zKhuU)aN;zdWB(#)zvML-1xu@7`pRXn7a}Mn33p>27U5A9wjRe^^ zB(|vZ#iu8`!AUi}rSOBlUS=y6c}r)-X9CjBw!)%o31hy;UESv$vir$4gF2=OE1zZ0 zmNchYI$F2OHM`5MyTo5w`g9(FRUnP3InixamRC_rDYbkQgc=*FI`UuAH+(4-Y8>~R zyC;XDR{PCL-)?>3=B;yvD=4bO{euHDBa5fMuU8(Y5|g}6?90V%DJ_`WhNf?I>9X~A zpKAS-z@%$L9%CChoiRHQHTCZo5%si zT~VGn17cd{labb!V+1ym<29|_9jXo8)=UIXK?P6wUP<_D&pJ=1F&2MvXiPo$%+6QT z|EH*6fXBj`4meqSUu9pWesAt)RErFHs&e-*1^uZm?cjGP`l$pTTVQp1B`F{516Z+a z<;V5N6IfyrBJ%BKf5r&J9S6V8mCbUnwtm;O_@}pmE?_+FM~WV*^igzlG%5yN791|X z2lrv(=~RnSiL*|$kc*Nw+nxPM0kit~G<~k$^rDx-LGl*P7=ByU^gQT~=ZJZ~T?+s~ z#c3U=BHHyDarC25KDK^#c!da7aJg4uo&;{vqHOfE%~CYMN3+nJJ%T;VU0T8N5z8a6 zIQ3e7K5?B7g?dZ;hGkVP5By{knSN#eoT7L$_jqOu$t)~T7z&0?$-k5lJ62F)|NBbm>knW|&FibhRsmNJ`7 z_}{@p$E)dU$MnoF?{?RJMoCoe1wf^zBG*W_<-LD55*tJTB4S?4%9qlVkp-E9>S=Ye zW1Y2=+de(ZiVu2}Jr>RM*r?z?dhV*+RBbsb-;vDi`L%nfS;H`tL>(J%HRqypXNV?f zIg6Cs;e3ZBXX7L^{wV_u=Hq98dB1B)^C28Yg3?1`szzF<^(LTrAY z6<5BYHQ^6zm9rI5fIxk&0gNa9@z=sCfRo)Sa0+-P2D6WCpDowOboeJkjKV>(R=guPqxATV-yUB0x&IZYj=Y}yzH0!zGwFW|Tvuq@=xX@oW6z^} zv`Biel{}ptgS*M^2RuRrKP2|?!DgRi&fOFwU3{K@hdsEQkw)yblot5VdG8uQ;%a8f zoKc3vM?e}Iw;daAU?i{7;3+w7B9d{=Ld2eY63uiFVZCzksUar6nPHCfjosLIez?Yo z#P8z=n4Eaf=r>439-8-D#U8*}L&-qTm^;RT6Y)A(rDuEJFk9JjbX&Z}pE(!d8m|B^ zTh{@xP}&qB8avf+sB4veHy+HQc&;Td1s>pPt;f%3^wXX6}PQsQn(f zdZFuuK;JhR!;ZKQn>qIaa=lw6$4iQDiFvLXY-LacJUy()cKUGayPbNaDw#8!m}Tj` zYLUE0dN76{zmP*>r){BYN8>_^I#%X%io)xd>B&cN^n_BUo6p6`gzVm4AfO9VG=|cB zwtX|NyVKLQrqoqm4$MzRdGgMbR^WIaVwApkY`eA&@X-IdQYR46mOgF=H1YB}⁣mSe?5!5S7v2=n!4N=RJ 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 Di=aKA literal 0 HcmV?d00001 diff --git a/static/js/timeline.js b/static/js/timeline.js new file mode 100644 index 0000000..4054e58 --- /dev/null +++ b/static/js/timeline.js @@ -0,0 +1,26 @@ +jQuery(document).ready(function($){ + var timelineBlocks = $('.cd-timeline-block'), + offset = 0.8; + + //hide timeline blocks which are outside the viewport + hideBlocks(timelineBlocks, offset); + + //on scolling, show/animate timeline blocks when enter the viewport + $(window).on('scroll', function(){ + (!window.requestAnimationFrame) + ? setTimeout(function(){ showBlocks(timelineBlocks, offset); }, 100) + : window.requestAnimationFrame(function(){ showBlocks(timelineBlocks, offset); }); + }); + + function hideBlocks(blocks, offset) { + blocks.each(function(){ + ( $(this).offset().top > $(window).scrollTop()+$(window).height()*offset ) && $(this).find('.cd-timeline-img, .cd-timeline-content').addClass('is-hidden'); + }); + } + + function showBlocks(blocks, offset) { + blocks.each(function(){ + ( $(this).offset().top <= $(window).scrollTop()+$(window).height()*offset && $(this).find('.cd-timeline-img').hasClass('is-hidden') ) && $(this).find('.cd-timeline-img, .cd-timeline-content').removeClass('is-hidden').addClass('bounce-in'); + }); + } +}); \ No newline at end of file diff --git a/static/js/timelinemod.js b/static/js/timelinemod.js new file mode 100644 index 0000000..07ea93f --- /dev/null +++ b/static/js/timelinemod.js @@ -0,0 +1,1406 @@ +/*! + * Modernizr v2.7.1 + * www.modernizr.com + * + * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton + * Available under the BSD and MIT licenses: www.modernizr.com/license/ + */ + +/* + * Modernizr tests which native CSS3 and HTML5 features are available in + * the current UA and makes the results available to you in two ways: + * as properties on a global Modernizr object, and as classes on the + * element. This information allows you to progressively enhance + * your pages with a granular level of control over the experience. + * + * Modernizr has an optional (not included) conditional resource loader + * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). + * To get a build that includes Modernizr.load(), as well as choosing + * which tests to include, go to www.modernizr.com/download/ + * + * Authors Faruk Ates, Paul Irish, Alex Sexton + * Contributors Ryan Seddon, Ben Alman + */ + +window.Modernizr = (function( window, document, undefined ) { + + var version = '2.7.1', + + Modernizr = {}, + + /*>>cssclasses*/ + // option for enabling the HTML classes to be added + enableClasses = true, + /*>>cssclasses*/ + + docElement = document.documentElement, + + /** + * Create our "modernizr" element that we do most feature tests on. + */ + mod = 'modernizr', + modElem = document.createElement(mod), + mStyle = modElem.style, + + /** + * Create the input element for various Web Forms feature tests. + */ + inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , + + /*>>smile*/ + smile = ':)', + /*>>smile*/ + + toString = {}.toString, + + // TODO :: make the prefixes more granular + /*>>prefixes*/ + // List of property values to set for css tests. See ticket #21 + prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), + /*>>prefixes*/ + + /*>>domprefixes*/ + // Following spec is to expose vendor-specific style properties as: + // elem.style.WebkitBorderRadius + // and the following would be incorrect: + // elem.style.webkitBorderRadius + + // Webkit ghosts their properties in lowercase but Opera & Moz do not. + // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ + // erik.eae.net/archives/2008/03/10/21.48.10/ + + // More here: github.com/Modernizr/Modernizr/issues/issue/21 + omPrefixes = 'Webkit Moz O ms', + + cssomPrefixes = omPrefixes.split(' '), + + domPrefixes = omPrefixes.toLowerCase().split(' '), + /*>>domprefixes*/ + + /*>>ns*/ + ns = {'svg': 'http://www.w3.org/2000/svg'}, + /*>>ns*/ + + tests = {}, + inputs = {}, + attrs = {}, + + classes = [], + + slice = classes.slice, + + featureName, // used in testing loop + + + /*>>teststyles*/ + // Inject element with style element and some CSS rules + injectElementWithStyles = function( rule, callback, nodes, testnames ) { + + var style, ret, node, docOverflow, + div = document.createElement('div'), + // After page load injecting a fake body doesn't work so check if body exists + body = document.body, + // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. + fakeBody = body || document.createElement('body'); + + if ( parseInt(nodes, 10) ) { + // In order not to give false positives we create a node for each test + // This also allows the method to scale for unspecified uses + while ( nodes-- ) { + node = document.createElement('div'); + node.id = testnames ? testnames[nodes] : mod + (nodes + 1); + div.appendChild(node); + } + } + + // '].join(''); + div.id = mod; + // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. + // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 + (body ? div : fakeBody).innerHTML += style; + fakeBody.appendChild(div); + if ( !body ) { + //avoid crashing IE8, if background image is used + fakeBody.style.background = ''; + //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible + fakeBody.style.overflow = 'hidden'; + docOverflow = docElement.style.overflow; + docElement.style.overflow = 'hidden'; + docElement.appendChild(fakeBody); + } + + ret = callback(div, rule); + // If this is done after page load we don't want to remove the body so check if body exists + if ( !body ) { + fakeBody.parentNode.removeChild(fakeBody); + docElement.style.overflow = docOverflow; + } else { + div.parentNode.removeChild(div); + } + + return !!ret; + + }, + /*>>teststyles*/ + + /*>>mq*/ + // adapted from matchMedia polyfill + // by Scott Jehl and Paul Irish + // gist.github.com/786768 + testMediaQuery = function( mq ) { + + var matchMedia = window.matchMedia || window.msMatchMedia; + if ( matchMedia ) { + return matchMedia(mq).matches; + } + + var bool; + + injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { + bool = (window.getComputedStyle ? + getComputedStyle(node, null) : + node.currentStyle)['position'] == 'absolute'; + }); + + return bool; + + }, + /*>>mq*/ + + + /*>>hasevent*/ + // + // isEventSupported determines if a given element supports the given event + // kangax.github.com/iseventsupported/ + // + // The following results are known incorrects: + // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative + // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 + // ... + isEventSupported = (function() { + + var TAGNAMES = { + 'select': 'input', 'change': 'input', + 'submit': 'form', 'reset': 'form', + 'error': 'img', 'load': 'img', 'abort': 'img' + }; + + function isEventSupported( eventName, element ) { + + element = element || document.createElement(TAGNAMES[eventName] || 'div'); + eventName = 'on' + eventName; + + // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those + var isSupported = eventName in element; + + if ( !isSupported ) { + // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element + if ( !element.setAttribute ) { + element = document.createElement('div'); + } + if ( element.setAttribute && element.removeAttribute ) { + element.setAttribute(eventName, ''); + isSupported = is(element[eventName], 'function'); + + // If property was created, "remove it" (by setting value to `undefined`) + if ( !is(element[eventName], 'undefined') ) { + element[eventName] = undefined; + } + element.removeAttribute(eventName); + } + } + + element = null; + return isSupported; + } + return isEventSupported; + })(), + /*>>hasevent*/ + + // TODO :: Add flag for hasownprop ? didn't last time + + // hasOwnProperty shim by kangax needed for Safari 2.0 support + _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; + + if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { + hasOwnProp = function (object, property) { + return _hasOwnProperty.call(object, property); + }; + } + else { + hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ + return ((property in object) && is(object.constructor.prototype[property], 'undefined')); + }; + } + + // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js + // es5.github.com/#x15.3.4.5 + + if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { + + var target = this; + + if (typeof target != "function") { + throw new TypeError(); + } + + var args = slice.call(arguments, 1), + bound = function () { + + if (this instanceof bound) { + + var F = function(){}; + F.prototype = target.prototype; + var self = new F(); + + var result = target.apply( + self, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return self; + + } else { + + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + + return bound; + }; + } + + /** + * setCss applies given styles to the Modernizr DOM node. + */ + function setCss( str ) { + mStyle.cssText = str; + } + + /** + * setCssAll extrapolates all vendor-specific css strings. + */ + function setCssAll( str1, str2 ) { + return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); + } + + /** + * is returns a boolean for if typeof obj is exactly type. + */ + function is( obj, type ) { + return typeof obj === type; + } + + /** + * contains returns a boolean for if substr is found within str. + */ + function contains( str, substr ) { + return !!~('' + str).indexOf(substr); + } + + /*>>testprop*/ + + // testProps is a generic CSS / DOM property test. + + // In testing support for a given CSS property, it's legit to test: + // `elem.style[styleName] !== undefined` + // If the property is supported it will return an empty string, + // if unsupported it will return undefined. + + // We'll take advantage of this quick test and skip setting a style + // on our modernizr element, but instead just testing undefined vs + // empty string. + + // Because the testing of the CSS property names (with "-", as + // opposed to the camelCase DOM properties) is non-portable and + // non-standard but works in WebKit and IE (but not Gecko or Opera), + // we explicitly reject properties with dashes so that authors + // developing in WebKit or IE first don't end up with + // browser-specific content by accident. + + function testProps( props, prefixed ) { + for ( var i in props ) { + var prop = props[i]; + if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { + return prefixed == 'pfx' ? prop : true; + } + } + return false; + } + /*>>testprop*/ + + // TODO :: add testDOMProps + /** + * testDOMProps is a generic DOM property test; if a browser supports + * a certain property, it won't return undefined for it. + */ + function testDOMProps( props, obj, elem ) { + for ( var i in props ) { + var item = obj[props[i]]; + if ( item !== undefined) { + + // return the property name as a string + if (elem === false) return props[i]; + + // let's bind a function + if (is(item, 'function')){ + // default to autobind unless override + return item.bind(elem || obj); + } + + // return the unbound function or obj or value + return item; + } + } + return false; + } + + /*>>testallprops*/ + /** + * testPropsAll tests a list of DOM properties we want to check against. + * We specify literally ALL possible (known and/or likely) properties on + * the element including the non-vendor prefixed one, for forward- + * compatibility. + */ + function testPropsAll( prop, prefixed, elem ) { + + var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), + props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); + + // did they call .prefixed('boxSizing') or are we just testing a prop? + if(is(prefixed, "string") || is(prefixed, "undefined")) { + return testProps(props, prefixed); + + // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) + } else { + props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); + return testDOMProps(props, prefixed, elem); + } + } + /*>>testallprops*/ + + + /** + * Tests + * ----- + */ + + // The *new* flexbox + // dev.w3.org/csswg/css3-flexbox + + tests['flexbox'] = function() { + return testPropsAll('flexWrap'); + }; + + // The *old* flexbox + // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ + + tests['flexboxlegacy'] = function() { + return testPropsAll('boxDirection'); + }; + + // On the S60 and BB Storm, getContext exists, but always returns undefined + // so we actually have to call getContext() to verify + // github.com/Modernizr/Modernizr/issues/issue/97/ + + tests['canvas'] = function() { + var elem = document.createElement('canvas'); + return !!(elem.getContext && elem.getContext('2d')); + }; + + tests['canvastext'] = function() { + return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); + }; + + // webk.it/70117 is tracking a legit WebGL feature detect proposal + + // We do a soft detect which may false positive in order to avoid + // an expensive context creation: bugzil.la/732441 + + tests['webgl'] = function() { + return !!window.WebGLRenderingContext; + }; + + /* + * The Modernizr.touch test only indicates if the browser supports + * touch events, which does not necessarily reflect a touchscreen + * device, as evidenced by tablets running Windows 7 or, alas, + * the Palm Pre / WebOS (touch) phones. + * + * Additionally, Chrome (desktop) used to lie about its support on this, + * but that has since been rectified: crbug.com/36415 + * + * We also test for Firefox 4 Multitouch Support. + * + * For more info, see: modernizr.github.com/Modernizr/touch.html + */ + + tests['touch'] = function() { + var bool; + + if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { + bool = true; + } else { + injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { + bool = node.offsetTop === 9; + }); + } + + return bool; + }; + + + // geolocation is often considered a trivial feature detect... + // Turns out, it's quite tricky to get right: + // + // Using !!navigator.geolocation does two things we don't want. It: + // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 + // 2. Disables page caching in WebKit: webk.it/43956 + // + // Meanwhile, in Firefox < 8, an about:config setting could expose + // a false positive that would throw an exception: bugzil.la/688158 + + tests['geolocation'] = function() { + return 'geolocation' in navigator; + }; + + + tests['postmessage'] = function() { + return !!window.postMessage; + }; + + + // Chrome incognito mode used to throw an exception when using openDatabase + // It doesn't anymore. + tests['websqldatabase'] = function() { + return !!window.openDatabase; + }; + + // Vendors had inconsistent prefixing with the experimental Indexed DB: + // - Webkit's implementation is accessible through webkitIndexedDB + // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB + // For speed, we don't test the legacy (and beta-only) indexedDB + tests['indexedDB'] = function() { + return !!testPropsAll("indexedDB", window); + }; + + // documentMode logic from YUI to filter out IE8 Compat Mode + // which false positives. + tests['hashchange'] = function() { + return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); + }; + + // Per 1.6: + // This used to be Modernizr.historymanagement but the longer + // name has been deprecated in favor of a shorter and property-matching one. + // The old API is still available in 1.6, but as of 2.0 will throw a warning, + // and in the first release thereafter disappear entirely. + tests['history'] = function() { + return !!(window.history && history.pushState); + }; + + tests['draganddrop'] = function() { + var div = document.createElement('div'); + return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); + }; + + // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 + // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. + // FF10 still uses prefixes, so check for it until then. + // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ + tests['websockets'] = function() { + return 'WebSocket' in window || 'MozWebSocket' in window; + }; + + + // css-tricks.com/rgba-browser-support/ + tests['rgba'] = function() { + // Set an rgba() color and check the returned value + + setCss('background-color:rgba(150,255,150,.5)'); + + return contains(mStyle.backgroundColor, 'rgba'); + }; + + tests['hsla'] = function() { + // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, + // except IE9 who retains it as hsla + + setCss('background-color:hsla(120,40%,100%,.5)'); + + return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); + }; + + tests['multiplebgs'] = function() { + // Setting multiple images AND a color on the background shorthand property + // and then querying the style.background property value for the number of + // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! + + setCss('background:url(https://),url(https://),red url(https://)'); + + // If the UA supports multiple backgrounds, there should be three occurrences + // of the string "url(" in the return value for elemStyle.background + + return (/(url\s*\(.*?){3}/).test(mStyle.background); + }; + + + + // this will false positive in Opera Mini + // github.com/Modernizr/Modernizr/issues/396 + + tests['backgroundsize'] = function() { + return testPropsAll('backgroundSize'); + }; + + tests['borderimage'] = function() { + return testPropsAll('borderImage'); + }; + + + // Super comprehensive table about all the unique implementations of + // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance + + tests['borderradius'] = function() { + return testPropsAll('borderRadius'); + }; + + // WebOS unfortunately false positives on this test. + tests['boxshadow'] = function() { + return testPropsAll('boxShadow'); + }; + + // FF3.0 will false positive on this test + tests['textshadow'] = function() { + return document.createElement('div').style.textShadow === ''; + }; + + + tests['opacity'] = function() { + // Browsers that actually have CSS Opacity implemented have done so + // according to spec, which means their return values are within the + // range of [0.0,1.0] - including the leading zero. + + setCssAll('opacity:.55'); + + // The non-literal . in this regex is intentional: + // German Chrome returns this value as 0,55 + // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 + return (/^0.55$/).test(mStyle.opacity); + }; + + + // Note, Android < 4 will pass this test, but can only animate + // a single property at a time + // daneden.me/2011/12/putting-up-with-androids-bullshit/ + tests['cssanimations'] = function() { + return testPropsAll('animationName'); + }; + + + tests['csscolumns'] = function() { + return testPropsAll('columnCount'); + }; + + + tests['cssgradients'] = function() { + /** + * For CSS Gradients syntax, please see: + * webkit.org/blog/175/introducing-css-gradients/ + * developer.mozilla.org/en/CSS/-moz-linear-gradient + * developer.mozilla.org/en/CSS/-moz-radial-gradient + * dev.w3.org/csswg/css3-images/#gradients- + */ + + var str1 = 'background-image:', + str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', + str3 = 'linear-gradient(left top,#9f9, white);'; + + setCss( + // legacy webkit syntax (FIXME: remove when syntax not in use anymore) + (str1 + '-webkit- '.split(' ').join(str2 + str1) + + // standard syntax // trailing 'background-image:' + prefixes.join(str3 + str1)).slice(0, -str1.length) + ); + + return contains(mStyle.backgroundImage, 'gradient'); + }; + + + tests['cssreflections'] = function() { + return testPropsAll('boxReflect'); + }; + + + tests['csstransforms'] = function() { + return !!testPropsAll('transform'); + }; + + + tests['csstransforms3d'] = function() { + + var ret = !!testPropsAll('perspective'); + + // Webkit's 3D transforms are passed off to the browser's own graphics renderer. + // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in + // some conditions. As a result, Webkit typically recognizes the syntax but + // will sometimes throw a false positive, thus we must do a more thorough check: + if ( ret && 'webkitPerspective' in docElement.style ) { + + // Webkit allows this media query to succeed only if the feature is enabled. + // `@media (transform-3d),(-webkit-transform-3d){ ... }` + injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { + ret = node.offsetLeft === 9 && node.offsetHeight === 3; + }); + } + return ret; + }; + + + tests['csstransitions'] = function() { + return testPropsAll('transition'); + }; + + + /*>>fontface*/ + // @font-face detection routine by Diego Perini + // javascript.nwbox.com/CSSSupport/ + + // false positives: + // WebOS github.com/Modernizr/Modernizr/issues/342 + // WP7 github.com/Modernizr/Modernizr/issues/538 + tests['fontface'] = function() { + var bool; + + injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { + var style = document.getElementById('smodernizr'), + sheet = style.sheet || style.styleSheet, + cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; + + bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; + }); + + return bool; + }; + /*>>fontface*/ + + // CSS generated content detection + tests['generatedcontent'] = function() { + var bool; + + injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { + bool = node.offsetHeight >= 3; + }); + + return bool; + }; + + + + // These tests evaluate support of the video/audio elements, as well as + // testing what types of content they support. + // + // We're using the Boolean constructor here, so that we can extend the value + // e.g. Modernizr.video // true + // Modernizr.video.ogg // 'probably' + // + // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 + // thx to NielsLeenheer and zcorpan + + // Note: in some older browsers, "no" was a return value instead of empty string. + // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 + // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 + + tests['video'] = function() { + var elem = document.createElement('video'), + bool = false; + + // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); + + // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 + bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); + + bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); + } + + } catch(e) { } + + return bool; + }; + + tests['audio'] = function() { + var elem = document.createElement('audio'), + bool = false; + + try { + if ( bool = !!elem.canPlayType ) { + bool = new Boolean(bool); + bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); + bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); + + // Mimetypes accepted: + // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements + // bit.ly/iphoneoscodecs + bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); + bool.m4a = ( elem.canPlayType('audio/x-m4a;') || + elem.canPlayType('audio/aac;')) .replace(/^no$/,''); + } + } catch(e) { } + + return bool; + }; + + + // In FF4, if disabled, window.localStorage should === null. + + // Normally, we could not test that directly and need to do a + // `('localStorage' in window) && ` test first because otherwise Firefox will + // throw bugzil.la/365772 if cookies are disabled + + // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem + // will throw the exception: + // QUOTA_EXCEEDED_ERRROR DOM Exception 22. + // Peculiarly, getItem and removeItem calls do not throw. + + // Because we are forced to try/catch this, we'll go aggressive. + + // Just FWIW: IE8 Compat mode supports these features completely: + // www.quirksmode.org/dom/html5.html + // But IE8 doesn't support either with local files + + tests['localstorage'] = function() { + try { + localStorage.setItem(mod, mod); + localStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + tests['sessionstorage'] = function() { + try { + sessionStorage.setItem(mod, mod); + sessionStorage.removeItem(mod); + return true; + } catch(e) { + return false; + } + }; + + + tests['webworkers'] = function() { + return !!window.Worker; + }; + + + tests['applicationcache'] = function() { + return !!window.applicationCache; + }; + + + // Thanks to Erik Dahlstrom + tests['svg'] = function() { + return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; + }; + + // specifically for SVG inline in HTML, not within XHTML + // test page: paulirish.com/demo/inline-svg + tests['inlinesvg'] = function() { + var div = document.createElement('div'); + div.innerHTML = ''; + return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; + }; + + // SVG SMIL animation + tests['smil'] = function() { + return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); + }; + + // This test is only for clip paths in SVG proper, not clip paths on HTML content + // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg + + // However read the comments to dig into applying SVG clippaths to HTML content here: + // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 + tests['svgclippaths'] = function() { + return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); + }; + + /*>>webforms*/ + // input features and input types go directly onto the ret object, bypassing the tests loop. + // Hold this guy to execute in a moment. + function webforms() { + /*>>input*/ + // Run through HTML5's new input attributes to see if the UA understands any. + // We're using f which is the element created early on + // Mike Taylr has created a comprehensive resource for testing these attributes + // when applied to all input types: + // miketaylr.com/code/input-type-attr.html + // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + + // Only input placeholder is tested while textarea's placeholder is not. + // Currently Safari 4 and Opera 11 have support only for the input placeholder + // Both tests are available in feature-detects/forms-placeholder.js + Modernizr['input'] = (function( props ) { + for ( var i = 0, len = props.length; i < len; i++ ) { + attrs[ props[i] ] = !!(props[i] in inputElem); + } + if (attrs.list){ + // safari false positive's on datalist: webk.it/74252 + // see also github.com/Modernizr/Modernizr/issues/146 + attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); + } + return attrs; + })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); + /*>>input*/ + + /*>>inputtypes*/ + // Run through HTML5's new input types to see if the UA understands any. + // This is put behind the tests runloop because it doesn't return a + // true/false like all the other tests; instead, it returns an object + // containing each input type with its corresponding true/false value + + // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ + Modernizr['inputtypes'] = (function(props) { + + for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { + + inputElem.setAttribute('type', inputElemType = props[i]); + bool = inputElem.type !== 'text'; + + // We first check to see if the type we give it sticks.. + // If the type does, we feed it a textual value, which shouldn't be valid. + // If the value doesn't stick, we know there's input sanitization which infers a custom UI + if ( bool ) { + + inputElem.value = smile; + inputElem.style.cssText = 'position:absolute;visibility:hidden;'; + + if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { + + docElement.appendChild(inputElem); + defaultView = document.defaultView; + + // Safari 2-4 allows the smiley as a value, despite making a slider + bool = defaultView.getComputedStyle && + defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && + // Mobile android web browser has false positive, so must + // check the height to see if the widget is actually there. + (inputElem.offsetHeight !== 0); + + docElement.removeChild(inputElem); + + } else if ( /^(search|tel)$/.test(inputElemType) ){ + // Spec doesn't define any special parsing or detectable UI + // behaviors so we pass these through as true + + // Interestingly, opera fails the earlier test, so it doesn't + // even make it here. + + } else if ( /^(url|email)$/.test(inputElemType) ) { + // Real url and email support comes with prebaked validation. + bool = inputElem.checkValidity && inputElem.checkValidity() === false; + + } else { + // If the upgraded input compontent rejects the :) text, we got a winner + bool = inputElem.value != smile; + } + } + + inputs[ props[i] ] = !!bool; + } + return inputs; + })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); + /*>>inputtypes*/ + } + /*>>webforms*/ + + + // End of test definitions + // ----------------------- + + + + // Run through all tests and detect their support in the current UA. + // todo: hypothetically we could be doing an array of tests and use a basic loop here. + for ( var feature in tests ) { + if ( hasOwnProp(tests, feature) ) { + // run the test, throw the return value into the Modernizr, + // then based on that boolean, define an appropriate className + // and push it into an array of classes we'll join later. + featureName = feature.toLowerCase(); + Modernizr[featureName] = tests[feature](); + + classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); + } + } + + /*>>webforms*/ + // input tests need to run. + Modernizr.input || webforms(); + /*>>webforms*/ + + + /** + * addTest allows the user to define their own feature tests + * the result will be added onto the Modernizr object, + * as well as an appropriate className set on the html element + * + * @param feature - String naming the feature + * @param test - Function returning true if feature is supported, false if not + */ + Modernizr.addTest = function ( feature, test ) { + if ( typeof feature == 'object' ) { + for ( var key in feature ) { + if ( hasOwnProp( feature, key ) ) { + Modernizr.addTest( key, feature[ key ] ); + } + } + } else { + + feature = feature.toLowerCase(); + + if ( Modernizr[feature] !== undefined ) { + // we're going to quit if you're trying to overwrite an existing test + // if we were to allow it, we'd do this: + // var re = new RegExp("\\b(no-)?" + feature + "\\b"); + // docElement.className = docElement.className.replace( re, '' ); + // but, no rly, stuff 'em. + return Modernizr; + } + + test = typeof test == 'function' ? test() : test; + + if (typeof enableClasses !== "undefined" && enableClasses) { + docElement.className += ' ' + (test ? '' : 'no-') + feature; + } + Modernizr[feature] = test; + + } + + return Modernizr; // allow chaining. + }; + + + // Reset modElem.cssText to nothing to reduce memory footprint. + setCss(''); + modElem = inputElem = null; + + /*>>shiv*/ + /** + * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + */ + ;(function(window, document) { + /*jshint evil:true */ + /** version */ + var version = '3.7.0'; + + /** Preset options */ + var options = window.html5 || {}; + + /** Used to skip problem elements */ + var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; + + /** Not all elements can be cloned in IE **/ + var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; + + /** Detect whether the browser supports default html5 styles */ + var supportsHtml5Styles; + + /** Name of the expando, to work with multiple documents or to re-shiv one document */ + var expando = '_html5shiv'; + + /** The id for the the documents expando */ + var expanID = 0; + + /** Cached data for each document */ + var expandoData = {}; + + /** Detect whether the browser supports unknown elements */ + var supportsUnknownElements; + + (function() { + try { + var a = document.createElement('a'); + a.innerHTML = ''; + //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles + supportsHtml5Styles = ('hidden' in a); + + supportsUnknownElements = a.childNodes.length == 1 || (function() { + // assign a false positive if unable to shiv + (document.createElement)('a'); + var frag = document.createDocumentFragment(); + return ( + typeof frag.cloneNode == 'undefined' || + typeof frag.createDocumentFragment == 'undefined' || + typeof frag.createElement == 'undefined' + ); + }()); + } catch(e) { + // assign a false positive if detection fails => unable to shiv + supportsHtml5Styles = true; + supportsUnknownElements = true; + } + + }()); + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a style sheet with the given CSS text and adds it to the document. + * @private + * @param {Document} ownerDocument The document. + * @param {String} cssText The CSS text. + * @returns {StyleSheet} The style element. + */ + function addStyleSheet(ownerDocument, cssText) { + var p = ownerDocument.createElement('p'), + parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; + + p.innerHTML = 'x'; + return parent.insertBefore(p.lastChild, parent.firstChild); + } + + /** + * Returns the value of `html5.elements` as an array. + * @private + * @returns {Array} An array of shived element node names. + */ + function getElements() { + var elements = html5.elements; + return typeof elements == 'string' ? elements.split(' ') : elements; + } + + /** + * Returns the data associated to the given document + * @private + * @param {Document} ownerDocument The document. + * @returns {Object} An object of data. + */ + function getExpandoData(ownerDocument) { + var data = expandoData[ownerDocument[expando]]; + if (!data) { + data = {}; + expanID++; + ownerDocument[expando] = expanID; + expandoData[expanID] = data; + } + return data; + } + + /** + * returns a shived element for the given nodeName and document + * @memberOf html5 + * @param {String} nodeName name of the element + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived element. + */ + function createElement(nodeName, ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createElement(nodeName); + } + if (!data) { + data = getExpandoData(ownerDocument); + } + var node; + + if (data.cache[nodeName]) { + node = data.cache[nodeName].cloneNode(); + } else if (saveClones.test(nodeName)) { + node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); + } else { + node = data.createElem(nodeName); + } + + // Avoid adding some elements to fragments in IE < 9 because + // * Attributes like `name` or `type` cannot be set/changed once an element + // is inserted into a document/fragment + // * Link elements with `src` attributes that are inaccessible, as with + // a 403 response, will cause the tab/window to crash + // * Script elements appended to fragments will execute when their `src` + // or `text` property is set + return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; + } + + /** + * returns a shived DocumentFragment for the given document + * @memberOf html5 + * @param {Document} ownerDocument The context document. + * @returns {Object} The shived DocumentFragment. + */ + function createDocumentFragment(ownerDocument, data){ + if (!ownerDocument) { + ownerDocument = document; + } + if(supportsUnknownElements){ + return ownerDocument.createDocumentFragment(); + } + data = data || getExpandoData(ownerDocument); + var clone = data.frag.cloneNode(), + i = 0, + elems = getElements(), + l = elems.length; + for(;i>shiv*/ + + // Assign private properties to the return object with prefix + Modernizr._version = version; + + // expose these for the plugin API. Look in the source for how to join() them against your input + /*>>prefixes*/ + Modernizr._prefixes = prefixes; + /*>>prefixes*/ + /*>>domprefixes*/ + Modernizr._domPrefixes = domPrefixes; + Modernizr._cssomPrefixes = cssomPrefixes; + /*>>domprefixes*/ + + /*>>mq*/ + // Modernizr.mq tests a given media query, live against the current state of the window + // A few important notes: + // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false + // * A max-width or orientation query will be evaluated against the current state, which may change later. + // * You must specify values. Eg. If you are testing support for the min-width media query use: + // Modernizr.mq('(min-width:0)') + // usage: + // Modernizr.mq('only screen and (max-width:768)') + Modernizr.mq = testMediaQuery; + /*>>mq*/ + + /*>>hasevent*/ + // Modernizr.hasEvent() detects support for a given event, with an optional element to test on + // Modernizr.hasEvent('gesturestart', elem) + Modernizr.hasEvent = isEventSupported; + /*>>hasevent*/ + + /*>>testprop*/ + // Modernizr.testProp() investigates whether a given style property is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testProp('pointerEvents') + Modernizr.testProp = function(prop){ + return testProps([prop]); + }; + /*>>testprop*/ + + /*>>testallprops*/ + // Modernizr.testAllProps() investigates whether a given style property, + // or any of its vendor-prefixed variants, is recognized + // Note that the property names must be provided in the camelCase variant. + // Modernizr.testAllProps('boxSizing') + Modernizr.testAllProps = testPropsAll; + /*>>testallprops*/ + + + /*>>teststyles*/ + // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards + // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) + Modernizr.testStyles = injectElementWithStyles; + /*>>teststyles*/ + + + /*>>prefixed*/ + // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input + // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' + + // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. + // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: + // + // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); + + // If you're trying to ascertain which transition end event to bind to, you might do something like... + // + // var transEndEventNames = { + // 'WebkitTransition' : 'webkitTransitionEnd', + // 'MozTransition' : 'transitionend', + // 'OTransition' : 'oTransitionEnd', + // 'msTransition' : 'MSTransitionEnd', + // 'transition' : 'transitionend' + // }, + // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; + + Modernizr.prefixed = function(prop, obj, elem){ + if(!obj) { + return testPropsAll(prop, 'pfx'); + } else { + // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' + return testPropsAll(prop, obj, elem); + } + }; + /*>>prefixed*/ + + + /*>>cssclasses*/ + // Remove "no-js" class from element, if it exists: + docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + + + // Add the new classes to the element. + (enableClasses ? ' js ' + classes.join(' ') : ''); + /*>>cssclasses*/ + + return Modernizr; + +})(this, this.document); diff --git a/templates/index.html b/templates/index.html index 5e75bf0..0f33f39 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,5 +1,30 @@ {% extends 'template.html' %} +{% load staticfiles %} {% block content %} + +
+

+The Montreal Game Jam is the Montreal chapter for the Global Game Jam. This event encourages participants from all over the world to create a video game + prototype based on a theme over the course of a weekend. It’s more than 10 684 participants in 47 countries giving body and soul to complete their objectives. + 2209 games were created last year. The organization of the Montreal Game Jam is the union of multiple universities and professionals from Montreal whose mandate + is to promote Montreal video game industry.

+
+
+

+The Montreal Game Jam is the Montreal chapter for the Global Game Jam. This event encourages participants from all over the world to create a video game + prototype based on a theme over the course of a weekend. It’s more than 10 684 participants in 47 countries giving body and soul to complete their objectives. + 2209 games were created last year. The organization of the Montreal Game Jam is the union of multiple universities and professionals from Montreal whose mandate + is to promote Montreal video game industry.

+
+
+

+The Montreal Game Jam is the Montreal chapter for the Global Game Jam. This event encourages participants from all over the world to create a video game + prototype based on a theme over the course of a weekend. It’s more than 10 684 participants in 47 countries giving body and soul to complete their objectives. + 2209 games were created last year. The organization of the Montreal Game Jam is the union of multiple universities and professionals from Montreal whose mandate + is to promote Montreal video game industry.

+
+
+
{% endblock %} diff --git a/templates/template.html b/templates/template.html index 2bd0c4a..b524bf7 100644 --- a/templates/template.html +++ b/templates/template.html @@ -14,14 +14,13 @@ - - + - + @@ -70,5 +69,7 @@ + +