diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..a6168c88c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,119 @@ +# Contributing to PHP The Right Way + +Enjoy [PHP The Right Way](http://phptherightway.com) and want to get +involved? Great! There are plenty of ways you can help out. + +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of +the developers managing and developing this open source project. In return, +they should reciprocate that respect in addressing your issue or assessing +patches and features. + + +## Using the issue tracker + +The [issue tracker](https://github.com/codeguy/php-the-right-way/issues) is +the preferred channel for changes: spelling mistakes, wording changes, new +content and generally [submitting pull requests](#pull-requests), but please +respect the following restrictions: + +* Please **do not** use the issue tracker for personal support requests (use + [Stack Overflow](http://stackoverflow.com/questions/tagged/php) or IRC). + +* Please **do not** derail or troll issues. Keep the discussion on topic and + respect the opinions of others. + + + +## Pull Requests + +Pull requests are a great way to add new content to PHP The Right Way, as well +as updating any browser issues or other style changes. Pretty much any sort of +change is accepted if seen as constructive. + +Adhering to the following this process is the best way to get your work +included in the project: + +1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, + and configure the remotes: + + ```bash + # Clone your fork of the repo into the current directory + git clone https://github.com//php-the-right-way.git + # Navigate to the newly cloned directory + cd php-the-right-way + # Assign the original repo to a remote called "upstream" + git remote add upstream https://github.com/codeguy/php-the-right-way.git + ``` + +2. If you cloned a while ago, get the latest changes from upstream: + + ```bash + git checkout gh-pages + git pull upstream gh-pages + ``` + +3. Create a new topic branch (off the main project development branch) to + contain your change or fix: + + ```bash + git checkout -b + ``` + +4. Install the [Jekyll](https://github.com/jekyll/jekyll/) gem and dependencies to preview locally: + + ```bash + # Install the needed gems through Bundler + bundle install + # Run the local server + bundle execute jekyll s + ``` + +5. Commit your changes in logical chunks. Please adhere to these [git commit + message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) + or your content is unlikely be merged into the main project. Use Git's + [interactive rebase](https://help.github.com/articles/interactive-rebase) + feature to tidy up your commits before making them public. + +6. Locally merge (or rebase) the upstream development branch into your topic branch: + + ```bash + git pull [--rebase] upstream gh-pages + ``` + +7. Push your topic branch up to your fork: + + ```bash + git push origin + ``` + +8. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) + with a clear title and description. + + +## Contribution Agreement and Usage + +By submitting a pull request to this repository, you agree to allow the project +owners to license your work under the the terms of the [Creative Commons Attribution-NonCommercial-ShareAlike +3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/). + +The same content and license will be used for all PHP The Right Way publications, +including - but not limited to: + +* [phptherightway.com](http://phptherightway.com) +* Translations of phptherightway.com +* [LeanPub: PHP The Right Way](https://leanpub.com/phptherightway/) +* Translations of "LeanPub: PHP The Right Way" + +All content is completely free now, and always will be. + +## Contributor Style Guide + +1. Use American English spelling (*primary English repo only*) +2. Use four (4) spaces to indent text; do not use tabs +3. Wrap all text to 120 characters +4. Code samples should adhere to PSR-1 or higher +5. Use [GitHub Flavored Markdown](http://github.github.com/github-flavored-markdown/) for all content +6. Use language agnostic urls when referring to external websites such as the [php.net](http://php.net/urlhowto.php) manual diff --git a/Gemfile b/Gemfile new file mode 100644 index 000000000..053c27dc3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'github-pages' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..c68e4ec98 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,126 @@ +GEM + remote: https://rubygems.org/ + specs: + RedCloth (4.2.9) + activesupport (4.2.5.1) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + addressable (2.3.8) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.10.0) + colorator (0.1) + ethon (0.8.1) + ffi (>= 1.3.0) + execjs (2.6.0) + faraday (0.9.2) + multipart-post (>= 1.2, < 3) + ffi (1.9.10) + gemoji (2.1.0) + github-pages (48) + RedCloth (= 4.2.9) + github-pages-health-check (= 0.6.1) + jekyll (= 3.0.3) + jekyll-coffeescript (= 1.0.1) + jekyll-feed (= 0.3.1) + jekyll-gist (= 1.4.0) + jekyll-mentions (= 1.0.0) + jekyll-paginate (= 1.1.0) + jekyll-redirect-from (= 0.9.1) + jekyll-sass-converter (= 1.3.0) + jekyll-seo-tag (= 1.0.0) + jekyll-sitemap (= 0.10.0) + jekyll-textile-converter (= 0.1.0) + jemoji (= 0.5.1) + kramdown (= 1.9.0) + liquid (= 3.0.6) + mercenary (~> 0.3) + rdiscount (= 2.1.8) + redcarpet (= 3.3.3) + rouge (= 1.10.1) + terminal-table (~> 1.4) + github-pages-health-check (0.6.1) + addressable (~> 2.3) + net-dns (~> 0.8) + public_suffix (~> 1.4) + typhoeus (~> 0.7) + html-pipeline (2.3.0) + activesupport (>= 2, < 5) + nokogiri (>= 1.4) + i18n (0.7.0) + jekyll (3.0.3) + colorator (~> 0.1) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.3) + liquid (~> 3.0) + mercenary (~> 0.3.3) + rouge (~> 1.7) + safe_yaml (~> 1.0) + jekyll-coffeescript (1.0.1) + coffee-script (~> 2.2) + jekyll-feed (0.3.1) + jekyll-gist (1.4.0) + octokit (~> 4.2) + jekyll-mentions (1.0.0) + html-pipeline (~> 2.2) + jekyll (~> 3.0) + jekyll-paginate (1.1.0) + jekyll-redirect-from (0.9.1) + jekyll (>= 2.0) + jekyll-sass-converter (1.3.0) + sass (~> 3.2) + jekyll-seo-tag (1.0.0) + jekyll (>= 2.0) + jekyll-sitemap (0.10.0) + jekyll-textile-converter (0.1.0) + RedCloth (~> 4.0) + jekyll-watch (1.3.1) + listen (~> 3.0) + jemoji (0.5.1) + gemoji (~> 2.0) + html-pipeline (~> 2.2) + jekyll (>= 2.0) + json (1.8.3) + kramdown (1.9.0) + liquid (3.0.6) + listen (3.0.6) + rb-fsevent (>= 0.9.3) + rb-inotify (>= 0.9.7) + mercenary (0.3.5) + mini_portile2 (2.0.0) + minitest (5.8.4) + multipart-post (2.0.0) + net-dns (0.8.0) + nokogiri (1.6.7.2) + mini_portile2 (~> 2.0.0.rc2) + octokit (4.2.0) + sawyer (~> 0.6.0, >= 0.5.3) + public_suffix (1.5.3) + rb-fsevent (0.9.7) + rb-inotify (0.9.7) + ffi (>= 0.5.0) + rdiscount (2.1.8) + redcarpet (3.3.3) + rouge (1.10.1) + safe_yaml (1.0.4) + sass (3.4.21) + sawyer (0.6.0) + addressable (~> 2.3.5) + faraday (~> 0.8, < 0.10) + terminal-table (1.5.2) + thread_safe (0.3.5) + typhoeus (0.8.0) + ethon (>= 0.8.0) + tzinfo (1.2.2) + thread_safe (~> 0.1) + +PLATFORMS + ruby + +DEPENDENCIES + github-pages diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 000000000..a9d3d91c3 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,48 @@ +module.exports = function(grunt) { + // Project configuration + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + less: { + dist: { + options: { + cleancss: true, + compress: true, + ieCompat: true + }, + files: { + "css/all.css": "less/all.less" + } + } + }, + postcss: { + options: { + map: true, + processors: [ + require('autoprefixer')({ + browsers: ['last 2 versions', 'ie 9'] + }) + ] + }, + dist: { + src: 'css/all.css' + } + }, + watch: { + less: { + files: ['less/**/*.less'], + tasks: ['less:dist', 'postcss:dist'], + options: { + spawn: false + } + } + } + }); + + // Load plugins + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-postcss'); + + // Default task(s) + grunt.registerTask('default', ['less', 'postcss:dist']); +}; diff --git a/README.md b/README.md index 628f8ef35..ec7a88fcb 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ _PHP: Do Jeito Certo_ possui banners que você pode usar em seu site. Para mostr ## Guia de Estilo para o Contribuidor 1. Use a ortografia do Português do Brasil neste repositório. -2. Use quatro (4) espaços para indentar o texto; não use TAB. +2. Use quatro (4) espaços para identar o texto; não use TAB. 3. Limite o texto em 120 caracteres. 4. Os exemplos de código devem seguir a [PSR-1](http://www.php-fig.org/psr/psr-1/) ou superior. @@ -56,7 +56,6 @@ _PHP: Do Jeito Certo_ possui banners que você pode usar em seu site. Para mostr * [Turco](http://hkulekci.github.io/php-the-right-way/) * [Ucraniano](http://iflista.github.com/php-the-right-way) - ## Traduções Se você tem interesse em traduzir _PHP: The Right Way_, faça o fork do repo no GitHub e publique seu fork para sua diff --git a/Vagrantfile b/Vagrantfile deleted file mode 100644 index 3585025f6..000000000 --- a/Vagrantfile +++ /dev/null @@ -1,16 +0,0 @@ -Vagrant.configure("2") do |config| - config.vm.box = "precise32" - config.vm.box_url = "http://files.vagrantup.com/precise32.box" - config.vm.network :forwarded_port, guest: 4000, host: 4000 - - $script = < + + + + -
- - - Faça fork no GitHub - - +
{{ content }} -
- - - + + + diff --git a/_layouts/page.html b/_layouts/page.html index c552773e7..01f896b3f 100644 --- a/_layouts/page.html +++ b/_layouts/page.html @@ -5,45 +5,59 @@ {% if page.title %}{{ page.title }} - {% endif %}PHP: Do Jeito Certo - + + + - - - + + + + + + +
+ {{ content }} +
+ + - - -
- -
Do Jeito Certo.
- Voltar ao início - - Faça fork no GitHub - -
-
-
Você está lendo conteúdo extra sobre…
- {{ content }} - -
diff --git a/css/all.css b/css/all.css new file mode 100644 index 000000000..2e8e86613 --- /dev/null +++ b/css/all.css @@ -0,0 +1,2 @@ +*{box-sizing:border-box}body{font-size:24px;line-height:32px;text-rendering:optimizeLegibility}h1,h2,h3,h4{font-family:georgia,serif}h1,.alpha{position:relative;font-size:48px;font-weight:normal;line-height:50px;text-align:center}h2,.beta{font-size:32px;font-weight:normal;line-height:36px}h3,.gamma{font-size:24px;font-weight:bold;line-height:30px}blockquote{border-left:3px solid #ccc;padding-left:20px;color:#777;font-style:italic;word-wrap:break-word}a{color:#4f5b93}a:hover{color:#8892bf}.back-to-top{text-align:center}.back-to-top a{background:#4f5b93;border-radius:3px;display:inline-block;height:40px;padding:0 20px;transition:all .1s ease;color:white;font-family:verdana,sans-serif;font-size:13px;line-height:40px;text-decoration:none;text-transform:uppercase}.back-to-top a:hover{background:#8892bf}img{max-width:100%}pre,code{color:#444;font-family:"Source Code Pro",Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace;font-size:90%}a pre,a code{color:inherit}pre{background:#f7f7f7;border:1px solid #eee;border-radius:3px;display:block;overflow:auto;padding:20px;width:100%}@media (max-width:767px){body{font-size:18px;line-height:24px}h1,.alpha{font-size:36px;line-height:38px}h2,.beta{font-size:24px;line-height:28px}h3,.gamma{font-size:18px;line-height:23px}blockquote{margin-left:0}ul,ol{padding-left:1em}pre{padding:5px 10px}}@media (max-width:360px){body{font-size:16px;line-height:21px}h1,.alpha{font-size:28px;line-height:30px}h2,.beta{font-size:20px;line-height:23px}h3,.gamma{font-size:16px;line-height:20px}}.site-header{padding-top:40px;margin-bottom:40px;text-align:center}.site-header h1{margin:0;font-size:72px;line-height:60px}.site-header h1 em{display:block;font-size:34px;font-style:normal}.site-header h1 a{color:#333;text-decoration:none}.site-header h1 a:hover{color:#8892bf}.site-header .build-date{margin-bottom:10px;color:#999;font-family:verdana,sans-serif;font-size:11px;text-transform:uppercase}.site-header .btn-share{background:#8892bf;border-radius:3px;display:inline-block;height:30px;padding:0 20px;vertical-align:baseline;color:white;font-family:verdana,sans-serif;font-size:12px;line-height:30px;text-decoration:none;text-transform:uppercase}.site-header .fork-me{background-image:url(data:image/png;base64,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);background-position:top right;background-repeat:no-repeat;background-size:contain;height:100px;width:100px;position:absolute;top:0;right:0;z-index:100;width:120px}.site-navigation,.site-content,.site-footer{margin:0 auto;max-width:840px;width:92%}.site-navigation{-webkit-columns:3;-moz-columns:3;columns:3;-webkit-column-gap:40px;-moz-column-gap:40px;column-gap:40px}.site-navigation input[type="checkbox"],.site-navigation label{display:none}.site-navigation ul{list-style:none;margin:0;padding:0}.site-navigation ul li{margin-bottom:20px;font-size:22px;line-height:23px}.site-navigation ul li a{display:block;color:#444;font-weight:700;text-decoration:none}.site-navigation ul li a:hover{color:#8892bf}.site-navigation ul li ul{padding-top:8px}.site-navigation ul li li{margin-bottom:6px;font-size:18px}.site-navigation ul li li a{border:none;color:#777;font-weight:normal}.site-navigation li{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid}@media (max-width:820px){.site-navigation{-webkit-columns:2;-moz-columns:2;columns:2}}@media (max-width:560px){.site-navigation{-webkit-columns:1;-moz-columns:1;columns:1}}@media (max-width:375px){.site-navigation{background:rgba(255,255,255,0.95);-webkit-columns:1;-moz-columns:1;columns:1;max-height:100vh;position:fixed;bottom:0;left:0;z-index:100}.site-navigation label{background:#4f5b93;box-sizing:border-box;display:block;height:40px;padding:0 10px;width:100vh;position:absolute;bottom:0;left:0;color:white;font-family:verdana,sans-serif;font-size:13px;line-height:40px;text-transform:uppercase;z-index:2}.site-navigation>ul{background:rgba(255,255,255,0.96);border-top:3px solid #8892bf;box-shadow:rgba(0,0,0,0.25) 0 -5px 10px;box-sizing:border-box;padding:20px;overflow:auto;-webkit-overflow-scrolling:touch;position:absolute;left:0;bottom:40px;height:50vh;width:100vh;-webkit-transform:translate(0, 100vh);-ms-transform:translate(0, 100vh);transform:translate(0, 100vh);transition:all .2s ease;z-index:1}.site-navigation input[type="checkbox"]:checked~ul{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}}.site-content h1{padding-top:40px;position:relative}.site-content h1:after{border:1px solid #ddd;border-bottom:none;content:"";display:block;height:8px;position:absolute;left:0;top:0;width:100%}.site-content.chapters{counter-reset:chapter}.site-content.chapters h1{counter-increment:chapter;padding-top:60px}.site-content.chapters h1:before{display:inline-block;content:"Chapter " counter(chapter) ".";position:absolute;top:30px;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);color:#999;font-size:12px;letter-spacing:1px;line-height:20px;text-transform:uppercase;text-align:center}.site-content #welcome ul{-webkit-columns:3;-moz-columns:3;columns:3;-webkit-column-gap:30px;-moz-column-gap:30px;column-gap:30px;list-style-position:inside}.site-content .back-to-top{margin-bottom:60px}@media (max-width:870px){.site-content #welcome ul{-webkit-columns:2;-moz-columns:2;columns:2}}@media (max-width:600px){.site-content #welcome ul{-webkit-columns:1;-moz-columns:1;columns:1}}.site-footer{border-top:1px solid #ccc;margin:60px auto 0 auto;padding:40px 20px;font-family:verdana,sans-serif;font-size:16px;text-align:center}.site-footer .cc-badge{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAw1BMVEX///8AAAAAAACrsar///8oKSjR1NAODg4jHyDLz8pAPz/f399wcHBQUFBgYGDJzcjEyMN5fHkwMDC9wry4vbeAgIDw8PDBxcDO0c3M0MyUmJPGysW6v7q/v7+fn5/T1tKvtK61urSxt7C/w76zuLKhpKDk5OSRk5F2c3RQUVAbGxuts6yEhoR9fnxDREMgICDW1dXJyMirq6qvr68wLS3Pz8+Rj4+Pj4+LioqEgYJaV1i6ubmbl5meoJ1dXl06NjcZGRmWw6QEAAAAAnRSTlMMANomgjQAAAMCSURBVHjatZYJc6JAEIWznWFmOAQDguAdjUqMd0yi5vz/v2q7GTmkNusWW3kxNfJkPts3TMPVFfyIfiH3ttHwRs1623F0PYp03XHa9ebI6zRu74aDwcPDdQUBXCG3440Qq4ec91GchzqhM/J1FSEYuVguYudLASixnBM6JVPJNxqgtJts2mWHwMh1Ij6dQabZlEeKfDccDlo4xbAsA6e11KzLDoG9EXHvqVbb73Z9m+q+r4dEppLHAmomQ5k1EMmsi44CY74JV/gBU+ohWqtjzSMMY6iBjR4AfQAaTVLO87HkTDabiXIUuNnWieuaLFPgYs1cb1PJC6itUzCrwQ2mCe4bcr9EPEkdOmcsUa+Jo8B1J5wiF8s9J0/DpGQNCt9ogkbladKwwZ/DNnNMtpGfdizlMzkKjAXPQDyxMwUCZqpkMOjYBrBpNADnGDESZDxZ5w4L3uQec5A7chTYCecAPiupBzDHkr0OWHQIKBotwqCzidGI17kTSKlhzFJOyFFgvgSBQXRrhuGr4QUnCFhyzOIbMDLinZTH18y523UTsJmBdS7ARiCQjEcg2fTjBdfrzc6foqCsemwtUUbqvI43jG2lxHMyMACW6MLK7K56Lrjm46qXZNGnkE+LB5AvHjlHudtBvF3MUqcn5eGgybd88aI+AP4KlbMaSF0ERwj2ocZKlxs5k8OXeA6KzkGirICcfwI3ChvEKm6Q/bHkbLbbtXLKUQRPKx+joCGPorGttKXzxTutWrZ41mnxGrdjDcC1LTdvOZcddbndg2DZ5fZoJANbqcuNGtygWttMdvTLtxsE+1uFXp9vafO7LV0ZTE3o/S9NqBqXwLDQ+QeSC23IVG1zDtVFYLD0s0Yf+ALgk0cL+F8wLCL+Ubo18agFqdT+oDeZo/7RL53EzsGUxnvpZtoqzDm9WO6o49JXKaMIpjRCPk1v/1Me6sUc0rZZcE5/BaXtpAQGd4Bozul5BbEDAwoqB6GcrOLcLFesZOw99Yjl7Ql7oeIUXjynBP4h/djT5m+nuF33PcPucwAAAABJRU5ErkJggg==);background-position:top left;background-repeat:no-repeat;background-size:contain;display:inline-block;height:31px;width:88px}.site-footer h2{font-size:24px;font-weight:bold;line-height:30px;margin-bottom:10px}.site-footer ul{list-style:none;margin:0 0 20px 0;padding:0}.site-footer .license{color:#777;font-size:13px} +/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFsbC5jc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLGVBQWUsaUJBQWlCLGlDQUFpQyxDQUFDLFlBQVkseUJBQXlCLENBQUMsVUFBVSxrQkFBa0IsZUFBZSxtQkFBbUIsaUJBQWlCLGlCQUFpQixDQUFDLFNBQVMsZUFBZSxtQkFBbUIsZ0JBQWdCLENBQUMsVUFBVSxlQUFlLGlCQUFpQixnQkFBZ0IsQ0FBQyxXQUFXLDJCQUEyQixrQkFBa0IsV0FBVyxrQkFBa0Isb0JBQW9CLENBQUMsRUFBRSxhQUFhLENBQUMsUUFBUSxhQUFhLENBQUMsYUFBYSxpQkFBaUIsQ0FBQyxlQUFlLG1CQUFtQixrQkFBa0IscUJBQXFCLFlBQVksZUFBZSx3QkFBd0IsWUFBWSwrQkFBK0IsZUFBZSxpQkFBaUIscUJBQXFCLHdCQUF3QixDQUFDLHFCQUFxQixrQkFBa0IsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxTQUFTLFdBQVcsdU9BQXVPLGFBQWEsQ0FBQyxhQUFhLGFBQWEsQ0FBQyxJQUFJLG1CQUFtQixzQkFBc0Isa0JBQWtCLGNBQWMsY0FBYyxhQUFhLFVBQVUsQ0FBQyx5QkFBeUIsS0FBSyxlQUFlLGdCQUFnQixDQUFDLFVBQVUsZUFBZSxnQkFBZ0IsQ0FBQyxTQUFTLGVBQWUsZ0JBQWdCLENBQUMsVUFBVSxlQUFlLGdCQUFnQixDQUFDLFdBQVcsYUFBYSxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLHlCQUF5QixLQUFLLGVBQWUsZ0JBQWdCLENBQUMsVUFBVSxlQUFlLGdCQUFnQixDQUFDLFNBQVMsZUFBZSxnQkFBZ0IsQ0FBQyxVQUFVLGVBQWUsZ0JBQWdCLENBQUMsQ0FBQyxhQUFhLGlCQUFpQixtQkFBbUIsaUJBQWlCLENBQUMsZ0JBQWdCLFNBQVMsZUFBZSxnQkFBZ0IsQ0FBQyxtQkFBbUIsY0FBYyxlQUFlLGlCQUFpQixDQUFDLGtCQUFrQixXQUFXLG9CQUFvQixDQUFDLHdCQUF3QixhQUFhLENBQUMseUJBQXlCLG1CQUFtQixXQUFXLCtCQUErQixlQUFlLHdCQUF3QixDQUFDLHdCQUF3QixtQkFBbUIsa0JBQWtCLHFCQUFxQixZQUFZLGVBQWUsd0JBQXdCLFlBQVksK0JBQStCLGVBQWUsaUJBQWlCLHFCQUFxQix3QkFBd0IsQ0FBQyxzQkFBc0IseWtFQUF5a0UsOEJBQThCLDRCQUE0Qix3QkFBd0IsYUFBYSxZQUFZLGtCQUFrQixNQUFNLFFBQVEsWUFBWSxXQUFXLENBQUMsNENBQTRDLGNBQWMsZ0JBQWdCLFNBQVMsQ0FBQyxpQkFBaUIsa0JBQVUsQUFBVixlQUFVLEFBQVYsVUFBVSx3QkFBZSxBQUFmLHFCQUFlLEFBQWYsZUFBZSxDQUFDLCtEQUErRCxZQUFZLENBQUMsb0JBQW9CLGdCQUFnQixTQUFTLFNBQVMsQ0FBQyx1QkFBdUIsbUJBQW1CLGVBQWUsZ0JBQWdCLENBQUMseUJBQXlCLGNBQWMsV0FBVyxnQkFBZ0Isb0JBQW9CLENBQUMsK0JBQStCLGFBQWEsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDBCQUEwQixrQkFBa0IsY0FBYyxDQUFDLDRCQUE0QixZQUFZLFdBQVcsa0JBQWtCLENBQUMsb0JBQW9CLGtDQUFrQixBQUFsQix3QkFBa0IsQUFBbEIsa0JBQWtCLENBQUMseUJBQXlCLGlCQUFpQixrQkFBUyxBQUFULGVBQVMsQUFBVCxTQUFTLENBQUMsQ0FBQyx5QkFBeUIsaUJBQWlCLGtCQUFTLEFBQVQsZUFBUyxBQUFULFNBQVMsQ0FBQyxDQUFDLHlCQUF5QixpQkFBaUIsa0NBQWtDLGtCQUFVLEFBQVYsZUFBVSxBQUFWLFVBQVUsaUJBQWlCLGVBQWUsU0FBUyxPQUFPLFdBQVcsQ0FBQyx1QkFBdUIsbUJBQW1CLHNCQUFzQixjQUFjLFlBQVksZUFBZSxZQUFZLGtCQUFrQixTQUFTLE9BQU8sWUFBWSwrQkFBK0IsZUFBZSxpQkFBaUIseUJBQXlCLFNBQVMsQ0FBQyxvQkFBb0Isa0NBQWtDLDZCQUE2Qix3Q0FBd0Msc0JBQXNCLGFBQWEsY0FBYyxpQ0FBaUMsa0JBQWtCLE9BQU8sWUFBWSxZQUFZLFlBQVksc0NBQThCLEFBQTlCLGtDQUE4QixBQUE5Qiw4QkFBOEIsd0JBQXdCLFNBQVMsQ0FBQyxtREFBbUQsa0NBQXlCLEFBQXpCLDhCQUF5QixBQUF6Qix5QkFBeUIsQ0FBQyxDQUFDLGlCQUFpQixpQkFBaUIsaUJBQWlCLENBQUMsdUJBQXVCLHNCQUFzQixtQkFBbUIsV0FBVyxjQUFjLFdBQVcsa0JBQWtCLE9BQU8sTUFBTSxVQUFVLENBQUMsdUJBQXVCLHFCQUFxQixDQUFDLDBCQUEwQiwwQkFBMEIsZ0JBQWdCLENBQUMsaUNBQWlDLHFCQUFxQix3Q0FBd0Msa0JBQWtCLFNBQVMsU0FBUyxtQ0FBMkIsQUFBM0IsK0JBQTJCLEFBQTNCLDJCQUEyQixXQUFXLGVBQWUsbUJBQW1CLGlCQUFpQix5QkFBeUIsaUJBQWlCLENBQUMsMEJBQTBCLGtCQUFVLEFBQVYsZUFBVSxBQUFWLFVBQVUsd0JBQWdCLEFBQWhCLHFCQUFnQixBQUFoQixnQkFBZ0IsMEJBQTBCLENBQUMsMkJBQTJCLGtCQUFrQixDQUFDLHlCQUF5QiwwQkFBMEIsa0JBQVMsQUFBVCxlQUFTLEFBQVQsU0FBUyxDQUFDLENBQUMseUJBQXlCLDBCQUEwQixrQkFBUyxBQUFULGVBQVMsQUFBVCxTQUFTLENBQUMsQ0FBQyxhQUFhLDBCQUEwQix3QkFBd0Isa0JBQWtCLCtCQUErQixlQUFlLGlCQUFpQixDQUFDLHVCQUF1QixxNkNBQXE2Qyw2QkFBNkIsNEJBQTRCLHdCQUF3QixxQkFBcUIsWUFBWSxVQUFVLENBQUMsZ0JBQWdCLGVBQWUsaUJBQWlCLGlCQUFpQixrQkFBa0IsQ0FBQyxnQkFBZ0IsZ0JBQWdCLGtCQUFrQixTQUFTLENBQUMsc0JBQXNCLFdBQVcsY0FBYyxDQUFDIiwiZmlsZSI6ImFsbC5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIqe2JveC1zaXppbmc6Ym9yZGVyLWJveH1ib2R5e2ZvbnQtc2l6ZToyNHB4O2xpbmUtaGVpZ2h0OjMycHg7dGV4dC1yZW5kZXJpbmc6b3B0aW1pemVMZWdpYmlsaXR5fWgxLGgyLGgzLGg0e2ZvbnQtZmFtaWx5Omdlb3JnaWEsc2VyaWZ9aDEsLmFscGhhe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo0OHB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDo1MHB4O3RleHQtYWxpZ246Y2VudGVyfWgyLC5iZXRhe2ZvbnQtc2l6ZTozMnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDozNnB4fWgzLC5nYW1tYXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjMwcHh9YmxvY2txdW90ZXtib3JkZXItbGVmdDozcHggc29saWQgI2NjYztwYWRkaW5nLWxlZnQ6MjBweDtjb2xvcjojNzc3O2ZvbnQtc3R5bGU6aXRhbGljO3dvcmQtd3JhcDpicmVhay13b3JkfWF7Y29sb3I6IzRmNWI5M31hOmhvdmVye2NvbG9yOiM4ODkyYmZ9LmJhY2stdG8tdG9we3RleHQtYWxpZ246Y2VudGVyfS5iYWNrLXRvLXRvcCBhe2JhY2tncm91bmQ6IzRmNWI5Mztib3JkZXItcmFkaXVzOjNweDtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6NDBweDtwYWRkaW5nOjAgMjBweDt0cmFuc2l0aW9uOmFsbCAuMXMgZWFzZTtjb2xvcjp3aGl0ZTtmb250LWZhbWlseTp2ZXJkYW5hLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6NDBweDt0ZXh0LWRlY29yYXRpb246bm9uZTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LmJhY2stdG8tdG9wIGE6aG92ZXJ7YmFja2dyb3VuZDojODg5MmJmfWltZ3ttYXgtd2lkdGg6MTAwJX1wcmUsY29kZXtjb2xvcjojNDQ0O2ZvbnQtZmFtaWx5OlwiU291cmNlIENvZGUgUHJvXCIsQ29uc29sYXMsXCJBbmRhbGUgTW9ubyBXVFwiLFwiQW5kYWxlIE1vbm9cIixcIkx1Y2lkYSBDb25zb2xlXCIsXCJMdWNpZGEgU2FucyBUeXBld3JpdGVyXCIsXCJEZWphVnUgU2FucyBNb25vXCIsXCJCaXRzdHJlYW0gVmVyYSBTYW5zIE1vbm9cIixcIkxpYmVyYXRpb24gTW9ub1wiLFwiTmltYnVzIE1vbm8gTFwiLE1vbmFjbyxcIkNvdXJpZXIgTmV3XCIsQ291cmllcixtb25vc3BhY2U7Zm9udC1zaXplOjkwJX1hIHByZSxhIGNvZGV7Y29sb3I6aW5oZXJpdH1wcmV7YmFja2dyb3VuZDojZjdmN2Y3O2JvcmRlcjoxcHggc29saWQgI2VlZTtib3JkZXItcmFkaXVzOjNweDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmF1dG87cGFkZGluZzoyMHB4O3dpZHRoOjEwMCV9QG1lZGlhIChtYXgtd2lkdGg6NzY3cHgpe2JvZHl7Zm9udC1zaXplOjE4cHg7bGluZS1oZWlnaHQ6MjRweH1oMSwuYWxwaGF7Zm9udC1zaXplOjM2cHg7bGluZS1oZWlnaHQ6MzhweH1oMiwuYmV0YXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDoyOHB4fWgzLC5nYW1tYXtmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyM3B4fWJsb2NrcXVvdGV7bWFyZ2luLWxlZnQ6MH11bCxvbHtwYWRkaW5nLWxlZnQ6MWVtfXByZXtwYWRkaW5nOjVweCAxMHB4fX1AbWVkaWEgKG1heC13aWR0aDozNjBweCl7Ym9keXtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyMXB4fWgxLC5hbHBoYXtmb250LXNpemU6MjhweDtsaW5lLWhlaWdodDozMHB4fWgyLC5iZXRhe2ZvbnQtc2l6ZToyMHB4O2xpbmUtaGVpZ2h0OjIzcHh9aDMsLmdhbW1he2ZvbnQtc2l6ZToxNnB4O2xpbmUtaGVpZ2h0OjIwcHh9fS5zaXRlLWhlYWRlcntwYWRkaW5nLXRvcDo0MHB4O21hcmdpbi1ib3R0b206NDBweDt0ZXh0LWFsaWduOmNlbnRlcn0uc2l0ZS1oZWFkZXIgaDF7bWFyZ2luOjA7Zm9udC1zaXplOjcycHg7bGluZS1oZWlnaHQ6NjBweH0uc2l0ZS1oZWFkZXIgaDEgZW17ZGlzcGxheTpibG9jaztmb250LXNpemU6MzRweDtmb250LXN0eWxlOm5vcm1hbH0uc2l0ZS1oZWFkZXIgaDEgYXtjb2xvcjojMzMzO3RleHQtZGVjb3JhdGlvbjpub25lfS5zaXRlLWhlYWRlciBoMSBhOmhvdmVye2NvbG9yOiM4ODkyYmZ9LnNpdGUtaGVhZGVyIC5idWlsZC1kYXRle21hcmdpbi1ib3R0b206MTBweDtjb2xvcjojOTk5O2ZvbnQtZmFtaWx5OnZlcmRhbmEsc2Fucy1zZXJpZjtmb250LXNpemU6MTFweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LnNpdGUtaGVhZGVyIC5idG4tc2hhcmV7YmFja2dyb3VuZDojODg5MmJmO2JvcmRlci1yYWRpdXM6M3B4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDozMHB4O3BhZGRpbmc6MCAyMHB4O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2NvbG9yOndoaXRlO2ZvbnQtZmFtaWx5OnZlcmRhbmEsc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDozMHB4O3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uc2l0ZS1oZWFkZXIgLmZvcmstbWV7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFKVUFBQUNWQ0FNQUFBQm1mRWg5QUFBQU1GQk1WRVhyNit3U0ZpSC8vLy9VMU5UMDlQU1JrNWh1Y0hiNStmbE1UMWY4L1B5K3Y4RXRNRHBYV1dFOFAwaGdZMnJnNE9ENW1JRzhBQUFGb0VsRVFWUjRBYlNiMFc0c0tReEV5eGZNZEF5Ry8vL2IxYkN0M01TWjFDS3RoNGNvajBmVlZwMEdldkRuYzMxOFBPcWo5Y3ZsdjFlZmw5dGFDNmoxOGZqNCtKTzdBbFd0clk5TER0Ymxib1ZnNVZLaDlYa2RwVFVJVmpJVnNKcWNQVVNTVmk3Vm93SjRwaldPSHVLVmlVV29kbGpsY09SOVhOMUtDVmhwVk9FUlBySEdPQno1Z0pWSkZjTjZZcDJOZkhpSWlWUXhySTBsMXhGV1hscUU2dk1abHRPQ0dDR3RiS3FJZFZnUUk2U1ZSTVhTNm05dGVVSkZzSTZkR05MS3BncFlNZzVIdm9lMGNxaENQeno0eUdlbVJhZ1NSajZrbFVzVjB6cDJZa2dyZytyL2o3elBLNlNWU3hYVG1yL0xwMm1pRXdNVlRZczVjUUthNVVSQ0ZkUGlJOStBQWcwRkVkSktwb290UDE0bDFjVFE4cDBZcVhoYUVjcEV1dmJ2cWc1cHBWUEYyUnJmb1NvS05NZUpuSXIzMXZEdk05WEU0RWt0ejZtNEUvM3phVG4yUEUxcExkbUpuSW83OGFhNUZ1cnlLSjhSMDhxbTRrNzBoVGFYU3NTS3M1Vk54WjI0YTZHc04reDhPQlYzNGpJUmhZcEhKOGFXVDZXS2FjWFh3RktHWW9rdjI4bDlnWXN0bjAwVjAvSXZXTDRBOC8xWHhLRDhhQ1NUaXJkOEczdmsxYnBWRmVGT3pLVGlUdHhRRXBMYUt6b3htWXFQZk1HOG9YcHMrZWpFWktxQU5mdTRQaEY4UTFVc0xPZE9US2ZpVGhTRFZXM1RVNXpJcWM1YlhoK3E2SW43UkU1RjB2SXZJOStibUVVaTdzUThLcEpXaDk1VGx1RkVUblh1eEc1KzE0Um1PSkZUblJkRXY2RlFXc1pwSUtjNmQrSU5wWVlac0tJVGs2bTRFMFc4WUVxclpaNm5sVVJGbk5nWHB2aGFCUnF4Umtncm5ZcWNuYlltdmpBRVM0UTdNWmtxcGhXY2VEM2p1bXJJaWpneGo0cWNRVFRzdUx5M0lkeUpxVlF4cllqbDl3WURzQU1ucGxMRnRPTElEMEFIRHZhSnlWU2s1ZHVVQWlzTjdhY1RRMXI1Vk1TSkF1MkcxZVVGVmtncm5ZcThOSy9TeGViQkRWaytGWEhpUlBHekc3SjhLdUxFb1hjMDdZcFl3WW5aVkFjM1pBcFVQYmdoUzZFaVRneFFOaFIrY0VPV1RNVnV5QzVZbDRrbU1jTDRkcHBQUlp6WTZpNzZyaGk4NWZPcHlBMVpnNDZGcG9CRktZYVd6NmNpcDRFSzFLYlYya0tQYVkyUVZqWVZhWGx2WGF1SnRIb2RPREdYaWpoUkdxeUxGSFNKS3pveG40cnRxa1ZrSHlIRjVjR0p5VlF4clhoZDBBMmZUYStET3pGU0phWVZqa1owM1ZBR0FOcTVFeU5WWGxyaHE1RjJRNkhvTUg1REZxbVMwL0lmVHJScXo1aXNNQ2ZtVTNFbk52eUxNeWQxWWo0VmM2S3N2NVdsU3B5WVQ4WDJpYkMvL3hiaXhId3E0a1NwUmFRWEYzRnBrem94bjRvNGNaa0NUU1pVdUJQenFVakw2OEtHV3E2bTNJbjVWTVNKTnFWaGVjTVdrRHB4WWpZVjJmbjRUa3Fzd3Jvb0NuZGlwTXBNYTM1MW9tTjVOK2hVMFNjZmNXSTZGVG14bVM2MnJYaERPWEZpT2hWcCtXdlpoc0srWlZuK3F4UHpxY2htMzFGY0ZHdnRBVnYrdXhQenFVaGEwL2JqODdVc2pGYjRhaVNmaWpxeDdZZ2M0RGRrK1ZUY2llYlBQNENKazMxaVBoVjM0aWFyYSs1cC83WGw4Nm00RTNkU3U3bU0vTG9nVXIzZmlkM1dicTR1KzU1VDI0dTAza1pGbk9qU2x1M2pOeEdGL2Z4MXdkdW8rRmNqQmJLOStJVHE4dE9KNzZMaVgxSmFiZTJHZWxVUTc2UWlUdXlHdXFGZzgwVkJ2SmVLT05FMjFLc1RtK0c5dkpXS09GRTIxT2VKVFRnYWVUTVZTYXNCbDBqSTZuWWlwOHFmclc5TzFBWTArYm5lVE1XL0dyRUtxTHhZUForS3BCV1BSbWI3cDMwN1NFRW9Cb0lvcUJBbElPajlieXQvOXJVVDN5YWVvR2hoR2ttTC8yVlk5WmRPdkJjcWRHS3RRaWZXS25SaXJjSUxXYTNDYWlSWCtjcjNLbmRpcXZJdm4xVGxKV1dxY2lkYVZWLzVRSVVsNWJhcVR5dFh1Uk90S2pxeFZxRVRheFU2c1ZhaEUxdVZOemF4Q3AwWXFueTMzanRWZVVtWnFuemxVNVd2ZktweVdxbkthYVVxcjBaU2xWY2pxY3Fya1ZxRlRzeFZlQ0ZyVkU3ck01MW9WWlRXc0xaVlJWcmp1cjVFcTRLMHhuWHRjYUVLV2JmMWZFRlZzY2ExSGxCRnJIRXR2S1dHcklGQmxiSEdoZVZBNlpvUFZLMnJWLzE4ZFg5VVIzVlVSM1ZVWDhVejk0TTZ4eWVMQUFBQUFFbEZUa1N1UW1DQyk7YmFja2dyb3VuZC1wb3NpdGlvbjp0b3AgcmlnaHQ7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTpjb250YWluO2hlaWdodDoxMDBweDt3aWR0aDoxMDBweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO3otaW5kZXg6MTAwO3dpZHRoOjEyMHB4fS5zaXRlLW5hdmlnYXRpb24sLnNpdGUtY29udGVudCwuc2l0ZS1mb290ZXJ7bWFyZ2luOjAgYXV0bzttYXgtd2lkdGg6ODQwcHg7d2lkdGg6OTIlfS5zaXRlLW5hdmlnYXRpb257Y29sdW1uczozO2NvbHVtbi1nYXA6NDBweH0uc2l0ZS1uYXZpZ2F0aW9uIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSwuc2l0ZS1uYXZpZ2F0aW9uIGxhYmVse2Rpc3BsYXk6bm9uZX0uc2l0ZS1uYXZpZ2F0aW9uIHVse2xpc3Qtc3R5bGU6bm9uZTttYXJnaW46MDtwYWRkaW5nOjB9LnNpdGUtbmF2aWdhdGlvbiB1bCBsaXttYXJnaW4tYm90dG9tOjIwcHg7Zm9udC1zaXplOjIycHg7bGluZS1oZWlnaHQ6MjNweH0uc2l0ZS1uYXZpZ2F0aW9uIHVsIGxpIGF7ZGlzcGxheTpibG9jaztjb2xvcjojNDQ0O2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWRlY29yYXRpb246bm9uZX0uc2l0ZS1uYXZpZ2F0aW9uIHVsIGxpIGE6aG92ZXJ7Y29sb3I6Izg4OTJiZn0uc2l0ZS1uYXZpZ2F0aW9uIHVsIGxpIHVse3BhZGRpbmctdG9wOjhweH0uc2l0ZS1uYXZpZ2F0aW9uIHVsIGxpIGxpe21hcmdpbi1ib3R0b206NnB4O2ZvbnQtc2l6ZToxOHB4fS5zaXRlLW5hdmlnYXRpb24gdWwgbGkgbGkgYXtib3JkZXI6bm9uZTtjb2xvcjojNzc3O2ZvbnQtd2VpZ2h0Om5vcm1hbH0uc2l0ZS1uYXZpZ2F0aW9uIGxpe2JyZWFrLWluc2lkZTphdm9pZH1AbWVkaWEgKG1heC13aWR0aDo4MjBweCl7LnNpdGUtbmF2aWdhdGlvbntjb2x1bW5zOjJ9fUBtZWRpYSAobWF4LXdpZHRoOjU2MHB4KXsuc2l0ZS1uYXZpZ2F0aW9ue2NvbHVtbnM6MX19QG1lZGlhIChtYXgtd2lkdGg6Mzc1cHgpey5zaXRlLW5hdmlnYXRpb257YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO2NvbHVtbnM6MTttYXgtaGVpZ2h0OjEwMHZoO3Bvc2l0aW9uOmZpeGVkO2JvdHRvbTowO2xlZnQ6MDt6LWluZGV4OjEwMH0uc2l0ZS1uYXZpZ2F0aW9uIGxhYmVse2JhY2tncm91bmQ6IzRmNWI5Mztib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jaztoZWlnaHQ6NDBweDtwYWRkaW5nOjAgMTBweDt3aWR0aDoxMDB2aDtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtsZWZ0OjA7Y29sb3I6d2hpdGU7Zm9udC1mYW1pbHk6dmVyZGFuYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjQwcHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3otaW5kZXg6Mn0uc2l0ZS1uYXZpZ2F0aW9uPnVse2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjk2KTtib3JkZXItdG9wOjNweCBzb2xpZCAjODg5MmJmO2JveC1zaGFkb3c6cmdiYSgwLDAsMCwwLjI1KSAwIC01cHggMTBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoyMHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JvdHRvbTo0MHB4O2hlaWdodDo1MHZoO3dpZHRoOjEwMHZoO3RyYW5zZm9ybTp0cmFuc2xhdGUoMCwgMTAwdmgpO3RyYW5zaXRpb246YWxsIC4ycyBlYXNlO3otaW5kZXg6MX0uc2l0ZS1uYXZpZ2F0aW9uIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkfnVse3RyYW5zZm9ybTp0cmFuc2xhdGUoMCwgMCl9fS5zaXRlLWNvbnRlbnQgaDF7cGFkZGluZy10b3A6NDBweDtwb3NpdGlvbjpyZWxhdGl2ZX0uc2l0ZS1jb250ZW50IGgxOmFmdGVye2JvcmRlcjoxcHggc29saWQgI2RkZDtib3JkZXItYm90dG9tOm5vbmU7Y29udGVudDpcIlwiO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjhweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7d2lkdGg6MTAwJX0uc2l0ZS1jb250ZW50LmNoYXB0ZXJze2NvdW50ZXItcmVzZXQ6Y2hhcHRlcn0uc2l0ZS1jb250ZW50LmNoYXB0ZXJzIGgxe2NvdW50ZXItaW5jcmVtZW50OmNoYXB0ZXI7cGFkZGluZy10b3A6NjBweH0uc2l0ZS1jb250ZW50LmNoYXB0ZXJzIGgxOmJlZm9yZXtkaXNwbGF5OmlubGluZS1ibG9jaztjb250ZW50OlwiQ2hhcHRlciBcIiBjb3VudGVyKGNoYXB0ZXIpIFwiLlwiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDozMHB4O2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO2NvbG9yOiM5OTk7Zm9udC1zaXplOjEycHg7bGV0dGVyLXNwYWNpbmc6MXB4O2xpbmUtaGVpZ2h0OjIwcHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtYWxpZ246Y2VudGVyfS5zaXRlLWNvbnRlbnQgI3dlbGNvbWUgdWx7Y29sdW1uczozO2NvbHVtbi1nYXA6MzBweDtsaXN0LXN0eWxlLXBvc2l0aW9uOmluc2lkZX0uc2l0ZS1jb250ZW50IC5iYWNrLXRvLXRvcHttYXJnaW4tYm90dG9tOjYwcHh9QG1lZGlhIChtYXgtd2lkdGg6ODcwcHgpey5zaXRlLWNvbnRlbnQgI3dlbGNvbWUgdWx7Y29sdW1uczoyfX1AbWVkaWEgKG1heC13aWR0aDo2MDBweCl7LnNpdGUtY29udGVudCAjd2VsY29tZSB1bHtjb2x1bW5zOjF9fS5zaXRlLWZvb3Rlcntib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjO21hcmdpbjo2MHB4IGF1dG8gMCBhdXRvO3BhZGRpbmc6NDBweCAyMHB4O2ZvbnQtZmFtaWx5OnZlcmRhbmEsc2Fucy1zZXJpZjtmb250LXNpemU6MTZweDt0ZXh0LWFsaWduOmNlbnRlcn0uc2l0ZS1mb290ZXIgLmNjLWJhZGdle2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRmdBQUFBZkNBTUFBQUJVRnZyU0FBQUF3MUJNVkVYLy8vOEFBQUFBQUFDcnNhci8vLzhvS1NqUjFOQU9EZzRqSHlETHo4cEFQei9mMzk5d2NIQlFVRkJnWUdESnpjakV5TU41Zkhrd01EQzl3cnk0dmJlQWdJRHc4UERCeGNETzBjM00wTXlVbUpQR3lzVzZ2N3EvdjcrZm41L1QxdEt2dEs2MXVyU3h0N0Mvdzc2enVMS2hwS0RrNU9TUms1RjJjM1JRVVZBYkd4dXRzNnlFaG9SOWZueERSRU1nSUNEVzFkWEp5TWlycTZxdnI2OHdMUzNQejgrUmo0K1BqNCtMaW9xRWdZSmFWMWk2dWJtYmw1bWVvSjFkWGwwNk5qY1pHUm1XdzZRRUFBQUFBblJTVGxNTUFOb21nalFBQUFNQ1NVUkJWSGphdFpZSmM2SkFFSVd6bldGbU9BUURndUFkalVxTWQweWk1dnovdjJxN0dUbWtOdXNXVzNreE5mSmtQdHMzVE1QVkZmeUlmaUgzdHRId1JzMTYyM0YwUFlwMDNYSGE5ZWJJNnpSdTc0YUR3Y1BEZFFVQlhDRzM0NDBRcTRlYzkxR2NoenFoTS9KMUZTRVl1Vmd1WXVkTEFTaXhuQk02SlZQSk54cWd0SnRzMm1XSHdNaDFJajZkUWFiWmxFZUtmRGNjRGxvNHhiQXNBNmUxMUt6TERvRzlFWEh2cVZiYjczWjltK3ErcjRkRXBwTEhBbW9tUTVrMUVNbXNpNDRDWTc0SlYvZ0JVK29oV3F0anpTTU1ZNmlCalI0QWZRQWFUVkxPODdIa1REYWJpWElVdU5uV2lldWFMRlBnWXMxY2IxUEpDNml0VXpDcndRMm1DZTRiY3I5RVBFa2RPbWNzVWErSm84QjFKNXdpRjhzOUowL0RwR1FOQ3Q5b2drYmxhZEt3d1ovRE5uTk10cEdmZGl6bE16a0tqQVhQUUR5eE13VUNacXBrTU9qWUJyQnBOQURuR0RFU1pEeFo1dzRMM3VRZWM1QTdjaFRZQ2VjQVBpdXBCekRIa3IwT1dIUUlLQm90d3FDemlkR0kxN2tUU0tsaHpGSk95RkZndmdTQlFYUnJodUdyNFFVbkNGaHl6T0liTURMaW5aVEgxOHk1MjNVVHNKbUJkUzdBUmlDUWpFY2cyZlRqQmRmcnpjNmZvcUNzZW13dFVVYnF2STQzakcybHhITXlNQUNXNk1MSzdLNTZMcmptNDZxWFpOR25rRStMQjVBdkhqbEh1ZHRCdkYzTVVxY241ZUdneWJkODhhSStBUDRLbGJNYVNGMEVSd2oyb2NaS2x4czVrOE9YZUE2S3prR2lySUNjZndJM0NodkVLbTZRL2JIa2JMYmJ0WExLVVFSUEt4K2pvQ0dQb3JHdHRLWHp4VHV0V3JaNDFtbnhHcmRqRGNDMUxUZHZPWmNkZGJuZGcyRFo1ZlpvSkFOYnFjdU5HdHlnV3R0TWR2VEx0eHNFKzF1RlhwOXZhZk83TFYwWlRFM28vUzlOcUJxWHdMRFErUWVTQzIzSVZHMXpEdFZGWUxEMHMwWWYrQUxnazBjTCtGOHdMQ0wrVWJvMThhZ0ZxZFQrb0RlWm8vN1JMNTNFenNHVXhudnBadG9xekRtOVdPNm80OUpYS2FNSXBqUkNQazF2LzFNZTZzVWMwclpaY0U1L0JhWHRwQVFHZDRCb3p1bDVCYkVEQXdvcUI2R2NyT0xjTEZlc1pPdzk5WWpsN1FsN29lSVVYanluQlA0aC9kalQ1bStudUYzM1BjUHVjd0FBQUFCSlJVNUVya0pnZ2c9PSk7YmFja2dyb3VuZC1wb3NpdGlvbjp0b3AgbGVmdDtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOmNvbnRhaW47ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjMxcHg7d2lkdGg6ODhweH0uc2l0ZS1mb290ZXIgaDJ7Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6Ym9sZDtsaW5lLWhlaWdodDozMHB4O21hcmdpbi1ib3R0b206MTBweH0uc2l0ZS1mb290ZXIgdWx7bGlzdC1zdHlsZTpub25lO21hcmdpbjowIDAgMjBweCAwO3BhZGRpbmc6MH0uc2l0ZS1mb290ZXIgLmxpY2Vuc2V7Y29sb3I6Izc3Nztmb250LXNpemU6MTNweH0iXX0= */ \ No newline at end of file diff --git a/images/favicon.png b/images/favicon.png index cacdef657..13d87260b 100644 Binary files a/images/favicon.png and b/images/favicon.png differ diff --git a/images/og-image.png b/images/og-image.png new file mode 100644 index 000000000..33f5296c7 Binary files /dev/null and b/images/og-image.png differ diff --git a/index.html b/index.html index 9eed3ffdc..689effed1 100644 --- a/index.html +++ b/index.html @@ -1,18 +1,18 @@ --- layout: default description: "Uma referência rápida de melhores práticas de PHP, renomados padrões de código e links para tutoriais competentes pela Web" +sitemap: true --- {% capture welcome_content %}{% include welcome.md %}{% endcapture %} -{{ welcome_content|markdownify }} +
+ {{ welcome_content|markdownify }} +
-{% capture backtotop %}[Voltar ao topo](#top){:.top}{% endcapture %} +{% capture backtotop %}[Back to Top](#top){:.top}{% endcapture %} {% for post in site.posts reversed %} - {% if post.isChild != true and loop.first != true %} - {{ backtotop|markdownify }} - {% endif %} -
+{% if post.isChild != true and loop.first != true %}
{{ backtotop|markdownify }}
{% endif %} +
{{ post.content }} -
+ {% endfor %} -{{ backtotop|markdownify }} diff --git a/less/all.less b/less/all.less new file mode 100644 index 000000000..4ecc4c81e --- /dev/null +++ b/less/all.less @@ -0,0 +1,470 @@ +/****************************************************************************** + * Variables + *****************************************************************************/ + +@serif: georgia, serif; +@sans: verdana, sans-serif; +@phpPurple: #8892BF; +@phpPurpleDark: #4F5B93; + +/****************************************************************************** + * Basics + *****************************************************************************/ + +*{ + box-sizing: border-box; +} + +body{ + font-size: 24px; + line-height: 32px; + text-rendering: optimizeLegibility; +} + +h1, h2, h3, h4{ + font-family: @serif; +} + +h1, .alpha{ + position: relative; + font-size: 48px; + font-weight: normal; + line-height: 50px; + text-align: center; +} + +h2, .beta{ + font-size: 32px; + font-weight: normal; + line-height: 36px; +} + +h3, .gamma{ + font-size: 24px; + font-weight: bold; + line-height: 30px; +} + +blockquote{ + border-left: 3px solid #CCC; + padding-left: 20px; + color: #777; + font-style: italic; + word-wrap: break-word; +} + +a{ + color: @phpPurpleDark; + + &:hover{ + color: @phpPurple; + } +} + +.back-to-top{ + text-align: center; + + a{ + background: @phpPurpleDark; + border-radius: 3px; + display: inline-block; + height: 40px; + padding: 0 20px; + transition: all 0.1s ease; + color: white; + font-family: @sans; + font-size: 13px; + line-height: 40px; + text-decoration: none; + text-transform: uppercase; + + &:hover{ + background: @phpPurple; + } + } +} + +img{ + max-width: 100%; +} + +pre, code{ + color: #444; + font-family: "Source Code Pro", Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + font-size: 90%; +} +a{ + pre, code{ + color: inherit; + } +} + +pre{ + background: #f7f7f7; + border: 1px solid #EEE; + border-radius: 3px; + display: block; + overflow: auto; + padding: 20px; + width: 100%; +} + +@media (max-width: 767px) { + body{ + font-size: 18px; + line-height: 24px; + } + h1, .alpha{ + font-size: 36px; + line-height: 38px; + } + + h2, .beta{ + font-size: 24px; + line-height: 28px; + } + + h3, .gamma{ + font-size: 18px; + line-height: 23px; + } + + blockquote{ + margin-left: 0; + } + + ul, ol{ + padding-left: 1em; + } + + pre{ + padding: 5px 10px; + } +} + +@media (max-width: 360px) { + body{ + font-size: 16px; + line-height: 21px; + } + + h1, .alpha{ + font-size: 28px; + line-height: 30px; + } + + h2, .beta{ + font-size: 20px; + line-height: 23px; + } + + h3, .gamma{ + font-size: 16px; + line-height: 20px; + } +} + +/****************************************************************************** + * Header + *****************************************************************************/ + +.site-header{ + padding-top: 40px; + margin-bottom: 40px; + text-align: center; + + h1{ + margin: 0; + font-size: 72px; + line-height: 60px; + + em{ + display: block; + font-size: 34px; + font-style: normal; + } + + a{ + color: #333; + text-decoration: none; + + &:hover{ + color: @phpPurple; + } + } + } + + .build-date{ + margin-bottom: 10px; + color: #999; + font-family: @sans; + font-size: 11px; + text-transform: uppercase; + } + + .btn-share{ + background: @phpPurple; + border-radius: 3px; + display: inline-block; + height: 30px; + padding: 0 20px; + vertical-align: baseline; + color: white; + font-family: @sans; + font-size: 12px; + line-height: 30px; + text-decoration: none; + text-transform: uppercase; + } + + .fork-me{ + background-image: url(data:image/png;base64,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); + background-position: top right; + background-repeat: no-repeat; + background-size: contain; + height: 100px; + width: 100px; + position: absolute; + top: 0; + right: 0; + z-index: 100; + width: 120px; + } +} + +/****************************************************************************** + * Navigation + *****************************************************************************/ + +.site-navigation, +.site-content, +.site-footer{ + margin: 0 auto; + max-width: 840px; + width: 92%; +} + +.site-navigation{ + columns: 3; + column-gap: 40px; + + input[type="checkbox"], + label{ + display: none; + } + + ul{ + list-style: none; + margin: 0; + padding: 0; + + li{ + margin-bottom: 20px; + font-size: 22px; + line-height: 23px; + + a{ + display: block; + color: #444; + font-weight: 700; + text-decoration: none; + + &:hover{ + color: @phpPurple; + } + } + + ul{ + padding-top: 8px; + } + + li{ + margin-bottom: 6px; + font-size: 18px; + + a{ + border: none; + color: #777; + font-weight: normal; + } + } + } + } + li{ + break-inside: avoid; + } +} + +@media (max-width: 820px) { + .site-navigation{ + columns: 2; + } +} + +@media (max-width: 560px) { + .site-navigation{ + columns: 1; + } +} + +@media (max-width: 375px) { + .site-navigation{ + background: fade(white, 95%); + columns: 1; + max-height: 100vh; + position: fixed; + bottom: 0; + left: 0; + z-index: 100; + + label{ + background: @phpPurpleDark; + box-sizing: border-box; + display: block; + height: 40px; + padding: 0 10px; + width: 100vh; + position: absolute; + bottom: 0; + left: 0; + color: white; + font-family: @sans; + font-size: 13px; + line-height: 40px; + text-transform: uppercase; + z-index: 2; + } + + > ul{ + background: fade(white, 96%); + border-top: 3px solid @phpPurple; + box-shadow: fade(black, 25%) 0 -5px 10px; + box-sizing: border-box; + padding: 20px; + overflow: auto; + -webkit-overflow-scrolling: touch; + position: absolute; + left: 0; + bottom: 40px; + height: 50vh; + width: 100vh; + transform: translate(0,100vh); + transition: all 0.2s ease; + z-index: 1; + } + + input[type="checkbox"]:checked ~ ul { + transform: translate(0,0); + } + } +} + +/****************************************************************************** + * Content + *****************************************************************************/ + +.site-content{ + h1{ + padding-top: 40px; + position: relative; + + &:after{ + border: 1px solid #DDD; + border-bottom: none; + content: ""; + display: block; + height: 8px; + position: absolute; + left: 0; + top: 0; + width: 100%; + } + } + + &.chapters{ + counter-reset: chapter; + + h1{ + counter-increment: chapter; + padding-top: 60px; + + &:before{ + display: inline-block; + content: "Chapter " counter(chapter) "."; + position: absolute; + top: 30px; + left: 50%; + transform: translateX(-50%); + color: #999; + font-size: 12px; + letter-spacing: 1px; + line-height: 20px; + text-transform: uppercase; + text-align: center; + } + } + } + + #welcome{ + ul{ + columns: 3; + column-gap: 30px; + list-style-position: inside; + } + } + + .back-to-top{ + margin-bottom: 60px; + } +} + +@media (max-width: 870px) { + .site-content #welcome ul{ + columns: 2; + } +} + +@media (max-width: 600px) { + .site-content #welcome ul{ + columns: 1; + } +} + +/****************************************************************************** + * Footer + *****************************************************************************/ + +.site-footer{ + border-top: 1px solid #CCC; + margin: 60px auto 0 auto; + padding: 40px 20px; + font-family: @sans; + font-size: 16px; + text-align: center; + + .cc-badge{ + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAAAfCAMAAABUFvrSAAAAw1BMVEX///8AAAAAAACrsar///8oKSjR1NAODg4jHyDLz8pAPz/f399wcHBQUFBgYGDJzcjEyMN5fHkwMDC9wry4vbeAgIDw8PDBxcDO0c3M0MyUmJPGysW6v7q/v7+fn5/T1tKvtK61urSxt7C/w76zuLKhpKDk5OSRk5F2c3RQUVAbGxuts6yEhoR9fnxDREMgICDW1dXJyMirq6qvr68wLS3Pz8+Rj4+Pj4+LioqEgYJaV1i6ubmbl5meoJ1dXl06NjcZGRmWw6QEAAAAAnRSTlMMANomgjQAAAMCSURBVHjatZYJc6JAEIWznWFmOAQDguAdjUqMd0yi5vz/v2q7GTmkNusWW3kxNfJkPts3TMPVFfyIfiH3ttHwRs1623F0PYp03XHa9ebI6zRu74aDwcPDdQUBXCG3440Qq4ec91GchzqhM/J1FSEYuVguYudLASixnBM6JVPJNxqgtJts2mWHwMh1Ij6dQabZlEeKfDccDlo4xbAsA6e11KzLDoG9EXHvqVbb73Z9m+q+r4dEppLHAmomQ5k1EMmsi44CY74JV/gBU+ohWqtjzSMMY6iBjR4AfQAaTVLO87HkTDabiXIUuNnWieuaLFPgYs1cb1PJC6itUzCrwQ2mCe4bcr9EPEkdOmcsUa+Jo8B1J5wiF8s9J0/DpGQNCt9ogkbladKwwZ/DNnNMtpGfdizlMzkKjAXPQDyxMwUCZqpkMOjYBrBpNADnGDESZDxZ5w4L3uQec5A7chTYCecAPiupBzDHkr0OWHQIKBotwqCzidGI17kTSKlhzFJOyFFgvgSBQXRrhuGr4QUnCFhyzOIbMDLinZTH18y523UTsJmBdS7ARiCQjEcg2fTjBdfrzc6foqCsemwtUUbqvI43jG2lxHMyMACW6MLK7K56Lrjm46qXZNGnkE+LB5AvHjlHudtBvF3MUqcn5eGgybd88aI+AP4KlbMaSF0ERwj2ocZKlxs5k8OXeA6KzkGirICcfwI3ChvEKm6Q/bHkbLbbtXLKUQRPKx+joCGPorGttKXzxTutWrZ41mnxGrdjDcC1LTdvOZcddbndg2DZ5fZoJANbqcuNGtygWttMdvTLtxsE+1uFXp9vafO7LV0ZTE3o/S9NqBqXwLDQ+QeSC23IVG1zDtVFYLD0s0Yf+ALgk0cL+F8wLCL+Ubo18agFqdT+oDeZo/7RL53EzsGUxnvpZtoqzDm9WO6o49JXKaMIpjRCPk1v/1Me6sUc0rZZcE5/BaXtpAQGd4Bozul5BbEDAwoqB6GcrOLcLFesZOw99Yjl7Ql7oeIUXjynBP4h/djT5m+nuF33PcPucwAAAABJRU5ErkJggg==); + background-position: top left; + background-repeat: no-repeat; + background-size: contain; + display: inline-block; + height: 31px; + width: 88px; + } + + h2{ + .gamma; + margin-bottom: 10px; + } + + ul{ + list-style: none; + margin: 0 0 20px 0; + padding: 0; + } + + .license{ + color: #777; + font-size: 13px; + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..18b79f578 --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "name": "php-the-right-way", + "version": "2.0.0", + "devDependencies": { + "grunt": "~0.4.5", + "grunt-contrib-less": "~1.0.1", + "grunt-contrib-watch": "~0.6.1", + "grunt-postcss": "^0.6.0", + "autoprefixer": "^6.0.3" + } +} diff --git a/scripts/fastclick.js b/scripts/fastclick.js new file mode 100644 index 000000000..6fefca20d --- /dev/null +++ b/scripts/fastclick.js @@ -0,0 +1,4 @@ +/** Shrinkwrap URL: + * /v2/bundles/js?modules=fastclick%401.0.6%2Co-autoinit%401.0.1&shrinkwrap= + */ +!function(t){function e(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return t[o].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";n(1),window.Origami={fastclick:n(2),"o-autoinit":n(4)}},function(t,e){t.exports={name:"__MAIN__",dependencies:{fastclick:"fastclick#*","o-autoinit":"o-autoinit#^1.0.0"}}},function(t,e,n){t.exports=n(3)},function(t,e){"use strict";var n=!1;!function(){function e(t,n){function o(t,e){return function(){return t.apply(e,arguments)}}var r;if(n=n||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=n.touchBoundary||10,this.layer=t,this.tapDelay=n.tapDelay||200,this.tapTimeout=n.tapTimeout||700,!e.notNeeded(t)){for(var a=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],c=this,s=0,u=a.length;u>s;s++)c[a[s]]=o(c[a[s]],c);i&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,o){var i=Node.prototype.removeEventListener;"click"===e?i.call(t,e,n.hijacked||n,o):i.call(t,e,n,o)},t.addEventListener=function(e,n,o){var i=Node.prototype.addEventListener;"click"===e?i.call(t,e,n.hijacked||(n.hijacked=function(t){t.propagationStopped||n(t)}),o):i.call(t,e,n,o)}),"function"==typeof t.onclick&&(r=t.onclick,t.addEventListener("click",function(t){r(t)},!1),t.onclick=null)}}var o=navigator.userAgent.indexOf("Windows Phone")>=0,i=navigator.userAgent.indexOf("Android")>0&&!o,r=/iP(ad|hone|od)/.test(navigator.userAgent)&&!o,a=r&&/OS 4_\d(_\d)?/.test(navigator.userAgent),c=r&&/OS [6-7]_\d/.test(navigator.userAgent),s=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(t){switch(t.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(t.disabled)return!0;break;case"input":if(r&&"file"===t.type||t.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(t.className)},e.prototype.needsFocus=function(t){switch(t.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!i;case"input":switch(t.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!t.disabled&&!t.readOnly;default:return/\bneedsfocus\b/.test(t.className)}},e.prototype.sendClick=function(t,e){var n,o;document.activeElement&&document.activeElement!==t&&document.activeElement.blur(),o=e.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(t),!0,!0,window,1,o.screenX,o.screenY,o.clientX,o.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,t.dispatchEvent(n)},e.prototype.determineEventType=function(t){return i&&"select"===t.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(t){var e;r&&t.setSelectionRange&&0!==t.type.indexOf("date")&&"time"!==t.type&&"month"!==t.type?(e=t.value.length,t.setSelectionRange(e,e)):t.focus()},e.prototype.updateScrollParent=function(t){var e,n;if(e=t.fastClickScrollParent,!e||!e.contains(t)){n=t;do{if(n.scrollHeight>n.offsetHeight){e=n,t.fastClickScrollParent=n;break}n=n.parentElement}while(n)}e&&(e.fastClickLastScrollTop=e.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(t){return t.nodeType===Node.TEXT_NODE?t.parentNode:t},e.prototype.onTouchStart=function(t){var e,n,o;if(t.targetTouches.length>1)return!0;if(e=this.getTargetElementFromEventTarget(t.target),n=t.targetTouches[0],r){if(o=window.getSelection(),o.rangeCount&&!o.isCollapsed)return!0;if(!a){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return t.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(e)}}return this.trackingClick=!0,this.trackingClickStart=t.timeStamp,this.targetElement=e,this.touchStartX=n.pageX,this.touchStartY=n.pageY,t.timeStamp-this.lastClickTimen||Math.abs(e.pageY-this.touchStartY)>n?!0:!1},e.prototype.onTouchMove=function(t){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(t.target)||this.touchHasMoved(t))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(t){return void 0!==t.control?t.control:t.htmlFor?document.getElementById(t.htmlFor):t.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(t){var e,n,o,s,u,l=this.targetElement;if(!this.trackingClick)return!0;if(t.timeStamp-this.lastClickTimethis.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=t.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,c&&(u=t.changedTouches[0],l=document.elementFromPoint(u.pageX-window.pageXOffset,u.pageY-window.pageYOffset)||l,l.fastClickScrollParent=this.targetElement.fastClickScrollParent),o=l.tagName.toLowerCase(),"label"===o){if(e=this.findControl(l)){if(this.focus(l),i)return!1;l=e}}else if(this.needsFocus(l))return t.timeStamp-n>100||r&&window.top!==window&&"input"===o?(this.targetElement=null,!1):(this.focus(l),this.sendClick(l,t),r&&"select"===o||(this.targetElement=null,t.preventDefault()),!1);return r&&!a&&(s=l.fastClickScrollParent,s&&s.fastClickLastScrollTop!==s.scrollTop)?!0:(this.needsClick(l)||(t.preventDefault(),this.sendClick(l,t)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(t){return this.targetElement?t.forwardedTouchEvent?!0:t.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(t.stopImmediatePropagation?t.stopImmediatePropagation():t.propagationStopped=!0,t.stopPropagation(),t.preventDefault(),!1):!0:!0},e.prototype.onClick=function(t){var e;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===t.target.type&&0===t.detail?!0:(e=this.onMouse(t),e||(this.targetElement=null),e)},e.prototype.destroy=function(){var t=this.layer;i&&(t.removeEventListener("mouseover",this.onMouse,!0),t.removeEventListener("mousedown",this.onMouse,!0),t.removeEventListener("mouseup",this.onMouse,!0)),t.removeEventListener("click",this.onClick,!0),t.removeEventListener("touchstart",this.onTouchStart,!1),t.removeEventListener("touchmove",this.onTouchMove,!1),t.removeEventListener("touchend",this.onTouchEnd,!1),t.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(t){var e,n,o,r;if("undefined"==typeof window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!i)return!0;if(e=document.querySelector("meta[name=viewport]")){if(-1!==e.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(s&&(o=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),o[1]>=10&&o[2]>=3&&(e=document.querySelector("meta[name=viewport]")))){if(-1!==e.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===t.style.msTouchAction||"manipulation"===t.style.touchAction?!0:(r=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],r>=27&&(e=document.querySelector("meta[name=viewport]"),e&&(-1!==e.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===t.style.touchAction||"manipulation"===t.style.touchAction?!0:!1)},e.attach=function(t,n){return new e(t,n)},"function"==typeof n&&"object"==typeof n.amd&&n.amd?n(function(){return e}):"undefined"!=typeof t&&t.exports?(t.exports=e.attach,t.exports.FastClick=e):window.FastClick=e}()},function(t,e,n){t.exports=n(5)},function(t,e){"use strict";function n(t){t in o||(o[t]=!0,document.dispatchEvent(new CustomEvent("o."+t)))}var o={};window.addEventListener("load",n.bind(null,"load")),window.addEventListener("load",n.bind(null,"DOMContentLoaded")),document.addEventListener("DOMContentLoaded",n.bind(null,"DOMContentLoaded")),"complete"===document.readyState?(n("load"),n("DOMContentLoaded")):"interactive"===document.readyState&&n("DOMContentLoaded")}]); diff --git a/scripts/setup.js b/scripts/setup.js index 262160a84..9b258e20c 100644 --- a/scripts/setup.js +++ b/scripts/setup.js @@ -1,80 +1,18 @@ (function ($) { - // Load contributors - var $contributors = $('#contributors'); - var repo_user = 'PHPSP'; - if ( $contributors.length ) { - var fail = function () { - $contributors.html('

Este projeto não seria possível sem a ajuda de nossos contribuintes no GitHub.

'); - }; - $.ajax({ - cache: false, - dataType: 'jsonp', - timeout: 3000, - type: 'GET', - url: 'https://api.github.com/repos/' + repo_user + '/php-the-right-way/contributors' - }).done(function (data) { - if ( data.data && data.data.length ) { - var $ul = $('
    '), dataLength = data.data.length; - for ( var i = 0; i < dataLength; i++ ) { - $ul.append(['
  • ', data.data[i].login, '
  • '].join('')); - } - $contributors.html($ul); - } else { - fail(); - } - }).fail(fail); - } -})(jQuery); - -(function ($) { - //Add current view's highlighting to the navigation - - /** helper for highlighting */ - function highlightNav(navLinks,id) - { - navLinks.filter('[href="/#'+id+'"]').addClass("active"); - } - - $(window).scroll(function() { - //console.log("They see me scrollin, they hatin"); - - //clear highlighting - var navLinks = $('.site-navigation a'); - navLinks.removeClass("active"); + // Attach FastClick + var attachFastClick = Origami.fastclick; + attachFastClick(document.body); - //calc current viewport - var viewTop = $(window).scrollTop(); - var viewBottom = viewTop + $(window).height(); - - //for all h1 and h2 elements, check if they are visible - //performance tweak: stop each() after the first element is found to be behind view - var previous = ""; - var foundOne = false; - var fallback = ""; - $('h1, h2').each(function(i,e) { - //get element position; - var eTop = $(e).offset().top; - var eBottom = eTop + $(e).height(); - var id=e.id; - id = id.replace("_title", ""); - - if (eTop >= viewTop) { - //if we are passed the view and no heading was highlighted yet, store previous one as fallback - if (! foundOne) { - fallback=previous; - } - if (eBottom <= viewBottom) { - highlightNav(navLinks, id); - foundOne = true; - } else { - return false; //break the each(), the rest is below - } - } - previous=id; - }); - //no h1/h2 is in the viewport, so highlight the last one above - if (! foundOne) { - highlightNav(navLinks, fallback); + // Mobile TOC menu + var $window = $(window), + $nav = $('.site-navigation'); + $nav.click(function (e) { + var $target = $(e.target); + if ($target.is($nav) && $window.width() <= 375) { + $nav.toggleClass('open'); + } + if ($target.is('a')) { + $nav.removeClass('open'); } }); -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/styles/base/spacing.less b/styles/base/spacing.less index 9ebff3cef..59c164e6c 100644 --- a/styles/base/spacing.less +++ b/styles/base/spacing.less @@ -22,7 +22,7 @@ */ .ptn, .pvn, .pan{ - padding-top: 0px !important + padding-top: 0 !important } .pth, .pvh, .pah{ padding-top: @baseline / 2 !important @@ -34,7 +34,7 @@ padding-top: @baseline * 2 !important } .prn, .phn, .pan{ - padding-right: 0px !important + padding-right: 0 !important } .prh, .phh, .pah{ padding-right: @baseline / 2 !important @@ -46,7 +46,7 @@ padding-right: @baseline * 2 !important } .pbn, .pvn, .pan{ - padding-bottom: 0px !important + padding-bottom: 0 !important } .pbh, .pvh, .pah{ padding-bottom: @baseline / 2 !important @@ -58,7 +58,7 @@ padding-bottom: @baseline * 2 !important } .pln, .phn, .pan{ - padding-left: 0px !important + padding-left: 0 !important } .plh, .phh, .pah{ padding-left: @baseline / 2 !important @@ -70,7 +70,7 @@ padding-left: @baseline * 2 !important } .mtn, .mvn, .man{ - margin-top: 0px !important + margin-top: 0 !important } .mth, .mvh, .mah{ margin-top: @baseline / 2 !important @@ -82,7 +82,7 @@ margin-top: @baseline * 2 !important } .mrn, .mhn, .man{ - margin-right: 0px !important + margin-right: 0 !important } .mrh, .mhh, .mah{ margin-right: @baseline / 2 !important @@ -94,7 +94,7 @@ margin-right: @baseline * 2 !important } .mbn, .mvn, .man{ - margin-bottom: 0px !important + margin-bottom: 0 !important } .mbh, .mvh, .mah{ margin-bottom: @baseline / 2 !important @@ -106,7 +106,7 @@ margin-bottom: @baseline * 2 !important } .mln, .mhn, .man{ - margin-left: 0px !important + margin-left: 0 !important } .mlh, .mhh, .mah{ margin-left: @baseline / 2 !important @@ -127,5 +127,5 @@ line-height: @baseline * 2 !important; } .lhn { - line-height: 0px !important; -} \ No newline at end of file + line-height: 0 !important; +} diff --git a/styles/site/site-navigation.less b/styles/site/site-navigation.less index 4f5917990..5c9e80f77 100644 --- a/styles/site/site-navigation.less +++ b/styles/site/site-navigation.less @@ -19,6 +19,7 @@ .pan; .no-list; font-size: 16px; + margin-bottom: 10px; } .site-navigation > ul > li{ margin-bottom: 10px; diff --git a/vagrant.md b/vagrant.md deleted file mode 100644 index 8ed1216e9..000000000 --- a/vagrant.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contribuir com o projeto utilizando o Vagrant - -### Instalar o vagrant -* Instale [Vagrant](http://www.vagrantup.com/) e [VirtualBox](https://www.virtualbox.org/) -* Execute o comando `vagrant up` no diretório do projeto - -### Gerar o build do projeto e visualizar localmente -* Realize as alterações -* Para criar o build: - * Execute `vagrant ssh -c 'cd /vagrant && jekyll build'` -* Para visualizar as alterações: - * Execute `vagrant ssh -c 'cd /vagrant && jekyll serve'` - * Acesse [visualize localmente](http://localhost:4000) \ No newline at end of file