pax_global_header00006660000000000000000000000064126047307240014517gustar00rootroot0000000000000052 comment=d36bc78070011b4721eee8685cf5d240b8733956 syntastic-3.7.0/000077500000000000000000000000001260473072400135475ustar00rootroot00000000000000syntastic-3.7.0/.gitignore000066400000000000000000000000301260473072400155300ustar00rootroot00000000000000*~ *.swp tags .DS_Store syntastic-3.7.0/CONTRIBUTING.md000066400000000000000000000065651260473072400160140ustar00rootroot00000000000000# CONTRIBUTING - - - 1\. [Bug reports / GitHub issues](#bugreps) 2\. [Submitting a patch](#patches) 3\. [General style notes](#generalstyle) 4\. [Syntax checker notes](#checkerstyle) - - - ## 1. Bug reports / GitHub issues Please note that the preferred channel for posting bug reports is the [issue tracker at GitHub][0]. Reports posted elsewhere are less likely to be seen by the core team. When reporting a bug make sure you search the existing GitHub issues for the same/similar issues. If you find one, feel free to add a `+1` comment with any additional information that may help us solve the issue. When creating a new issue be sure to state the following: * steps to reproduce the bug; * the version of Vim you are using (run `:ver` to find out); * the version of syntastic you are using (see `:SyntasticInfo`). For syntax checker bugs also state the version of the checker executable that you are using. Adding debugging information is typically useful too: * open a file handled by your checker; * set `g:syntastic_debug` to 1 or 3; * run the checker; * copy the output of `:mes`. ## 2. Submitting a patch Before you consider adding features to syntastic, _please_ spend a few minutes (re-)reading the latest version of the [manual][1]. Syntastic is changing rapidly at times, and it's quite possible that some features you want to add exist already. To submit a patch: * fork the [repo][2] on GitHub; * make a [topic branch][3] and start hacking; * submit a pull request based off your topic branch. Small, focused patches are preferred. Large changes to the code should be discussed with the core team first. Create an issue and explain your plan and see what we say. Also, make sure to update the manual whenever applicable. Nobody can use features that aren't documented. ## 3. General style notes Follow the coding conventions/styles used in the syntastic core: * use 4 space indents; * don't use abbreviated keywords - e.g. use `endfunction`, not `endfun` (there's always room for more fun!); * don't use `l:` prefixes for variables unless actually required (i.e. almost never); * code for maintainability; we would rather a function be a couple of lines longer and have (for example) some [explaining variables][4] to aid readability. ## 4. Syntax checker notes Make sure to read the [guide][5] if you plan to add new syntax checkers. Use the existing checkers as templates, rather than writing everything from scratch. The preferred style for error format strings is one "clause" per line. E.g. (from the `coffee` checker): ```vim let errorformat = \ '%E%f:%l:%c: %trror: %m,' . \ 'Syntax%trror: In %f\, %m on line %l,' . \ '%EError: In %f\, Parse error on line %l: %m,' . \ '%EError: In %f\, %m on line %l,' . \ '%W%f(%l): lint warning: %m,' . \ '%W%f(%l): warning: %m,' . \ '%E%f(%l): SyntaxError: %m,' . \ '%-Z%p^,' . \ '%-G%.%#' ``` [0]: https://github.com/scrooloose/syntastic/issues [1]: https://github.com/scrooloose/syntastic/blob/master/doc/syntastic.txt [2]: https://github.com/scrooloose/syntastic [3]: https://github.com/dchelimsky/rspec/wiki/Topic-Branches#using-topic-branches-when-contributing-patches [4]: http://www.refactoring.com/catalog/extractVariable.html [5]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide syntastic-3.7.0/LICENCE000066400000000000000000000007321260473072400145360ustar00rootroot00000000000000 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. syntastic-3.7.0/README.markdown000066400000000000000000000462711260473072400162620ustar00rootroot00000000000000 , / \,,_ .'| ,{{| /}}}}/_.' _____________________________________________ }}}}` '{{' '. / \ {{{{{ _ ;, \ / Ladies and Gentlemen, \ ,}}}}}} /o`\ ` ;) | | {{{{{{ / ( | this is ... | }}}}}} | \ | | {{{{{{{{ \ \ | | }}}}}}}}} '.__ _ | | _____ __ __ _ | {{{{{{{{ /`._ (_\ / | / ___/__ ______ / /_____ ______/ /_(_)____ | }}}}}}' | //___/ --=: \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ | jgs `{{{{` | '--' | ___/ / /_/ / / / / /_/ /_/ (__ ) /_/ / /__ | }}}` | /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/ | | /____/ | | / \_____________________________________________/ - - - 1. [Introduction](#introduction) 2. [Installation](#installation) 2.1. [Requirements](#requirements) 2.2. [Installing syntastic with Pathogen](#installpathogen) 3. [Recommended settings](#settings) 4. [FAQ](#faq) 4.1. [I installed syntastic but it isn't reporting any errors...](#faqinfo) 4.2. [The `python` checker complains about syntactically valid Python 3 constructs...](#faqpython3) 4.3. [Are there any local checkers for HTML5 that I can use with syntastic?](#faqhtml5) 4.4. [The `perl` checker has stopped working...](#faqperl) 4.5. [What happened to the `rustc` checker?](#faqrust) 4.6. [What happened to the `xcrun` checker?](#faqxcrun) 4.7. [I run a checker and the location list is not updated...](#faqloclist) 4.7. [I run`:lopen` or `:lwindow` and the error window is empty...](#faqloclist) 4.8. [How can I pass additional arguments to a checker?](#faqargs) 4.9. [Syntastic supports several checkers for my filetype - how do I tell which one(s) to use?](#faqcheckers) 4.10. [What is the difference between syntax checkers and style checkers?](#faqstyle) 4.11. [I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?](#faqaggregate) 4.12. [How can I jump between the different errors without using the location list at the bottom of the window?](#faqlnext) 4.13. [The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?](#faqbdelete) 5. [Resources](#otherresources) - - - ## 1\. Introduction Syntastic is a syntax checking plugin for [Vim][13] that runs files through external syntax checkers and displays any resulting errors to the user. This can be done on demand, or automatically as files are saved. If syntax errors are detected, the user is notified and is happy because they didn't have to compile their code or execute their script to find them. At the time of this writing, syntastic has checking plugins for ActionScript, Ada, API Blueprint, AppleScript, AsciiDoc, ASM, BEMHTML, Bro, Bourne shell, C, C++, C#, Cabal, Chef, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Jade, Java, JavaScript, JSON, JSX, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Puppet, Python, QML, R, Racket, Relax NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, VimL, xHtml, XML, XSLT, YACC, YAML, z80, Zope page templates, and zsh. See the [wiki][3] for details about the corresponding supported checkers. A number of third-party Vim plugins also provide checkers for syntastic, for example: [merlin][30], [omnisharp-vim][25], [rust.vim][12], [syntastic-extras][26], [syntastic-more][27], [vim-crystal][29], [vim-eastwood][28], and [vim-swift][24]. Below is a screenshot showing the methods that Syntastic uses to display syntax errors. Note that, in practise, you will only have a subset of these methods enabled. ![Screenshot 1][0] 1. Errors are loaded into the location list for the corresponding window. 2. When the cursor is on a line containing an error, the error message is echoed in the command window. 3. Signs are placed beside lines with errors - note that warnings are displayed in a different color. 4. There is a configurable statusline flag you can include in your statusline config. 5. Hover the mouse over a line containing an error and the error message is displayed as a balloon. 6. (not shown) Highlighting errors with syntax highlighting. Erroneous parts of lines can be highlighted. ## 2\. Installation ### 2.1\. Requirements Syntastic itself has rather relaxed requirements: it doesn't have any external dependencies, and it needs a version of [Vim][13] compiled with a few common features: `autocmd`, `eval`, `file_in_path`, `modify_fname`, `quickfix`, `reltime`, and `user_commands`. Not all possible combinations of features that include the ones above make equal sense on all operating systems, but Vim version 7 or later with the "normal", "big", or "huge" feature sets should be fine. Syntastic should work with any modern plugin managers for Vim, such as [NeoBundle][14], [Pathogen][1], [Vim-Addon-Manager][15], [Vim-Plug][16], or [Vundle][17]. Instructions for installing syntastic with [Pathogen][1] are included below for completeness. Last but not least: syntastic doesn't know how to do any syntax checks by itself. In order to get meaningful results you need to install external checkers corresponding to the types of files you use. Please consult the [wiki][3] for a list of supported checkers. ### 2.2\. Installing syntastic with Pathogen If you already have [Pathogen][1] working then skip [Step 1](#step1) and go to [Step 2](#step2). #### 2.2.1\. Step 1: Install pathogen.vim First I'll show you how to install Tim Pope's [Pathogen][1] so that it's easy to install syntastic. Do this in your terminal so that you get the `pathogen.vim` file and the directories it needs: ```sh mkdir -p ~/.vim/autoload ~/.vim/bundle && \ curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim ``` Next you *need* to add this to your `~/.vimrc`: ```vim execute pathogen#infect() ``` #### 2.2.2\. Step 2: Install syntastic as a Pathogen bundle You now have pathogen installed and can put syntastic into `~/.vim/bundle` like this: ```sh cd ~/.vim/bundle && \ git clone https://github.com/scrooloose/syntastic.git ``` Quit vim and start it back up to reload it, then type: ```vim :Helptags ``` If you get an error when you do this, then you probably didn't install [Pathogen][1] right. Go back to [Step 1](#step1) and make sure you did the following: 1. Created both the `~/.vim/autoload` and `~/.vim/bundle` directories. 2. Added the `execute pathogen#infect()` line to your `~/.vimrc` file 3. Did the `git clone` of syntastic inside `~/.vim/bundle` 4. Have permissions to access all of these directories. ## 3\. Recommended settings Syntastic has numerous options that can be configured, and the defaults are not particularly well suitable for new users. It is recommended that you start by adding the following lines to your `vimrc` file, and return to them after reading the manual (see `:help syntastic` in Vim): ```vim set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 ``` ## 4\. FAQ __4.1. Q. I installed syntastic but it isn't reporting any errors...__ A. The most likely reason is that none of the syntax checkers that it requires is installed. For example: by default, python requires either `flake8` or `pylint` to be installed and in your `$PATH`. To see which executables are supported, look at the [wiki][3]. Note that aliases do not work; the actual executables must be available in your `$PATH`. Symbolic links are okay though. You can see syntastic's idea of available checkers by running `:SyntasticInfo`. A second probable reason is that none of the available checkers are enabled. Syntastic comes preconfigured with a default list of enabled checkers per filetype, but this list is kept short in order to prevent slowing down Vim or trying to run conflicting checks. The command `:SyntasticInfo` will show you which checkers are enabled. You can tell syntastic which checkers (among the available ones) you want to run by setting `g:syntastic__checkers` in your `vimrc` (see [below](#faqcheckers)). A third possible reason is that the `$PATH` seen by syntastic might not be same as the `$PATH` in your login shell. Syntastic runs checkers using the shell pointed to by Vim's `shell` (or by `g:syntastic_shell`, if set), and that's the shell you need to configure to set the proper `$PATH` and environment variables for your checkers. You can see syntastic's idea of `$PATH` by running ```vim :echo syntastic#util#system('echo "$PATH"') ``` on UNIX and Mac OS-X systems, or ```vim :echo syntastic#util#system('echo %PATH%') ``` on Windows. Finally, another reason it could fail is that either the command line options or the error output for a syntax checker may have changed. In this case, make sure you have the latest version of the syntax checker installed. If it still fails then post an [issue][4] - or better yet, create a pull request. __4.2. Q. The `python` checker complains about syntactically valid Python 3 constructs...__ A. Configure the `python` checker to call a Python 3 interpreter rather than Python 2, e.g: ```vim let g:syntastic_python_python_exec = '/path/to/python3' ``` __4.3. Q. Are there any local checkers for HTML5 that I can use with syntastic?__ [HTML Tidy][18] has a fork named [HTML Tidy for HTML5][19]. It's a drop in replacement, and syntastic can use it without changes. Just install it somewhere and point `g:syntastic_html_tidy_exec` to its executable: ```vim let g:syntastic_html_tidy_exec = 'tidy5' ``` Alternatively, you can install [vnu.jar][21] from the [validator.nu][20] project and run it as a [HTTP server][23]: ```sh $ java -Xss512k -cp /path/to/vnu.jar nu.validator.servlet.Main 8888 ``` Then you can [configure][22] syntastic to use it: ```vim let g:syntastic_html_validator_api = 'http://localhost:8888/' ``` __4.4. Q. The `perl` checker has stopped working...__ A. The `perl` checker runs `perl -c` against your file, which in turn __executes__ any `BEGIN`, `UNITCHECK`, and `CHECK` blocks, and any `use` statements in your file (cf. [perlrun][10]). This is probably fine if you wrote the file yourself, but it's a security problem if you're checking third party files. Since there is currently no way to disable this behaviour while still producing useful results, the checker is now disabled by default. To (re-)enable it, make sure the `g:syntastic_perl_checkers` list includes `perl`, and set `g:syntastic_enable_perl_checker` to 1 in your `vimrc`: ```vim let g:syntastic_enable_perl_checker = 1 ``` __4.5. Q. What happened to the `rustc` checker?__ A. It is now part of the [rust.vim][12] plugin. If you install this plugin the checker should be picked up automatically by syntastic. __4.6. Q. What happened to the `xcrun` checker?__ A. The `xcrun` checker used to have a security problem and it has been removed. A better checker for __Swift__ is part of the [vim-swift][24] plugin. If you install this plugin the checker should be picked up automatically by syntastic. __4.7. Q. I run a checker and the location list is not updated...__ __4.7. Q. I run`:lopen` or `:lwindow` and the error window is empty...__ A. By default the location list is changed only when you run the `:Errors` command, in order to minimise conflicts with other plugins. If you want the location list to always be updated when you run the checkers, add this line to your `vimrc`: ```vim let g:syntastic_always_populate_loc_list = 1 ``` __4.8. Q. How can I pass additional arguments to a checker?__ A. Almost all syntax checkers use the `makeprgBuild()` function. Those checkers that do can be configured using global variables. The general form of the global `args` variables is `syntastic___args`. So, If you wanted to pass `--my --args --here` to the ruby mri checker you would add this line to your `vimrc`: ```vim let g:syntastic_ruby_mri_args = "--my --args --here" ``` See `:help syntastic-checker-options` for more information. __4.9. Q. Syntastic supports several checkers for my filetype - how do I tell it which one(s) to use?__ A. Stick a line like this in your `vimrc`: ```vim let g:syntastic__checkers = [''] ``` To see the list of supported checkers for your filetype look at the [wiki][3]. e.g. Python has the following checkers, among others: `flake8`, `pyflakes`, `pylint` and a native `python` checker. To tell syntastic to use `pylint`, you would use this setting: ```vim let g:syntastic_python_checkers = ['pylint'] ``` Checkers can be chained together like this: ```vim let g:syntastic_php_checkers = ['php', 'phpcs', 'phpmd'] ``` This is telling syntastic to run the `php` checker first, and if no errors are found, run `phpcs`, and then `phpmd`. You can also run checkers explicitly by calling `:SyntasticCheck `. e.g. to run `phpcs` and `phpmd`: ```vim :SyntasticCheck phpcs phpmd ``` This works for any checkers available for the current filetype, even if they aren't listed in `g:syntastic__checkers`. You can't run checkers for "foreign" filetypes though (e.g. you can't run, say, a Python checker if the filetype of the current file is `php`). __4.10. Q. What is the difference between syntax checkers and style checkers?__ A. The errors and warnings they produce are highlighted differently and can be filtered by different rules, but otherwise the distinction is pretty much arbitrary. There is an ongoing effort to keep things consistent, so you can _generally_ expect messages produced by syntax checkers to be _mostly_ related to syntax, and messages produced by style checkers to be _mostly_ about style. But there can be no formal guarantee that, say, a style checker that runs into a syntax error wouldn't die with a fatal message, nor that a syntax checker wouldn't give you warnings against using some constructs as being bad practice. There is also no guarantee that messages marked as "style" are less severe than the ones marked as "syntax" (whatever that might mean). And there are even a few Frankenstein checkers (for example `flake8` and `pylama`) that, by their nature, produce both kinds of messages. Syntastic is not smart enough to be able to sort out these things by itself. In fact it's more useful to look at this from the perspective of filtering unwanted messages, rather than as an indicator of severity levels. The distinction between syntax and style is orthogonal to the distinction between errors and warnings, and thus you can turn off messages based on level, on type, or both. e.g. To disable all style messages: ```vim let g:syntastic_quiet_messages = { "type": "style" } ``` See `:help syntastic_quiet_messages` for details. __4.11. Q. I have enabled multiple checkers for the current filetype. How can I display all errors from all checkers together?__ A. Set `g:syntastic_aggregate_errors` to 1 in your `vimrc`: ```vim let g:syntastic_aggregate_errors = 1 ``` See `:help syntastic-aggregating-errors` for more details. __4.12. Q. How can I jump between the different errors without using the location list at the bottom of the window?__ A. Vim provides several built-in commands for this. See `:help :lnext` and `:help :lprevious`. If you use these commands a lot then you may want to add shortcut mappings to your `vimrc`, or install something like [unimpaired][2], which provides such mappings (among other things). __4.13. Q. The error window is closed automatically when I :quit the current buffer but not when I :bdelete it?__ A. There is no safe way to handle that situation automatically, but you can work around it: ```vim nnoremap :lclose:bdelete cabbrev bd =(getcmdtype()==#':' && getcmdpos()==1 ? 'lclose\|bdelete' : 'bd') ``` ## 5\. Resources The preferred place for posting suggestions, reporting bugs, and general discussions related to syntastic is the [issue tracker at GitHub][4]. A guide for writing syntax checkers can be found in the [wiki][11]. There are also a dedicated [google group][5], and a [syntastic tag at StackOverflow][6]. Syntastic aims to provide a common interface to syntax checkers for as many languages as possible. For particular languages, there are, of course, other plugins that provide more functionality than syntastic. You might want to take a look at [jedi-vim][7], [python-mode][8], or [YouCompleteMe][9]. [0]: https://github.com/scrooloose/syntastic/raw/master/_assets/screenshot_1.png [1]: https://github.com/tpope/vim-pathogen [2]: https://github.com/tpope/vim-unimpaired [3]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checkers [4]: https://github.com/scrooloose/syntastic/issues [5]: https://groups.google.com/group/vim-syntastic [6]: http://stackoverflow.com/questions/tagged/syntastic [7]: https://github.com/davidhalter/jedi-vim [8]: https://github.com/klen/python-mode [9]: http://valloric.github.io/YouCompleteMe/ [10]: http://perldoc.perl.org/perlrun.html#*-c* [11]: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide [12]: https://github.com/rust-lang/rust.vim [13]: http://www.vim.org/ [14]: https://github.com/Shougo/neobundle.vim [15]: https://github.com/MarcWeber/vim-addon-manager [16]: https://github.com/junegunn/vim-plug/ [17]: https://github.com/gmarik/Vundle.vim [18]: http://tidy.sourceforge.net/ [19]: http://www.htacg.org/tidy-html5/ [20]: http://about.validator.nu/ [21]: https://github.com/validator/validator/releases/latest [22]: https://github.com/scrooloose/syntastic/wiki/HTML%3A---validator [23]: http://validator.github.io/validator/#standalone [24]: https://github.com/kballard/vim-swift [25]: https://github.com/OmniSharp/omnisharp-vim [26]: https://github.com/myint/syntastic-extras [27]: https://github.com/roktas/syntastic-more [28]: https://github.com/venantius/vim-eastwood [29]: https://github.com/rhysd/vim-crystal [30]: https://github.com/the-lambda-church/merlin syntastic-3.7.0/_assets/000077500000000000000000000000001260473072400152105ustar00rootroot00000000000000syntastic-3.7.0/_assets/screenshot_1.png000066400000000000000000002644111260473072400203230ustar00rootroot00000000000000PNG  IHDRm`aUsRGBbKGD pHYs  tIME  / IDATxw|]ҽ[J) {)lϭ"7FQD*2d^eݦI~ I[A#h%}ٓ;/// B!B!>V?1(Ɣ)Shժ(B!BqinJ޽+-2L;w#Gsadʔ)r-Wu]΀B!B@QVkmF{gO>j)`B!BQl6WzkEH 0:&MH͚B!B3hX,UŬz}||E4m!B!(GV5mJ-B!BT 6#:"B!B?h*F@F !3gS6JfG员D͚BQTUu~{ ]Ž_ !ĿbՉJŬ_rС7py 3fw_!*(hмysZl}ZlI~^ӴA%/yɫr^gϝc-aX}ڹk: Co߾E-&0 [x 6bO.y ^v ڨsqC>8x.Tʱ{{xYWL&vf-Ǫhfsdff2ka護˯ɛoZF^򒗼e ڊ[n6s5lؐhذ=X3nao)erҿ x{{wEӚ빮WO? lC:_]Khh(eiK ^ێ^ݺXV0y4QIF\Ӵ)ko,w:'NW&P#"ÉðҪeKYi}\o/tlJƪixxxϥժo~vMPKe",ӺBqղق/W, ˗/gРA 7n𻠱l21n(_B L8ujs Fݻve'$0x~;S>gdPV-Fx|}}Is F#s=w#++syEo\nb\FDp>` fр(XVlJ|1|QVVii4n{~Yuеs'mȌPvc6٣mضAݺu䃏>V͚L.?)S?擩8KrJ oZ4'1/yۨ2/:vhSϽ3OFD HKK3ybZhArJ L"P32.:uv[z^,sn;ŭ[\$&&^rrJ1hF4b%E g.##k &QU$%X\כ a& 昭оm[`ѱ ro⥿Sn]vgĈGG#!ĕ{VzuQ%~ٞ !>pu,تe Ǝd2rj222BQ hUоWG4]yl(@'IcxYlAA~0ԩ-lB+>`sWLttt:wÇIMM-9h'WB:߃b2}}UEA-(4jz~4))Ͽřg"##OO/mti*Ly {32BP`X0*:ӏe4P< S޽QUшb!'']vs˰ (V+4.DWEQx`0B+)p+bZl{vɒ% 0C<7d !(.:{^f̞C`@ժ9.Ob0x̚O?"AA #۵`5͚n؞5b=`8[nV͚ԫ[שp]6~b3͓>O x'߬i4ƌ%ǪFZh > 2/n:tr֮[Ϙѣhڤ v7< lٺq<;\vnnnyPzu7jȌYs3j$j,v-11NPRiRS\ۿ&+߭K,]\ D듨a K.YvC ,U ȯrjE)boEuÉ(!_5EZ:8mc޼yBN@@Eբko<==1.AVVK3%%KD7iBVV}liѱׅNnn.gϝc\.+\ _2,\왟;ŋi;tО[nΝ?v͑qL&Ns/ׅvFh'[ڮҰX,4m7cX,xyy p:miϥ9nl6;U,Q}||0 usrr4-j{=q.ѼKkӦBSR躎sa6l9^W^^^xxx!P~*#w˄⟖΁-voC BQHFF˿UU-R(.\ul嘎4F#j$;;;1 K` @ϸZVXX~*:?)|uฤm>6WU1w)(3+|%۲GwEq Lz m4a᯿Bv˫oinvyyyE*2!Tf-.6 ؄栲y{h߮-N쬪ˀ2 yAaJUߥ*G4ii!gk5Thʼy~0<B+j%=#zu뒞^e.uMʺ jJ0*]!Dٝ8q"*FMG !LUUHOO/=nYqJjV헕W}׿AԲ !D UIm4B;\~'BⅆC\\>+5hd!B!(ujRA)ԡ5fQ{si\Ը/_MH0'jyoҐ A7HٶG((QFib4ڽ3~M( ;ڏE!}kZ4E"inF+hoZQpg X@_E5Po}5!"ԗӗ2p~KGGEs}(kN0jHSұq+)4(6}!B! ?D\ptQQcx~2#'HXӟ}gZ}T& r쓧ֻ}$k[ܱ)qvw\\;ޑewhG` ~XvMG| j[;g4.+maӶq/Ǣi߯r5y˝>i1{Ssc 1<&Z50sˊ~I间.}!B!z]ߗFж}G22҉=[A蚆w>߯-! k^U>gɛbNMC3Hݵaڮ-I\L&I5q5F$oފ%#kF&I:ЪIk7_v[(L#j\t XO|bYyYv-j8ń3BR6Y~Z5훿]mf.=ĥlr4jzܥ_+K!B!vիGУwt [^KdZxzyYRGF=1MQT: d'F` 9gΗ*Kz@lF1^Mc?yAZ%Nesھ%=ݡ1eO!ܱ"Po>Q|jsMV=/M\q)9ewf*~I#B!ծFd͂9 UU36hd6-Y-5yM$oN 6Gh0x U\oo GqfgcCKN-X<#:[Iw)9gfn#-+e S\j{)#? 'B!(mixՈ %PU_vgT!ߓ߬oŻX@R!B 2Vv^5#HݱᘓSΣ F zba%WWgni,U(]?4ݞAUXS >Gcp;j@I9~pڥM8N]B!B-F?FC/ydʯiCs?@HI5jyRh,%_d t,W׫(p {;[$q 9xɞ^IQiw)mB!B5Gq7ւ54M'ϬV-?kCn(UܞcH'<*;$0{aaB!]WP\ VMGӴur,hr9mp }{.\ H&B!UL65nmnQDUiWվc0|I%`B!B6"ICTo/? JwgWTNUɹ8K!BQuAwn-4ult*SUlB!B\Aghł%3 .IN_a$`B!PԩIR{>OZPNE# ]M5n$Wҥ=ƀ)$@^|}& l tm8ptsYi{@h5i(k? hۋ쓧IZ-/\yuFҧm-FeoT&40jP3q\zF5y4m$6.֜`8tڅ]v]+1)t]GU݀փ| Y'Qu$kL_Nჟs1)۞h8߶&N3wQǜ'nE9O|jܡB!BL,Eb?Mx>䜿@֡c}^͔iN @qNDUoҐK.ǚKPTݍ ? Nе-hy I6aJHKpVA[iarx/C[<t ؆j[;ּ<ºu"K{6Pڙ}<">jQ?"at]g+И`oLی[ZpoF3ᾶ|o/FA3M]*cloR"#'g6_6BaXmKsvmfĠh׈/O+Уe$&>5aİ4w'Z޿8ï12|MVZn=ìӫU >{;3XǑmU!BHVQzDquje{~$RY򦭘SHݵע( ж%+֒{:Dª J 6o˱ddq+QZ5#~ ̩ie;5F\nM -By$NX"NGH^r i9:\z7eG@E|bŦWl 6¤+\b&/au8ou(>ޕKۏ{܂M~]CC)X,LbѨ c9Ei(FrM8t:&^b!B!AQODuU+'Fp IDAT` 9gΗ*Kz@lF1^Mc?yAZ% ~~N۷;Dcjw=cTP+(πqXjA^ĥ9.)@oW֞3jW#d_n2e,C`g{:zQ F &NyZv3ϬكE~*utX5@gB!BHVAƿe3| {Z3)^2x0bR֍}m$ݚ\B&k^m9B!Rk^5".*a!+u=֧'5kxv}"91PhRd۴BOhΎ]:rn0b%{'Q@Q^op9NzVK/3-\H!͜<)q<< aބx1jPS6ud=a@U<r-EIJϥcp `,kNPTU!N06HjFYy3kTK6zH3Ss[OT'B!AxUǜfv@"jHPUFjba%WW ͘_ǠV"A=yyRd՞?W*Y0wr2íz(J̙jN_phT6?.ZS$hp{c?ߧ~oj~[]1 {ۍTKyյCKnߕڑkYqw(iy|c?Z`O_.OoHOmxmF<2r;V܂ ؓڑx/0[_$su&׍,Z-Jwo3Ŝ@rZγ\׵5_TSvJ~]o8KVv.g3c"ǃu~a' 'ॵu#G5#GI7e!][̱g%QXu;Sk@QP.훳uׁ 415 ׭BO !BˊԴBpT.ܛ˜7 GU_^c2/kE9+b^ PAH $/$&krMyxyz|jZ&!d_,{U?=K )@]hH񉗗':CC8s>) V@M&i:z6f|h |0z߳i%`=}.L5s*!$8Դ27q1bvn[\ !BTUp1%GRv$<=,伸_.-eVxu*wۊLgsi/VvNĞ'Q]%_>S=,3I)iԊ sU2E\V C~{PU߿?Vә?{GĸHA뫼  ]¶]+5(iڨ'OrLKrj)B!*HI;+aٮxW婛MکR+_wM%Xkg.RH$5#՟F4t ê=sg*}Z4nP3*w0Nk VD^!"y&i,E"M׋]>lV@u 5+ M946:!L H(IlCU4]ǧZּߞt(=}wigҥ _}?<cPXR7~`▇^)2sx]>=4B!Q^ᖡȱ`t4M+W'7ςE b۶z "w vrDgS6^N<`SPtU@u^($&9} VK*\Z^g~YEq`̟4y0v-,X nr;vjjlǜpr麎ksbl6ݻ3f s~]wͮ]bZ]w䯻`Fu^6E6oO]BMFl{PJqB!=cUoD'S6>jV d$k|EGmK0-ErM fL| VinT3^ m}2+ق͛7kdB@l97^SEW!O +pOu._{*ZhYQ*`uzfTZ"smop f"y2ePO^/u[{[\KA*T̙:o?%QR R 4KN W剟?u98ҶAF)wyb1埓s8{Nm>f_>pؙ 'iyyyXV~WիW[hٲ٦U/~+B!*ݦMm6=y>O%37PA=PRj!VVJ掇/5ܟo:-;j[P]LmPא%.oGO7}-y}Z-;]lغ}TU͟y_F nF~7;|AzCi6[QU' {?$V!DyH&6F> $#7PKD]#K:%ڼ{q-WU^Wz%iT6?.Z2hީw|=Â9z,.RB}ٯ/пO'ߢb3c4ٹ%* ;8uյCKnߕڑkYq@|Ө璲1VLsindbd0t)jXV-bbbf|7<3WPQU͖8BQh*)"6-ɐʐt< F]Ȓ`-fFtZ>m!A$\ֹ57Sا kTUxydf0vĭ,^]6'#›_`Xy kDNHXH oƚM+e4CˮW6 cϩ +952?CqDTU峯;HS111,[v2rH>3f͚gMcذP!Xao!*6[&lB=xY*[B)Y.B\3y<0um;|O|b*tnwsuY 8r ˌy<JNnwx{mu)Q3vr;f2Ctghnٴ\ۙ?&Mz:ujn|̚5ѣGSЏB!*?hUW ! wVU0Z$\զ PV%^qIhH@ԋ'c'/`dU|}|^JH󖅆xyY|bSP=43㜂^2jVWҘFW8y)i{!e9 1bv"#g쫯oCBB2'OdĈ$&&~wZdxq~X,scԪ1uByickq`Zufyƿ.ls3BaOo^ ధˇI-f'^d@v>W6'bݨnƞ~.:ؗr#x`.k RRөlZXS$Q+2Or_g._v/sƴ':2>ΟS5mTSګ,&e /3ut<=QUC/?s5װgBk?꺹WE oS?ͩLFciv[WYz%4vaYwkE*wiwYU\+UQ~z}Wnmq!0цO8F6M+4py>\m !=Z~h.@+)CN]*uS/u9@Wv(Y7G%O% lhjQ;2O.d}WyؽX_B\OǓX{-CG/ss\\ދ#ނOFw/C0"iܠ6[w,wtZ^l6)Vt~e199f<<<)˨˗ ѰF [5滯ȈoYpn֎;ڏ9yu #?{;Hո} =kVp?;#мnOXГZ9E5Q7ԛFnJ/DbtIaOn}FޤeT 4_oѲA$ge˫۶(7O~ "ϞJr*5 r:SYݹ*Chu_YQXq4'rr-{ޚ2f^ds/Njݔ]۷?[ܕu%ݟ-ҴvJ&wLIrUs/{;ywkc1wNsvO)Ęq>n{U f _;#|ǿ֝vy( ]g?y~L;QNae~CEt|~5mvϬ/kA߻?b1{;?1 +u .b01 g1YLx=:Ͽd߮u' }fS0a2/>6ᅧh݌=O;N^{)mӖ-MLzYfCi;>/%5v IDAT4\6=NG$7'[SxuWi|{T|)\?.#$$ҏi}+˵a_?%{?,Οߨ%tw8*뽪 l(=z]/?f-)ZsUx{+TN=4T_L%4zfY2ᰇWGS|3[Yt)w-V~_򅮪}p}*똿o}M4+׿3SiW#fZmO7ӽuVj?N&fc4iUuZxum_;V-$kξc0 ЙX,4ĥ F#Ea_U '-% "-q&<ǎ&dBQ{N{%Z=xm^/ VHuB }ߨp?x\:Fm^;/,m@Rұeʒ/%O oG.v\όϾDkea>6OhZ/#gJ[w[p>_{N{ۭM3?{>Wwh,#pقS Ytm~]1\ץ5ټp*^t|UoCU ce~ !>{['#ǂU/[gA"xm[ SjlGt9@IȒ'])|Rd3;OlV-^Ӽ;|w4lGNf쵸ebMv*P~|v~ ]8}|O;όϽ8{H#PUU4Iq 8rw%^+%gEwʒ/%OIII(|_W.neߛ6:( 5ku*'''Q3v ۲gSIByUJgsUXq9-+[- Ե:uCv4:tBW(y*-( [!V+$]pyn^+UU5QTT J;c jjۧgGrC#iզ-}{t*s9 b6WhT@=xWױsWf}6bإ1ߩK7f|2MA!;+@4t>~-ԙ9¨9c֋bsf}:Ĵ.ܙX7h7?+}*C2+WtcGQVڗ8+u:~(m;v,uwߺz*P{ϦO3㓩tվ3ǹ*+K 4>ߵG/ޜ"/Mz EUF&<$N~\Wq/^ oEe$N)](rdIg(?kI.\Ho"A!4J`o_+""j@EP%H5s%+K&_{rSwv>;<#γdiEE <^Ed`E/NĄ1hۤ6sXfV >X0އ!v_)5k`KpatnGy}?{ѹuS\mxnT}=طg:ntXw}&hn[\+?<< ºYܥ+G Gy=X4ܚ;kӾΟaHڌړ7*6s.}#)=SuIݹ4t p?p @nn.?ػD<_2=j҇(vk'oǖ [ۿrY״9As21\q[%Aa#VlêE&F2(ݛzG(AvVAu_򥐝8fJ_Py A~ }a}Io5Oq&tMcÖzbLvbȲ-Teݍ2Xl71z,FCGQxhH}*52dAӓ6{Cu ,gU*s,7M.\_.`+}2ܓ߯?jq-E]J~~AlаѲ\=j5=18;sѲ~ Ol M{O'WTc, :. /Ü+~g/SrwPҴQ=LMO!ǍwaAĞ8Lx ^q(I%2n c㎿9h|Xys1rP4W90lLW-(mz4ė;.إ t,qz4ľ#XwCиN ׭ݼ!ڡydm{ϒ*ш9)P*7sbݖ?ٷ "›Lj=p0L9j䑮з V nAZa{b'0~ Qፅ+ 2auB\,˟'+--t A?]񲀣6 *vP]>-ci"(?Ce q#Vӽ#4N_.盧~ :5Ŝ#'WC[mK4p4_`6Tee=}iHw̚2FY<5{Kغ0c=7 z3& ;y#¥``ѹ{㴵_X1t6?q|W'htۧ63> (, .| EȠOrqPq CJzHspu i/̱Mqnkw၎>tCm+76Wo6Yぶxojk?o8k~ã]ڳѺyc:s[v.`0Z7vwFYzZʛ Y߯F;oBrtA ՜אw23sI[&6-;}1t +盧 Nv(m=Z?)w3rrlWקi,Mcu=y' ߭يĤ40ư(zt_L0ư&f7E;t<s^@m?{6 iQ #PPYw&X)CVry]# 4gI c h(ϒ-]{dž:acU:XL)Bw3WΎQ"2ů,Y&.Dw7; F.N4{@-^8s)I ATB~+1E#OqY6lCTHE|3=y_VZ(E@RzU;'e<Y?ÔpoP\7F[dX`fs! $KNʹ&J^G`"Cހ[w=NVgD,#>|"cQʐ㜊ߕû7oaYT-SLW3S J(G%7Opm` DZf4 55˭5r 6@k7۸}'?iL?{ &F~rO<:y?;m3;;X<3mZ5k LzuB1sp;#'bR@29kv3 B`<1q9˟۷"CvN.8w?o.w3ģx/-aڀ!D~ph$ R2[ Qh`d*wkkwҵBT~P1KCngcX& T*A:*LxRKogΘxbq\>ǣsn`Xlt:= ww zRGzu2?߼{E H2}{tB@o&]{ѾHuaqúǽuIpo@]tVDZڨ/>ryGN-jk1{C*a LxyגԼ"ZZ']wܿZ6 \ T?Rii GFj7  4č:VB8{ O`9Xǣ{D[xbnṡ)\ Nj09`񝧸k).Eaя3;2qY@L=K{ُ@KWoᓯי6FaunL4 o6miu?% ظ/tY.|cW2G$BœA!fbu^<9q0>88qmk}cxfHDԴ,qzvi_,~gɩظ 6%1_3|2+dH;v:}C5ŒV 0 8x`D R [['nrH D4 ⇗T"23P0}HH@6@x| q.v6e6ocN)h/_̚:hs9k৐yeh;Ignf#D5EH9_2)v鬈fڂ mo$6oڷ\.SC[#$P}gO琖`mϓw2ѯsC4ш[)Zl;roPexjI>͠ 8W)Ikc@|Bbϥpҿ KARp6ԛI]qe? L @J,:v'`5ssڠ^%>xF 艑qxoiT !8hrp8.G̳.%"95  [v]) 8v4>)7(`L翻P6CRf~w {|w9;qF?W(3(.**͝(%'4.9x%˱s|pe؍cw^!Id <<;hg>\ [ 6:JUMh۬ic̔h.'Z^Ld3wy/"xC: /EÂ'1_2KK ߇Q,ھw Taԑ_&ݼ,~{Y]|"cv[3<[[)>sOD۲ݭ_Z+iv] lo$~g//u3[Ϟs^i mqрsл@}n#)@_8ϷBəɢo91M7"[|P 869Κΐ@9>S?ow%ڵ;V⽷f7x|۰jPw|i̓T/ۿxvu0s̏:Y,L}cF BvFٚG(ѣ~/:(@Rn$ElY+#Ohjl3جyZBwyyZ޸2gQ~"`Vqrӧ)&iM »|0 fLfc8EŸ2PAatn6^դPES脄 agIQ;ɸ m{BGo[TJLک5Ğ:NޒAD"I*sČg }tZ1hIA _3mnT;y6R+YgWΊy/:wlq#jcFp|;E108i_NGDV$L 7FX BumhyYRGFD tʧd yyB^P#y|f+/̈D~EmfM\/(2nHmGFV6k6+&h/w\ƱKX2h})]L@(܍AQqK*> :(!p1Sī!ƙ >LOBGֿks/.>hģnVq_{5 EAvͰjv뺳 3a܌LE$HLMpJ^dhY?.lNY#A۵ֹYTI9Ah6z8/!f3/S=sPҿwg|z+$!+[5ANm :,.3&ӏ+7 G[h^aEӆNnpx J?ZӃQs2rTH_ Ř'ߩ+APbs 'K*FU%AT}$T&,o^JEo]."f*ш9)PrjQ+T/(=5,\rɩY8e#3+!@ɷ]3"_ ]l1(eS"3K3/DA5IZRAJ VΝ+ϒrQ442zLI܏VA-ً?8CϮבn +oeFfw t &YM$;qN@kլ1&mBAK* OOh,`Z|F)ԛ8n-un~1VLy(/YADMb3;:7FܞlDA:(qOO(eMAATUh#n HyAwaHn8m*_BkzriM FAhG^%+cܰ},&ׂ/n3/<0= t  eP,TF< Fp A*%MnmGQ+# ejh=d8Of#nZFDmّxlgkꩍF|L  j$7A$ܐA[C"4ACϒJQtM:4 sPBѢOC6%:di# ;%΍ +F ߶gzaui;eP,r6$ n%Eqd|~JDz3,Q7A$ڪ#®}G_nq.<r?TPK# 3GfR0(?f4fSaER]3&<49 NԪ_m2!9qtAD)s{%+r! RƬor2K`0AW<`"mHhbß18IS9)qDI\- x^|Fq29).HXHAQXֹ x4'(2diLNI΢y^ddfU4oH*[chFk1ORA茻PؔL cdF4בh# rnTx+$GZSs<^a'ߎԳ NJ =ci¦o2,4:.ΧiTGsAA2d!!HnXi2l6ivz%^BƜe~h/@(ڨGkcuZ|%JZMAAT_hc1 ѮsɂUa]Ez8S)uЩVC khGuP  j ʹ~Q꺈[ H`rqY">ڭ*)/Х@ -lHyL*\xo0%6faN:͵MQ:-nC9$RlTd+ )$ܸ`޸Qr<&m5\΢ >6G*?RTz">'ROe;WDJcR9KP6AD>!Aj&Ќ)c`.TGLF~Q(+S &ѷ sr2DAAA$3phb#3hzp0p326TV}>pE K0GA(.Q#D[9h-X4H3r4x)MKS^9FnHA/ g Sr21\|"r9W2*?ge mheq\HqHᏽ~JܑHkT㉓)GAQϞ[HPೠ0$ViI9c"]-x0?^':caF2,ihh4`&0vCuϵ C# YuJ _zҖ׼dc4bVQ1nX9rJj޶@u!^щdGLɴ m:,IKBcsqTՁ>:-"k7m4薟iX 1ë!uiS3& LYix)/my=bdF"M:ӘamZCaSuSCzr18Ahs#\'FAՇcr?QG'^adzƹ!up>Ι-;u68?k㧔,"ēx&r?(s|h{ K$"(/iJ\n奮BbmM st@$As2\.Qam믡4j=?\~u7dEy$HGG  *!4Æ7>[d~%:P,,"l=xQ4lof1a6 # H4{f48 濴e{+ی/cAx,梓o"p]";ן%*XRZUE3ǘ 0a<}BE#ZZZ >WbIp݄DʼnZ9[<}Cl|L5(zN&̜p@"*fv=<]>5 j$ tB]I"C{9pp~em$1G|%.v+ PFu_NI,kܔieSdh#hhQ+\܍NwoYUΔ`+-ZLLyEFc$Iu~}EDL"Spz"vjh j;ױ)@ \x ?ғl,{%^HƫR9Z1?0|dfv_4Mfz|Gc}LGymHJ@2G~%BqvN^%h ̼֣yFfor t>`ݾ3:DPܱ%WIͽѱ9zvQiG;!NAp=,je0aXn6uzle"ݽYr?`vGJm#T("uNUэITh{uZ{7N܉$x{ZZ_CR捙cF0)7m?7nņ{ cB^۵C1+GB bˮCv዆r>[FP5n%&7ZB"Dѻ[{aL0gѬS8r,:}GѬio7]c v F`\r_ڈ)Qѻ0zH/cZ zGIxw+n:-? ͚4M6W_wtXz _Jc@f Qxer}`yb"I2 *6HsD?8/c *vu_`nf tEd< D+^Եq]"5oG >WZh(2sP`@ ZePL{o_5ncjMpC!qA*h#*hد^^׮Ν8gr5[D[I/֡ܣXO|m4D&1b`9yٯ0sum;ykD!G#ua0ܮ7yvm?_MI+DFza{Bo0bƤagx޿N}G'hj;Gb`[D|Zgb#1kp,ZQdy[㍅@42̜2cºz4kIxW{Rς:HL W_ws9th nGv8rKF*icM&sZip%6'{z*lPlfhU!.]9_B*txey9:/S m U]?{O^j}аnRCTs[녜9lEbRcXYTqq"?)` ؼo:v~GG|/HNc kbv[Dx pB FB*kKYg=͌]HMc Qǜ` w]I*Šv^~ϡdwpwnb4]qo   6DBqpx=#rӬ鼀DARVt5F 쉧{AWPކynJ|KԴLx@.Z! $^;95kz4gA8 q=L;6ieBcAbn+m5 11ȰF; qT=h&=㸿]se<T<]mF:0P#bO #jBl ''`2n;Huޓ}Qq.{D;~G@;ţ"7x-:4ꘕ a",#AAQ)6Ӷd$0>xsٱ7#CA'_+ѻ1}09[<7~~S s1kDM,_Sī&"-S{V IDATOv\v- ĝE̶^6W=4o!6 ? ^忴sE I^We6njAظ3M^M# pQQQlE#2k8$99YmGrgg``"+6x; G܅-oJL<^w|1ya".Y 0 z!܅w,5XM=UzZ?mنUR R/~ 6c|3ikH=}f0ؽpW<;\zAADg;3b 0OdE]Ȋ(ѣ~evEhyf/caAddfcp^wG21V*G{,8vk<]=wQ|f,"}!`uNAt>gMcmr6 6  JDBj&2(y|m8NBEW>{^D/cu6f ۍÝ J'+gF; P6RҊ 65σ"^_//  a?J4GnYs̘KDz6*؛r>駝0nM ~6]$  etR+u1 1~p6'4T,HiL?==EAAT=8Vgs˩   C   DAAAA   DAAAA    FAAA    FAAA    FAAAh#   FAAAh#   VUxy{>Ol´ry+ 퍷_%YW499/LF>บY5=AA$ʉ<Q4:=ީtD}󜡐0|@ QdԒ, UEݡjdAAh+' u$%(JtZLLqzNeuU=oVb \ODNK,^G __vyz,AAS#Eѵ=^ROL&@d ᅧXܹ7p pB.^P:@^:ܼ}yؾ'[41]HMBZF^]j푻7"F,DMߍEDGRr:l74nVINCVk~ۃN{wѻLDEr,f=@*b^y7cÏ7ńap!BT <ԩ60—6AAP̬{'Ͽc0 7cQw:ۦ7]ÔpoPL-lɩցxrjW=i]~2k/ZÃx~뫃UHI_JCm,-a`ZaX_ͤ[cÁ+K'  HU8WFfp;)n&}K^}z":Ͼ6W?-sBpN ׮{?00pe0&Gkb'#KnI9LЪYc\MziVQ[N;߮2n;핣 W=224ԡNwF&RTq03 CTne!q=.٣=I-rh:zviظxP`0abm&Wc6SWk6AA6;;bР^-ܸ._Sī&"-SOv\v- ĝE̶^6W=VGIl8z⁲G,^ajܾ ;z,dswmjyx|b^mHшx9O mg? VM}  wpQQQlEܣ {94 +Ox^(#Ba}ѪYC[sgdq6Z3ߵc^ .~G+\#e'Gy6k[`\7L<U\z [X8Jgy0KcDmg? c E/OAA2^F:B&|YxHܱ2|diTbqX3- "3J%\$~g͓2m\U-^ЙL 1Vˋ#_Nx-OAAZV LǕ p_Xu*  DQZ;`D!MEYnnvbH  ST-\ .f׎>{Bh5gy37~iutǡ>0Cx:AAA) ˍkr51ݜ0*f\F  DQS3jеS\K)Ŏp0uEXl7:o%DtԚf  H5a5oܱ%;hZIq   ?Ĭ\#'ϢCpw͚6@y10`0a +7媍n  :P{l|ri4;@֩-&~Bո~܄k H4wwy {E@S횭˷lEˤL7viq_fM`ݦ}r_?4Йxb"o<ϓ  jʹ@y{:Ÿ}}O,/[Quh\'^\Sg`֔V8Ѿu8X ^5jc^yUføBO:”4ww|XnͽX$ FzMxWujxmh۲ Gu}GU;I&DI[PtPT]]u oa˂ $`D t%&3d10L23!z0w;gιͿʘo೭'|s r0s -]MZzy&.\/VW>;4yydf璔h.=;u'246qlyRCN)tB!D##/k?6 @fL37&4$ ?.3s陹.7ߛ{g).DO^n(.WWp2qFQZqmVu׈ذ4b[ #7TT)B!Ag`ɘ,d.tZFpr e]u{s|̭W=#+o,&|b9 @Lt^8r [6̹,k3|Kcx{+Z kӲGOd1m!BNG^f`{:*7a #ÉelqOAu{s||tle!XJF۾qK*&AlҲ<;^a=0"Ø8ѵ}7z=2)(n*TB!ş0)q<4|>kn5b+:SfOA[u{s|zp{,EQ|BXU"hul܆<Fq&-U_l:;cMLJĜ1T>Y ]UzݶԽLNL8NI_E^7ҝ5e>>Z4fn!A̬<B!$}ƌhƢEo/khʔh4Uu7+b>MuTEqnWIzLtqiOw: -9=ߛqwƛehU}iӲ [pCǑ7d-y9i[HuX/>5GO}0?3goGOK&Bqקة3FO3RwH[msw9pl]/*Du{s^WM>W[f{U#UulUrf}Z˃y˰W}ӕEȱ3 !B! &WL!tكCkKP!HӬB!B6qwlܴզַiե{J:~<u_!B6qTx?.ϼ6Z5`0j2nL>8Nv7ʜ${~.6{Fށe OוEEo}Y6f[9wmo}Of#<4q#thۂg_gHF uRog4_rٹDU9XW"JB!$hbW+g[KΥga*ٺi4qۯgg_\sYe4V>W͔[, L,[ ]ځA7׉@`$( SD;1grN9O_mm(Ndf呕GҊ/ɧLW>[qԷGU;ue!BQUO[fV>!Kq rtT9@&=3_o)(| ))*&_ڗWHtTEiZK`Z4g☁ؼ1!A`Ɲ>/EEgȔH!B i$'71<@lLD@e/4]xR"bZwZlʙsY>%#y|澛BHpK=Ne=''Ч9:El8z YHB!uN[fDʄku[R6q8 bPͯz/uAztm 3r ":2ȈP&V7ɧKV[{vȓ)eSB!®^9gs6v \Ic(f3 ]9sЗ ~k6nCb b8/xbZڷ-u/8>gҽ>o/Ixd'_s{.9|s_y ]ٞ5| ڪߛ,Mc(S^M-3w  B5df8B!5@IJJg̘i,Z=#] M2dSulUt\9UQOQ4yn-y*7+euݧR KMx}24r=vW(׭Z*^B/+Ou4u(Л{>z!x8=~;zZ7!B}:`44+ qWi4abǦb-0vD?~CEQAZE_ڷrfGV,wݕm]/*QGu{s=oN}>]Y;#B!5O=2Ǯ=4eO5>_w%^\uRxR_!$hM~tK߁ٮ##$6MeB!Vf.[)k11 7sϟW¢} p.E$*sa. #)[UUttDB!0] ts@t0FFoʠM\YCleK 9B ڪ4M(U50M16M.m:܍10\ޟ?FuF}];q䏀|EYo0ک-9]!D\aKThrٹ!$aRTj!\('sԯ,$ !AοIاGyI76~|z{^޿VsON=8Ŝ/I.]lfRX>9WxaP8EeK縟?U(ic̅ ]ck@ s2>nL40JE?>սnqMy\l40> 5mrb3 TZLQ P .W/kke^6"tT#rܗ+ JXX=Օ pG۲1?86+3 ݖ*;PvrUQp0^IAa,y g#EBqn% -.b`uzl_ɪPڗmU3j,io-afA ڄ݄6~n/GUK! mlVژx<-( (τYtVH uL[4s5Ȫ+ )8|/;h&yGdWyܬCw) mi YY~َ9y?(AE$Xia+52Q^ lQne)!BԞ'cVbSi 4e`Ϋ~0 8ULKX4d`8FʽIh)z[)PG0b>Օ a`(4r`Aa7(erâ1b6+NrϟOC(0kaѬ7s[4C'GQ9@ zNJ xܔHek6;|EtkϘ1MXm{2e:L,Rbܴuv奪Ye:Ϩa}h{S3f[]x Vc6ۿ-JY8 wb8}6w|ʱg?? OZ q-O{') g}>:movƴjфVmd?::2ndDr)Z 3_L/V1Iѵ-( ;vc/x=e,s$XOro :}WkM% +.bV6%:'B\nJGQcHԮөݍ2'Ǟf㞑we8RU^ xx(eC8>?.ϼ6Z5')?=[T?oүo}Y6f[P޵o<9{R+Xw'6:g_Y_1$QwOUUC<|8?D2jXorQdWYêNUU..xڔ !BHV s -]MZzy&.\\KΥga*ٺi4qmޯgg_\sYeƦilZlUW7d$( SD;1grN9O_mm(e[/74yyde/qK{Gi;df呕GҊ/ЩRVZTa{_K>:^:5h !OGֲ(| ))*yfVcc>:*G~XK`Z4g☁ؼ1!AAmĨ_02r/oFQF}MU]gETj%L(R'B!mW\fB"u/sriɳD '<kn%{kчkx|({EqϾf!( }V>vkOiÜUxS~usJ0r]٪b9EQ퇪UUQtt4MV}WIzst KMx}22^|j"&y&Aې *>QZƎO?pLxS~uϻ{l[[T]urfJAyӕEȱ3]%\\.~zUҎ OSQ?#Ml-!FhkfeĿ#)oH!WmW=2Ǯ=4eM9煹ݹUUӬ^֢~:OR{.b6;e~B6ʒSYUM{)TU/"WwU'7)Opi+1V=!=6/D!ٴg6o]6Px7mf]r2w)ƭ C=y0gж˅َ-ҩT[cJ{k1y8ˇ*ŊBR+/T[|E!K[Ť=)JZFJP(;9mê(؜|R>B!$h+$ĺwԹъɏnb;4׎և75cv{ꃔ7mf1o8xTY1vD?"CI|%Y2`+04ciP bqU+n1eeBCd->K!f_߫PyNSHȀ3+S]ڎ+ki ] QPXBQS.=b΂XݍF ɲ r$bV$gj\F~]q,5FWGDx,؀\E{@ ᱈ y) /01AS ` & eloDH(ND簘jh6gE5⽠0`*eUTvsX4C"kOBw#m6{#"<R_Fj"K;Hٌ:y܍9:9~.mټmwF"#$6 qiddrY`yscP) ?!> j6_Q]9_UwF~-[^[D%:[0sH1 ܝ#ʽ*Wyގ-[5:BU+T?5m,C~???T``HD@_ڹMnqQU$B:yz:7 $,s÷ `aSj`#e&cSZs '7[7AVaglޘ~S)hSUC{3wWBCI}wlgk{^hC$hE)i=o]{8wky(?e,s$XO^qqm9C&%G׶(ع%˿R\(dݟ(NM%rYt~B~ OL@U^xrw%x5S?t#c: *vjKNnBQd-Kّ'TN%fVD*$ ]AEUUm;wc˿դgW`bʯHα¼Rxpp|o.\Es<3Ox*`iz2#iŗNRݦilZYdlf,N[ofi2_sY,|{7wOa~>oa0(b÷s:I)];qc끕)쑞ֶԽLNL8NIw t'& 63ib#xz06ouv3ashگ_hb=CQ&:j|N1{HYRж4ySs(J%G>k?_Y.I@.%o}|7h+jL$;'Z{Ymʧ]-ڔbbCptos"b9W@)$\F݄($%%3fF4-z>-Lx$2&3}57ٞB\BלQb4E(n۫+_U r}iӲ=Ө(*Tr.kzOW-~i/9F9F>./G2ۜ|jRwVAsExᣧI^Arݿ'2"_,'N4`}p^'$&>'2TQo\^xOӱSgFf##mz~TB*t{6e6ETWs+np&p-kzo{ 2*Ûwm* ݔa IDAT9BkB?cn l.JwzaӴkb+]׽^_L\>_~n5 McXQV,BRJ !EʦP')4 Ks'ey!Am3 !.hg-(A񛌴 !AJ^ǁ#$*B"e,_W+12tE]7jX^|jb̘/<1nſkh@Q!jXMQX+ H׸<݈Vw;jf7ıVWt9O{'v7Jȸiɡ#xk'v9+72CCӯ|NW('_|tU1Iѵ-( ;vc/0'y9]aF1i3_{S~x㭏e=xh^W)UUԾ%Id汩Ya+3zx_E+ u6qK7$ٟp}e;IKS6ôk՜3i.ͭZ;ط ?XñiD3|m|.teka2dRͯA=پk/=_.*"*ۙ[@txX偽:}6=68L.* JFe#eǨڐ0EE W l@[xojҳ+0lW$ti<%+\z" M׶zvI%;'e)\ SW_UW7)):s"s1kFVQ*\ݿl52+չIO,M@fvٹ$%w韞؞+-Qi{Ss~h,OM*ܦ;9ϓa{2{8" 'Ϥ3?SӫФQ,dd{O;@*:QS"?)_"FF !׼MTR<$*ղ(|  kHn). =3g2ՕM.e[4g☁ؼ1!A`OhR3.MZTd8Y'#ǥ"*m;tAU tlPf >' 8yK YЫjkZʝn庆XJJX~ܼB(Js?m6*2_sMTd!$8%\~S5stZ&1ѮWXi{^~!:`+v.QTL,JKKkr>>ߎ]JV1PLTAΪl:yS@Ϡ㖛ý^l=_3nٔ3֥Mf=q 6BԾD%L.e^z9QLu|P6nIe4BUTZ6g[il޶IDx(Fմ/e,V-~ʴ99t S`{оvу #*2ɉ]g}7zёDEطص*uAƍ??vrb5#iӲ0mG:Lj= 4t~d~&~?Ef#t/ =rmۧVo?YM!.-o(OT"HFjٚЁ矘@(Τe-^+nfAc#( LBv w}m<%X QQO忽&%♇ƓG|=:{ݿɫ71)qsfN`Pdw)g_3etv>Ͽv$Aٵ M;grdWkF~) FqRV[Go'3+?ۺu/]CzcRRb,w$I/-u/8>g]]M-3w jPʓq8dm6!G$Q$}ƌhƢEo/khʔ.\(g;.n Z)Z?@Td(=?GinrNMyL$\FUWm]\J쯪cꦎ^2+˛ָ.^>]]#oˍޗ6-e.}S9|4ɫ7 چO{k>ppk&NMQ{;AWH!.RkS&*+C"X.^tԙL#K]\W|Xv 9я~>)xW]9ޖ6[{88 V`^ⱼ鿋9:TޜV݌TN2{2}9ӕEȱ3|&k !ĕ!JD}#AUhϾko,MYjr^ܝ=s4{ȆY} f&W$*Kj֟ټmw6F)㯄nhD}^M[Pf"qʕsxU}$ )لvԭ5Raj۫sgM̩B\}Gݞ')4ª~G%6V3|/ /*fjKe;=YKI)1ƀk㏨S6(8$B\y+"4aUhŊKa10O1=O7!A}Uq[qWj ٵf]"HVTPyMPH|IҎc'8u6Ҷg38r, ]^3m>4{&]xNoެVhSbWVWzM_H6JTWS $#JWoUZVZoB>_nܚVlfkt܆-w}B/JڔnYBkpO7d&y|.t]';dXK7tBŵ c"Ё{v晙TZgizs;Ql1o^4]Q 2x_4oϘ>7Ьa(EV~_t ]6o tkBx?0Y} `\¦iVcAU#9=?,0CҫC#sk`..uh̉IorϤ7(*'rgҲǯ4;?gPypXkwEQ#<4 C|a^VYO|L˩2rho;uZm-Tc[v&3+eۼן䍷>tѭy/fݟ(NM%rYWBGƍOH9[?|Fƛϗo :}Zu~JhH0՘Ŏ]\e1q zuk|w(5򠼟[Y!*oBc ۍ4b>6~w'6:g_Y<)&X|@~I1AF-2UǵْV[r:--~a[0Z5LZK]nnՂ=XWB^2 L ؓ΋[X{vGde2<4q+ Mӽ|%;7vdVtjw#ITdf؁3|=/ x:L8Fm,7!ΣnM2Bzk*9똊,Oq~[o-%3;]yŗ$EIg3|Mؽ7>__FiͱX(=jgs(4[ǻ9 0]Kݻ9o,'rk)`nʯnXLəL{`Ƿf=Hz]w)t݈Q"#^ymʭ,Zwqp.]x{ <esǸߍ^?kc^z?e[Ank5S9ko&+^hRBXh0f!e?{cGБS#_mIicu04c֟_ /Y%:|{Fr_"-= ]Y+XKG[]ޑ[;cړ- gra.#L|)OT22eRHV4s.բ"ulO!*2}jPUњn_R~{ѕriw+r64j0t{7H!}R]l Bz!H @z t0qIֽd*mrcft9s̜3gi:; 4j~Hp%N;F^gDA0-ZoV2k 4a橂\­SkJ*Jy38^ (F[c@n^͢"8sńr)# Fӓ2~2d*OCߞ2f O=|{cǞ9~n;\$mWBtbt#/hɴ|+Wxhj4"}H*!r⩟8;_ "|H.2_[ثҭj d J#}f[PN_RyUԖuS([t:5hmޥckL݇5#I9Oڥ+@^d\ɥҡ)X?_BIi9~>|W/gS/ӡmK.gZI\Vpgϳud3띯),.1FT^A%V:F(h(EVp[ Tޡt3~[D\V@f?2aބ6[eZع@rێdzqq8zm˃" %啄y͝yg m` >j!><6!,<:>`xdl|/p>V_W՞FySD|/i o5c-7>c;_vs2EƳe{Iؾvbʤ;|a"r A<4u_:Ik4̾'nu[2D "mc1s]ׄpm  $X7V# p+p+P8@%`HY1>ʮ7Bis3VIaq MKt&z_7Д1 :ɏ+6]ܾ~%?p3LNn?,_O],?xd 8L%[e6k]3mOφKCd̓7wdS)(N\gA8mOE^'MC}xEΚ@aL?mb<9)Aވ`=4:٪֝ q|`׉,毳,W,9̣{[P7kO3{Iۺpװd͚S I2u#pwn45π DRW#I8BJQI:|ﶆGN}ٵ,q?r^}GG_Ȣܷeoܱ~y=d `a08_SzU`53lZ^~d9:j>ї]UIG诉ϟϨ;zTqN:*dLaW0'$mQU?[^=͚n~}ڶ-0a콜>w%+7_wdV7fXNg]R 7 )*6P,JHH슗Z픧=;fe.`k I` mZ);*MҫPպێ'W3ۣC#CRq[gZ|6;X W 5sS;v(5un Q6yun6dӬꗟWmA8m!g{ֿe;Y6bP7Ξl 4b8|b*5n j hS@iIxz$U'yGP^bl5-H"+O h,3eʮhSPHMh4k䋟@14"ݝK:tGfSׂ(`uۥ«Tjz\^'V*cqIʒ/^^f>%ڡqE\o7{^#]I|1QZ,ϖZ+OícB57_K|NʟT>[6$l'ƕ!Vwl (PƆ!P3aQcy ⡡@_h'?Vb~,X t K2ad_^.c򄡼OkEQZ[ͦ@ 䣠0l?t5E%A( IDATw( S5*u:RN'(fsfǬ6Hމ2(islQԐ KٜMM'{Zpt×"+hVVy](P@_x{/(5(R5@^FFz=vϽGavQըv=JqfEQ+-on@ fu[DɼT#lSaܰHһ[Gv8FeΩgcs; A)Pw>h n7/ ̣6E E=XyC+UAtMz(uSmc/-6Q4v 7 쁿/{+)+iQ+dGZ͇_-5YՅGyT$%e,Y tS/0Zn;{2hZc(T"KcYCi)^7y4}{tA`c|+4l SnFDXҳ_8!ݡgSmT*^/R}H?V")P@fT2Zyy_Ѷu<rݮc­t[Kn)|":7N[̦8;9֭,K|p{|3:Yj͑cۍ`o/S^O,/{@ j~oCb6|JJ˸L4oFeZ|e2sΧFm$F͗ |Za!?G/"]:f"d;[ _7!2wN ,rwNmfh|k;q'#<4$ѨW>K֒[@n^ZD/$I C_tU߫`o z?ȹZ@i }{v6;[Okʥ_Wo'eƕ#3k'q7qF&(*Ib\iEz(G1(P@ ֬ik7~KiYS4%?.Aޞ%,2:DNr()b,M-ۢbBC(0_DX̵R`f_+'@_  ;פ3RLwN Aԅm+YTg_'ÑC]9b0[  RFaAX)p~qm[qZaAQ *UĢn*-z7*% (P͸!#EQD%Z_vy&Q&(9}?Pӗ<4R|#=i$fXDW{$}{t[u/Odx 63ge;8ȟf7x`hM2[D\V="48 c49bq~+/ Qk1M_~HPOёݙ}O굲,#RF7U|$VF*n6 (P@qHb|ZG;~x)e4A!j8<ÎʎMoѣ MiIwE#-??Ϡg/A4FWع7'yTǐ.x{ rF6~j4.{[v之ȲĖxqb$IfԱ4kAIY9KWn2Rg|/)co-#w'"zitI(CSk3w$?`$8RfQkݜ?DҥSkE)pɲݶ{)w)P@ aYo!I_}mxh%_FqI~-{k5%r񐙄 fFe4V(Z׶ooٹ3AU$ʲlR,c-?o/o0y?]%* e ` FriC 2*Qpefm.dZm[FilЗ+Ĭ,ƗGoS( R@ H]眊zsx( 3hɒ>L*]2ɗ!EQD^[8y"SOd*SnRP{|5}Bޝ`f-omgcŀ܋J(P@TxO`O]c曗C>+?}7jZа`0$IBӡDr(+-8{M$ of݁xxxPZZŋYu|6˕zWꊾ^TU~pU EN"1hPZGMYKٶ0n :-=3,9 3E{nڑGP/EEe}O[{͚3thW.܀,f#JEaa ǎ{qJZx4 Aѱ}8^ xbbMaa);vpyfμnBXO7Ngaxx 2c$˜ۿszn} uQz!Mwzv.Crq?ovolb"'OC>xy{s53Ckײi*JKr<SR&k@V~o7Pgi_S@α݁JJʍ,tЂ~efrSS.5}?zNHCN4Y,ˌӛӧ/lv^jF|{())',,jRB  ͹`5r{X eUXl޽(|2Oйs ݺر4LÃ9ujQ7Ώ;6EOT*6l8@^^ kZ'[iРY:ӧ/!2V(IWuME I >>8~6BW{QAxc^Eeݴ͛$5qbߞj57ޝ:MNW_eڴ)WΟ_ɓ NJŻiv=я>JhӦ99sȽt A[QҷB$n~~0kbx?ײWQ$M_P)[oS^\l=5?v KJز`~zԉ՟~j>>,wˬ7YWcz܁si.tʕۗ`cZAA;v`M7YξP^̙S{u6LЇ2 _~; yp *`۶#4k!ݽ[L-F@Çw7{t^ݻ:֯o`P1fL/}~@w{Xh#Gry)LԻ~U.ر(  ȳsΤI[󧘘sfQts>HJٵzѷo6?8w*mz[CYI4`O(/OOJEQg5r$)[r̙U7=Gg\0I6o_x]嗍 ΥCR C0lq}?12Z?pTO>ɛ&dc!TsE\߾=s栫U=#"(ζp8Rڬ|sdgr_ԩw~ھhQ=6;lO]|JYvm>HG@ߝ*[eeEo-@wH].h=/ tsy t2ggDHu޽; "6짠ʍ#B,Kу(|^~]ĉTViP+EElxc5k`a%QQu0~a#e.T7]4Ԩ;NZ|?Loxz#;;;R[߫YVohF*Pp@_hExM6㾾jڶu(FcisY֗˯I^߿3(yc4QPZZ~C?!!Q8v,8'$?S໗_fw3iCNz:׮eSQVƾիRC1cؿfѴz2,i|wq8v`/c2[/f/+*b?( /PVP`Qr*GʳU7/@ŋȲ}3}NJ7DPx8SO~?)ɩ394QNKiӜ }ziFȑ7vޝ7(ZF$ɔiغ0 ILlA},?v: |Dd@+FZ(O@1Xx6+6ʂA(#j:1*XuB_Nٳ٪s8pu]^: ;w;S;^:X %$[U*6(3] nTThUy+0{9j4ꪣCL؏3]ƉFS{={Nп4Ο4뫦@oH󃲢"~9|(Ҵm[O]ow/Hyq1G7oqtٳ eexe1hѩ~AAڎÇKOGR:O@!?l{k5o_9raNXOTFE1nLc?jgUxxx>੧f޼O;xxxXRټAi(+^jFyS/?2vx]C{_RZEES/|Sk^M P2J DDxGNNA2*]k] ]S(ɸsg 6٨T"c4>TVqM` nh+ (/uIE9˴(QOVM'#*deuXnyO.X'&.\99hi_Z&.dKLLS>wy>i6^,IUå'XcJne˸kJJ8s11~ȲlXؼp! wJ  FA6jWvh+*T-lr5#O}⼼Zm{}R#M3:s~ұc&&}BFq%5|Uδ&&rq }0xT59}iʔ6oo*b8~<"+"DʞQ#ghuuKuٶA<As6E6؃sO483(z[޽eûLصȖSSXg/0 o@RR.dqRzWsE~q +)TI3$'O鄷}#DnXN*jr0r(`߳g|}ٳ=ҥK,eu)z}8qb'СsjOz_k?m~ IM(<f„n;U8z4Y6?xOzMFG$4*3fpQѣhc޸VSAVGUmMGqn.%%EF2o3;?Ϗ΢ٳYnr2_smNs8 \Ů˹ k QE|<̝kq DMл7i< hz>ЙŔmH>ܢnNΝHJȭ#"EElv]9vu6K~7m ƖQ$5\*N&pkW?d!T+9 L)!, J{uΠIՁGOYYbMCС/e! ᷗ_[lpnw t'#FtÃG!"%1|x,lQY\eۺvaqiAJZгg{JJٽ8۶Kgi}"T,W^6o/ﴩ8zKYnp^: xĈHNرYܹ9|j'=z_xJJIN>֭?k߿3GϛX_92T߿3_>F`|y'<<=)Ď,?|2>˩Zۇr̙?&QWb>o=Ǎ3>wK/߹p,o*&͜_6ss5s:{6(ҙ,{ڬYl DMq sDƒy [ ̞YYlʷ&W_U @ii)>VfkZxĐ#̟?_5-$IUƇ <${q X'* IDATpנ4+v kIP[oP+ect2!L㮙Sηs^\%f=Ъ U H|^FbrU> HU|՝ss"cbSٱ|D \&k,&5@᳣}۔5[X_[-Bo6ٱ <{$IӥKk-fU{'{4:RN2[H?!@M3+Y-u=csϙ*a-M4˒ |QQD W:Sm`e|Cʑ[5Q$$#ţG㫯935lHۯG=8xlO%***}:yx6s/;#Ԥ$)'/;]V6 wd #pRUFY9{ a .mUp}J>ate賤ն|nn2]G\qSK͢PMs (P̞pVT􋗒NiOvd&oŋؿ,;.F=i;C|rg&ƆJc?DWe6 }ePnm^euj.J]]GؑT?Zعz2%owQP^ɧSj箲TjgauJgK18OC-iNMlF}l!tR TWigK?4ڱu"ƨj# ܇ RٽkC #6 *xOFR[Y)Q\TDVV;w( j|G':aɝ |65//u-_ ^xxE6Зh]#W̫_/ㇽ`e2WTJ;ͭ]Xm]Yw2ʚwJ5:ty5f|u~Í>*:,4D=R7Oq %IBӡDrT*M4e˖l޸Ih+XWK4<!]'fQ\c1?f+C ہXHKAtrEmku$ jxlqW?xV!>D@Mu RÁK5ؓJ`VJW:6YwDߖWH/(e)n"^I{=F/[ kI4E@z۰#HF˰P-NI^b[QPվeDcKh._?5?hˠ6a$I2[^tv ܣe0 H rڣBԵ~/zcY$B ^f}"&jE(xjک 6Ơ)V/5b '5WKДmHϊ#hhI-2>o_Ňx_+~=-Qj݂V>W`oZ>NdQX;7PA_]Ys, 2ۻF!o+Qr8_O:D EE҃X,CA-6E]A2`o'x|` >z: M0-Ql:Cq]rS\lɇU),;<$ G@: b~e[JFGt7c:Eҽe>,X6RR#Y wlI"I,;A|td %WꛦO2|o5xRر9`?q}t^[tF9O$X]lqh}PƏ yܜ`y檾b?OjWhydYí<47;G6UGTMA,vNӟH_s٫<,CϖA-/Ѹlo|pE?Է|ك=sT>k+ *ЛrurZA=sLK>w7x{|"چ! b!ϓMr!O E>S,L'_Ax{D6]mRN~EeZ֟ȦPc'Qao:]aB|GQy:MJ:RO߂v4[FM8%x{fHp]bh9]L|TqUۖ|(%K׻.2".|*_keYP7C%ӭ҄GD%…;MA9R3Uu_z0_d0[3uWU)Ydixud;8֕k;i=:"_VEΟmGjB]wռޙԑ?ƴgxVGؽвK Ng#_y$é+%t4.ْٜ o|ܚ(PYX2ʵm#x|5mgsg3"=%!Z6}!BP_/nt]i_wߖ~_{Vtι!XCH쵏`7YsXOtc\CNJkqu|WW緻V<9H'Sb$owq=na?տOwkGWc/{'-4ț̢r2 +$IY2 F `;rWsi!?wdɱ6U`>WV2 j),C}=SDu|+DK o3%S]L|/:o _LP:4i {i 3++j:Gugis5]?OG%go_FNG:VWBȇʴ;X֝}dVҳZ{hINk2 C>lտygj=Oz,lP˕^GyeDy\lj|o+BEUJ`h3^P%O{6((F#1˗=ؓ?G.QbT7eIcW(,'*HmGC_+8r y 6I݌z>V11mB ~yoK|Tiul)XWޞhj[;`t7n$M+`lw mRiwȇy{W/R»jgeAŖ~_{ 9'(P!8/!B}8SBnuW7[?MMdz??SBy?^sD_]՟AN,_m˟Y0(VoP_O**uMcP0vJVGWVC_+lBnH:,RVK|eޞx{/tfX E?C8\Lv J ~Hlڷ`Z +P=[Ub/>SljkbG,?N~2-Keеef!@AiiFQW?K?kN!ː, ],Mތow_dH<#W_(Dx1M(ڄ9ă.Y|UL@Ƽ+5S~>ο;s$/aY{,yRRĆh#}GW붦Sic:51"K>j¸x}__s:FbgssSɤ(/8N=ڂ߅,TUwy{iuZu^ pham]XʴH#^{ @faqWzǕ}:̂rHnk{~i|uU?DA{`uuWySQ)(D ѽ4^ϗgz IX:p0d f82tL˴VdAIhi? nH [FWS^;G[ɇ;˔e]wMhga޾z ng/ #Z~m_G//>-Dn9J-)fu=99m$epoCVogGi>k= gK18Sx2/hK0]m{Ç[˸x/Fӟ7kO{+Se35wWC?;3oVgd!GS:wd?r/*,#I$!UɲDEEŵ&y .i-wLgJ&5wO{1(?;^p/?qCϦ&Ԫ>zf}cMg4x(,*}ccSxNstS-Qڿ~_(im9 @^b yJ5R&ž^TpFq?ޝCvnvM#UboL$۬|[ R+A `p30ح,P^Ȳ^UW (P@ CP!ƏtwAd4ZNY K=;όwtni;Zsj99}6:I7du爢>L…ӐsGGC`BNvZ;W-~9Qԇ̸Y5.rjl5 s[y6ls}b?CrWC_Q]n۩.wm(pm# "E$62J$IH PguY_ "4 EPzG=}M<>X;C_c u2^c#ESw?ΩK|U"9 rw݆"(r磳&^ ׿Ze 4Dݙ6ݍzao7]At8?0JKg]՝M;ҡp"#ۣRyRRÅ {9~| Zm$$Lfh4ŤС_(++TzQ}0S=hɱStɟgL[Ͷ]10)Js?Y\띆ο#VupU>VyPCuuYc-ݬ-ӹxvW/Ғ}B)!-m 7sܟ?e?,֯BqOcÆ;7*|TV,}Qa6HF W?kR uwpEmދQTҋZKN*7zV@A1.z?RǩH@5w2%ZSt7*>MH+4>/ڼeo-v.zgPy3c93b)z3ڶ?< \< $S8=]u'#Wo+2Lڵ<,dfeo?8jڪUO:vE``Zm)GȲneŋٿ' ĺu΢,[omؾ **(._4a<@ҤIu+?6߼̪>bf<6/X`V}a#6(-[;`_~sx%Lea!\JotdןWpd:mMϵ HJIÈ ً|rd_u }^{( ,}{ͣ<*2ĆmeoMMAؽ [#"䦁=e|`%eefِF>İN<ٍw=G"MHd@y(ܲ~2ڏw:ee23¡;tF.9xg~e&6Ffv2֬y_tki*:3YYt ]/QTA8u*{'IUV2k(TtۗϟzMH>}*?G i҄&M9mS廂;ijQԅ77ɇN0F?NƈzvffmҧG'h>R_{6~M"Bg0{bZP;<?\|ڷni >y0C6 &Oj俫S;+:i8Hbx=?sT9OofpD#jm?$}.c56l;/ CX~'ooFpjp 'Imؓ[7@\m6ߺ柫TWC]{Q*r;]GM[Etl? qsU=qUC+PpCmWwYLfS؋Ÿތ<" CӫɵRk<  5~qmP .~0п{O&bNj IDAT3ypwH/FYJȿ)Lw>TTwz TTwxTUǿL&2$[舀Hi ]Aw]wAb4i{W+5@ڤd=?fr3)Nf& ~'ýsyyiY7nG,;a2鑛{G,Gi'WH>'OvdkJ:HN'W1ǎ-Ej`Ȑ0z< 1eMCȽsE9"v•[p;#Ebۼ$wtl8p-d sYԛw7Ch`=QIHX Y9yŢ>u^g/^C7nfE?.훉gǕ[й]s>io@zF6 d/ng"']$?q]=j%!T?/K_|)?okf<'GnŸ7ùqJ*biaC}'YKXrL;zO8!!JO@0uP/8e+â[Эc+|mT'?j n6dLinj`jk+(x{׹S*4J[jCuIW1@WTZiBXt,bb1ĉ٦Fl.|xx,n:u?k4E[f!,,:<@VO^ػKݲcy0EӦ}ѩӳػ+-6) ^З%f u<ݏV 9⽜[9`+luJ݆lFقiwgM¸z8@%1Zdf状#!67nvYYLtK1ёNcjq1iM湓s[~vQ#1&__q*P("HG{?ȱo0U?nxNd6<"Gw,uzoo+P?ASA7? {7AІ )nay !ez5 g;F8Y>. p1JL|uj#+Fc>4XbnFBܑе$Ll. <1HLJjufdM[&~m5m9P9]%t??;щȸv œW8NM&ű3ʋ#~̝"}14Xk.ifJX#>V,@\lO5[I4 +tI?/ЧЛ}2s1/,*}F橃z+_Ja8x쬬_ _e'R`Omc`nGm`/I^mcT3!KʷKb|l3ퟵ9퟿Hk[}}@WAe_h%1t,G*2*p(c@, cD0QNk@&At).DÐ J5Dp.Y ;б3HHh2Zm":t#Fݸqm EXX44(iN:]4"M ;_ב~w!)휜hr0 Ǣe!ɹ.+kbث"fM j7kgg<;1`D%$@Ӧ];Х}s:~ƩG܂M„Q׿z=!G~ǘa}H<3OS6n?<;օ:D8L;Ps3/byzM}qL7 19 F˞ߟA捠QyT* Ų@L*[>)B.m[>Rm`/I+X_:2)[FGE`~8xw_5?ATu|iGg=G(zSqҳsL{e_E.<>; \Q_MO1 |5D}Ӛ7RqymׯZӦٳ?_`4 9y$08sfSiPrzGqu4N^? :=G8,]:Y֚.]+Ѣ@h1^J480Z=}g@X8p;Y]` Al͚ȸv ;~!`Ao,[pn>lr+rvڍtX N^債?/^ya$s|t%mĔ Cm9NAJ 1~D_y%(a5wKoYʗĩU iz=["gғ+~x))@*G[{oIb͂w.Ry֭ya͂w0b`2eR_@ )'A`U` [;]l@H59_zHXF3pw_r$})[Oޟ~yh3]29-\ygw]A >W9R|#['>r@珟Y%׃ʓgfc){}'l20_sQcAkä꿔.Ry}wZSHq$xnti*?AA*"l6;R䮯sWss1~Ǩa'Hj|<T魻;L&`@/ [OΒ޶T4&\pY3Xn\zL{wSY>u׉Uggc=c~c5pU/>j,Y,x l6Z5osgH7z=\]ZQ~ׯMukRnJlݸ^[~8iGw.ΗztNJeueG˃U_q\"87W%ReG݌z>_])ԫ]Ϗe8@T^6=F$H%flOx?X>`۱s`[G"QIK-r>[Fgm mʭ@TZTrvIMн>35|-[JU:uRhVxx, /ƌ_a^ ~mD䨛_EUupH=/&A&lgBh?NJK`-bziBwt{}뗿qS?OHLjٶկ*;ʦ^zh}Bjo,uXjB^K}-rf 7 *@ݯyW-[ƕ+qJ FfOkسK0&8?<oG۶#˗ADEO?VЄa褄8wOκ5).;v=RO 1RڙvwfjWԪTt~sa9qm kџBg\K?jT$s ,"3@ȹ,(L~~ )@ R3y3C?>GԷQp%F<k7ap&Y+TTNS L,t3vμim7TQ_d?> 8o3XdG+6@TOe"P׿e~RT<򦷃~8Q_w@#ł <C~SӪՓ0qvm;ܧuۡIj`6p~0ƠTѦpԩ!5$N\ 9p0 AxgqGE޽X(.,cǰ/%KD{`> ]X?w.zd )oS0GQ-.i2Ÿp-0ϗ=R[!"!..kq'3'`[c$W>)( {/yٸ>8FLzCy)W͟_F?{rxmY8|Z6i;aZxAm,][wqҿzwKFDxvl`<cR:GC&ȉsXb &[YJd(:I314_P5nܼ5Љ`I'Dĸ}pxk<O{vxz3qMfY)W?oeޥ} PXd@ʆ]ر郎K+U*}B-нKkW^/#m#r9pfkgZWYy<'6Cؖkb0nPP5;"Ԛ3XC+Fs͠{Gn 㚢ptcļu!aM Gf?d52R̵#0d=89out\3PܥE3#wZļw%hq(ՇTRcPRO >ÀWfYzFYꂼF$~&?+9x_Cߺi'E(9ouFm$_%w[0 63Yf0rRKMRFsdd!-qRsԯ [2b%C=Fzeɹ4n._>E-1cDZhb NZCFHH¥K^^Q`0`ԩX7gW(PΘ7e [سt(^x1dx0AS3i6~d@jy<ܱt 0OL3|0A|ӓ;%9$/#;'{u O:D\|jidGP+);f B[})yG E(,2aö`Inر;UE(0nx c>;6#=X--A1'Ƙ[yFa];/E@z51o>yIןaz Z -&ֵJO~~r0o X&tDz;͛>=:`ҍz#q1Z ;oJկhB)wnڵqr_)HP菎z,vJ8Y|OF]7Bu5`@„.]{*'P ~wZ< @` LʋagzЫN(ȨP] Y317G1܍$}ǎ ak˘PzF?Bu-0覷GvyX/cP*1d|џ9+_,[>SwO"<%׿}ߝ$뷟WdCĿ4`[ח_kK/G:HN;+kIFС0|ίq8x{de]c &G, iݻ?CQɓ)c*NZ@ZtYGll}n$kM?|'RS_|i?s:Iy:c7ePO[Ӧ!m0ưa\L3l //rF)܂0ۼCuR;J֟oVʦ_a؀xjPJ,[SY٥5>|2rÒU)Oe$Gl`᝹DD/݀j8.^jA\}/#=Öտ+Srǝ.O#+'1r ox,ol8CȬ[wp85SKQE)[Ѿuc#}r/Nيl{+>)o~xO|\|1͢d }Wۇu$4[?aXm9?L,k./3!E緣`b3^s}-8!lUmIfi@qHLӛ!h.Kp.J;Y >RX Y2Ƀ,5‘mXi\(sIo"G˱Μ_yՇ <(vWAY?1*eZ}i&hV~r!oz;ZSnO7z8iN ~Z=z:b/wKs]>˗ ;<<yy7~`?k4Ŵ 0:uwA>ٟ%uMJ«WtʒsTGwQժ!'=]s>LsE+6QUu0>x^-Dk Ӄ8`ź>xOlL2tbedT'S?KgBp@|޴&xs2GHdf'S OcP߮8?j$ƣdK7b3:1Z#}r%cJ#7o;}WᅥKկ` _ L 0#Yፐ0ldh U+GINTlo9hz섰3y8/zz_V`Cx[Q-k3ZBx?Wd`M mZ#I""$ ^W\z9M*cn$A꾌;'е.>jWBuE9|üor}á0іȗYOD~E 6i\oUhǼ;zXjF@fߚdC~"#kI0 ز]zhbCc̘t$:^:o4Cٜ.yC[MP(TX]`Zd^x:u.rR?gg#:1׮Q#Gb;/Ebi\g2R*a|c`6[fހO#!.7ne|\=u@7Q`U\L8̏ W;?%7ZgB^~amz+_Ja8x,/܂M„Q*Am|NS}Q\l J{gFC|\4;˫yzt&Th<7q۾8&jbK?(0fX_FkgFÑ:i%xJP2yρ#c̰DLM~wWr,m>Q7-=@?牍/AuQ!)1]oPP=0q'#ύHϡf%f!/sNh@Nsȟ_= PD]G$w]wjρ)4W`Fb:쏺Afg04)3 D; }zNYz\++~}4 /e%wLɨ%{}YOZ5zZೊ:J6$¶\O`>GcнY_9;|q3!'w{EO6][=OMWoȝ8D}+uϓI/e?ۥy%Z4Z))`4byy8@ <fr7$xHN :L&=ΜT^x7qn:ӧ׻-Ǐ/CNϡ}8KN4^r-[Btt-0& ??/ǟ]` Al͚ȸv ;~!`Ao,[pn>l[q`xr_ Ϗ/kqrZ0ٹXvwn"6bʄ4fOya(<>)=Kzgڸʮr/o-ހ<;tGVv];6u,cp3=k~s?[F>88EXC܈&? _ Ɍ?WOIٰGŜ7_Bc}-c#KWn`/ ?5ퟔJ'Uv~9"L5WC6k`rl3rv^e_;-Zf|_Pߧ.!;ܯE`l_%_*{v/}{IΑK5s~;/琇(#C%ۉK/Wr"+weoTQV1(U91Jo[>9כ$w@C&'PGsyx?)'þkf:-V{=D$qo>mo{#9uq zwwp(tuKq87L N͏}Ec. Oϯ5]kJ]c w8^zޱNH=ۇ8lS|x>Η|`Lt}m22cN9<_}v'cIco|os8kl\yc G<}ϋiOBۛJ'WE[Wv `U`P˚6뱑j9re@ '@G#rFk/U/{19p#w_Nd_JW2y(?r?_o17gv7D~uL=^n /w*3|_|} Фg^.oLj/?gkr;:ZRϻ{Zz! >Cf^r 0|`OZr[T֎uG* }X [Ƃ— e6y_r3)O]@כ>T.#Fnrf+Uft: LSLn!sq?! hڎ]VWށʿ+xBTb6*O`뻹M,o(ŋ_  %mIJO{G^x4ӻeݔ?A{a t WG}y1E=GUn?A{qo/[?+J\   BAAAAmAAAmAAAAAA&)[GV}T?߶h,DOb%AAADEme/DD`w 4!C^8}zY   iǏÉ"AA"3&Խ B65 i`1Qbj&`JQ(XpS"M$~pcSoʾV `HLuRGҐ(XqWC|-@?Bq5Unr}'P:7lns2m_  -*?UsA$<)`ؑa gaQt= x\mc6MiN~6؟`VY1ClFD,Nmu"$o8JUjڛP0vn𶀧%chgdt),|ԙ (h# /']:AV6+ࢼ;j7YJ,9v>ݰKFxWZauq233zu\μ!~%> :1!:c`!pvGbB{<{`\Vf(NeS:mAA 5cx7?_gAk~&GUCvi; ?w2Iye:д^+Ň9b6" n76a1H왻K ,.BEmPŽrNXә (h# g.'c]W(TL"`j$v>8(jm8lѶ63g5nCڨP-k,2m%=!BmR #=/n;Lyt+T%   D 1'MvۨC$eZu?۽N*[jjt3&4[J@$aښxt݊*~\PbYc ml*v\ yGj:bc%@^w/eb`v:8V1    *5mjAAAU,h# TZhCf#:CBQ tЦTRFAD%b}F桖Ռ`8`Nt 6  F#hj6 }z .0P3&qmd  %jO Pjemq?mu@gAQqZhXC˄bGx"XSDA֨M #Q%~[vv/H'=cH?\Af͘1grS 'Xk7ϣ>3-g55jxw!0q1A b.8g?/#y][={=xE5 rT+.£Y#:z( P ؚ_W"b`PȘA5< ?L;ݳlQ%%Gelr|FkAD"jF |OCH2`u8Vj/hQ q_F$%BZU#Y pܣj A7hBRG[㡇jpRv<,~I:С108p N"5mZ?ay36Ann!Z<9M+Y%KJ3Fb֭‘͛휀GJht 5j!$$8t.^Ƥ' &j:̺N97f5zNju32CɘAܓlذ;wFttx-//@޽uZm8~qcׯ=vmݻc Mض!2R+b=TkGAAD߾rn0ƜkJJ璒y4iR)){C;K" %С`߱~!cѾ}c\ @Z `"X8WâfAl۶ ͞U))AnnFƍc?hkܸ6V܃"ΝbسW0o6n<7hG~: Kҥ)8ζcpn͝T"%u :mdȑ ر +BNN2)CJ hh $Ao̝;SNE}ѧOolݺ mLЂP1 BDDhGE#33)Hs=[#))!n|"%&*UGbc0ض.\:C *w a4 RO?SN_ÇcGBT ؂Ն!;;ՆC/ŭ[Yn2+؄PMVaJ+}k(j# *U#lֹS' <JeoAxR*zh0DDhгg+\&;v?jUJDl} Q& g=y )Hg˻o K_FA4 "0\vЭ{0=u$.]>y 1 ="4=RߕoINfÒc| E G#HQuՇ 222p5tyڨBeGAȅF OzT*qAlڸ#m6]ll:wzmׯ#A=F\'i(DX<8 %6Ebc  w-իWu֕qlPkU߂眮Uߪoa͂f^Eҥ*UMZ5 N,p|ƋuUϮ%u^իrỵ~ea(Y7E- (6oX8BB1#6j;m,ҕJ=??s l{OxlXy7aѐ' p@Y{rykZ#U%z>_]T9RM5u+_}vZ:yI_|)'_3M?9w[v'x>? vPSIDATԁ[ܻ}ߛ%~JW.嵟!/007w2c>J,UyG& 0o X&OtÊuRퟔ۾wGcS1砵zj8\R02Ga4FQu/\3Q/ƺQNttl8p-d sYԛw7Ch`=p2C+)S!+'Y9Xէ}k( |'Sԥ}31u8uyT ^MܼB } '3;3?Z¢-O[ǟpP*xtn Gcgaѩ~~-H!}]'z;SE.]+o(g?ks(_?@.2ML.ic {AfҾ9?ԣ AnA &FGa¨Lz=!G~ǘa}H<3OS6n?<;օ:D8L;Ps3/byzM}qL7 19 F˞ߟA捠QyT* Ų;/T|R!\6:]>ڶ|Х~۾_rߓwSW,=`S򍎊pbo/RoiDB֪vAwn*`vArZ0ٹXvwn6bʄ4f8e/ens| crSٲo 0aTԬ^ EbڰKv`߷^'~wx]$}6n?൩cX^}wǻaˣa2Ǖ4| q)B`RIr?,Nن N+ v)Lo ?UwARퟔ۾!j zC6 [h9}q]oT<ҹqwdC}6Zmxsym8l.%`_`{-xH߫Q89qjs}.=wϖ&v d/IߕKHGRV9:ݚߛ}m?O?k!˳n͓k#f?/IO Wp{ē X G\Fڤ~ww r^^^.y77u"YP#'k ~Rx{F*=y/l,e9_vo:xoMfBKQr^07c,hmTE*@Nk )`#oP  8T6AmADSAAiH ( lAQ>pN'   &$bЦP(h#  (`d   *5V3jIENDB`syntastic-3.7.0/autoload/000077500000000000000000000000001260473072400153575ustar00rootroot00000000000000syntastic-3.7.0/autoload/syntastic/000077500000000000000000000000001260473072400174005ustar00rootroot00000000000000syntastic-3.7.0/autoload/syntastic/c.vim000066400000000000000000000302371260473072400203440ustar00rootroot00000000000000if exists('g:loaded_syntastic_c_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_c_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 " convenience function to determine the 'null device' parameter " based on the current operating system function! syntastic#c#NullOutput() abort " {{{2 let known_os = has('unix') || has('mac') || syntastic#util#isRunningWindows() return known_os ? '-o ' . syntastic#util#DevNull() : '' endfunction " }}}2 " read additional compiler flags from the given configuration file " the file format and its parsing mechanism is inspired by clang_complete function! syntastic#c#ReadConfig(file) abort " {{{2 call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: looking for', a:file) " search upwards from the current file's directory let config = syntastic#util#findFileInParent(a:file, expand('%:p:h', 1)) if config ==# '' call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file not found') return '' endif call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: config file:', config) if !filereadable(config) call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: file unreadable') return '' endif " convert filename into absolute path let filepath = fnamemodify(config, ':p:h') " try to read config file try let lines = readfile(config) catch /\m^Vim\%((\a\+)\)\=:E48[45]/ call syntastic#log#debug(g:_SYNTASTIC_DEBUG_CHECKERS, 'ReadConfig: error reading file') return '' endtry " filter out empty lines and comments call filter(lines, 'v:val !~# ''\v^(\s*#|$)''') " remove leading and trailing spaces call map(lines, 'substitute(v:val, ''\m^\s\+'', "", "")') call map(lines, 'substitute(v:val, ''\m\s\+$'', "", "")') let parameters = [] for line in lines let matches = matchstr(line, '\m\C^\s*-I\s*\zs.\+') if matches !=# '' " this one looks like an absolute path if match(matches, '\m^\%(/\|\a:\)') != -1 call add(parameters, '-I' . matches) else call add(parameters, '-I' . filepath . syntastic#util#Slash() . matches) endif else call add(parameters, line) endif endfor return join(map(parameters, 'syntastic#util#shescape(v:val)')) endfunction " }}}2 " GetLocList() for C-like compilers function! syntastic#c#GetLocList(filetype, subchecker, options) abort " {{{2 try let flags = s:_get_cflags(a:filetype, a:subchecker, a:options) catch /\m\C^Syntastic: skip checks$/ return [] endtry let makeprg = syntastic#util#shexpand(g:syntastic_{a:filetype}_compiler) . \ ' ' . flags . ' ' . syntastic#util#shexpand('%') let errorformat = s:_get_checker_var('g', a:filetype, a:subchecker, 'errorformat', a:options['errorformat']) let postprocess = s:_get_checker_var('g', a:filetype, a:subchecker, 'remove_include_errors', 0) ? \ ['filterForeignErrors'] : [] " process makeprg return SyntasticMake({ \ 'makeprg': makeprg, \ 'errorformat': errorformat, \ 'postprocess': postprocess }) endfunction " }}}2 " }}}1 " Private functions {{{1 " initialize c/cpp syntax checker handlers function! s:_init() abort " {{{2 let s:handlers = [] let s:cflags = {} call s:_registerHandler('\m\', 's:_checkPhp', []) call s:_registerHandler('\m\', 's:_checkPython', []) call s:_registerHandler('\m\" echohl ErrorMsg echomsg 'syntastic: error: ' . a:msg echohl None endfunction " }}}2 function! syntastic#log#oneTimeWarn(msg) abort " {{{2 if index(s:one_time_notices_issued, a:msg) >= 0 return endif call add(s:one_time_notices_issued, a:msg) call syntastic#log#warn(a:msg) endfunction " }}}2 " @vimlint(EVL102, 1, l:OLD_VAR) function! syntastic#log#deprecationWarn(old, new, ...) abort " {{{2 if exists('g:syntastic_' . a:old) && !exists('g:syntastic_' . a:new) let msg = 'variable g:syntastic_' . a:old . ' is deprecated, please use ' if a:0 let OLD_VAR = g:syntastic_{a:old} try let NEW_VAR = eval(a:1) let msg .= 'in its stead: let g:syntastic_' . a:new . ' = ' . string(NEW_VAR) let g:syntastic_{a:new} = NEW_VAR catch let msg .= 'g:syntastic_' . a:new . ' instead' endtry else let msg .= 'g:syntastic_' . a:new . ' instead' let g:syntastic_{a:new} = g:syntastic_{a:old} endif call syntastic#log#oneTimeWarn(msg) endif endfunction " }}}2 " @vimlint(EVL102, 0, l:OLD_VAR) function! syntastic#log#debug(level, msg, ...) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif let leader = s:_log_timestamp() call s:_logRedirect(1) if a:0 > 0 " filter out dictionary functions echomsg leader . a:msg . ' ' . \ strtrans(string(type(a:1) == type({}) || type(a:1) == type([]) ? \ filter(copy(a:1), 'type(v:val) != type(function("tr"))') : a:1)) else echomsg leader . a:msg endif call s:_logRedirect(0) endfunction " }}}2 function! syntastic#log#debugShowOptions(level, names) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif let leader = s:_log_timestamp() call s:_logRedirect(1) let vlist = copy(type(a:names) == type('') ? [a:names] : a:names) if !empty(vlist) call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val))) . (s:_is_modified(v:val) ? ' (!)' : '')") echomsg leader . join(vlist, ', ') endif call s:_logRedirect(0) endfunction " }}}2 function! syntastic#log#debugShowVariables(level, names) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif let leader = s:_log_timestamp() call s:_logRedirect(1) let vlist = type(a:names) == type('') ? [a:names] : a:names for name in vlist let msg = s:_format_variable(name) if msg !=# '' echomsg leader . msg endif endfor call s:_logRedirect(0) endfunction " }}}2 function! syntastic#log#debugDump(level) abort " {{{2 if !s:_isDebugEnabled(a:level) return endif call syntastic#log#debugShowVariables( a:level, sort(keys(g:_SYNTASTIC_DEFAULTS)) ) endfunction " }}}2 function! syntastic#log#ndebug(level, title, messages) abort " {{{2 if s:_isDebugEnabled(a:level) return endif call syntastic#log#error(a:title) if type(a:messages) == type([]) for msg in a:messages echomsg msg endfor else echomsg a:messages endif endfunction " }}}2 " }}}1 " Private functions {{{1 function! s:_isDebugEnabled_smart(level) abort " {{{2 return and(g:syntastic_debug, a:level) endfunction " }}}2 function! s:_isDebugEnabled_dumb(level) abort " {{{2 " poor man's bit test for bit N, assuming a:level == 2**N return (g:syntastic_debug / a:level) % 2 endfunction " }}}2 let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb') lockvar s:_isDebugEnabled function! s:_logRedirect(on) abort " {{{2 if exists('g:syntastic_debug_file') if a:on try execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1)) catch /\m^Vim\%((\a\+)\)\=:/ silent! redir END unlet g:syntastic_debug_file endtry else silent! redir END endif endif endfunction " }}}2 " }}}1 " Utilities {{{1 function! s:_log_timestamp() abort " {{{2 return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': ' endfunction " }}}2 function! s:_format_variable(name) abort " {{{2 let vals = [] if exists('g:syntastic_' . a:name) call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name}))) endif if exists('b:syntastic_' . a:name) call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name}))) endif return join(vals, ', ') endfunction " }}}2 function! s:_is_modified(name) abort " {{{2 if !exists('s:option_defaults') let s:option_defaults = {} endif if !has_key(s:option_defaults, a:name) let opt_save = eval('&' . a:name) execute 'set ' . a:name . '&' let s:option_defaults[a:name] = eval('&' . a:name) execute 'let &' . a:name . ' = ' . string(opt_save) endif return s:option_defaults[a:name] !=# eval('&' . a:name) endfunction " }}}2 " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.7.0/autoload/syntastic/postprocess.vim000066400000000000000000000040661260473072400225070ustar00rootroot00000000000000if exists('g:loaded_syntastic_postprocess_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_postprocess_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 " merge consecutive blanks function! syntastic#postprocess#compressWhitespace(errors) abort " {{{2 for e in a:errors let e['text'] = substitute(e['text'], "\001", '', 'g') let e['text'] = substitute(e['text'], '\n', ' ', 'g') let e['text'] = substitute(e['text'], '\m\s\{2,}', ' ', 'g') let e['text'] = substitute(e['text'], '\m^\s\+', '', '') let e['text'] = substitute(e['text'], '\m\s\+$', '', '') endfor return a:errors endfunction " }}}2 " remove spurious CR under Cygwin function! syntastic#postprocess#cygwinRemoveCR(errors) abort " {{{2 if has('win32unix') for e in a:errors let e['text'] = substitute(e['text'], '\r', '', 'g') endfor endif return a:errors endfunction " }}}2 " decode XML entities function! syntastic#postprocess#decodeXMLEntities(errors) abort " {{{2 for e in a:errors let e['text'] = syntastic#util#decodeXMLEntities(e['text']) endfor return a:errors endfunction " }}}2 " filter out errors referencing other files function! syntastic#postprocess#filterForeignErrors(errors) abort " {{{2 return filter(copy(a:errors), 'get(v:val, "bufnr") == ' . bufnr('')) endfunction " }}}2 " make sure line numbers are not past end of buffers " XXX: this loads all referenced buffers in memory function! syntastic#postprocess#guards(errors) abort " {{{2 let buffers = syntastic#util#unique(map(filter(copy(a:errors), 'v:val["valid"]'), 'str2nr(v:val["bufnr"])')) let guards = {} for b in buffers let guards[b] = len(getbufline(b, 1, '$')) endfor for e in a:errors if e['valid'] && e['lnum'] > guards[e['bufnr']] let e['lnum'] = guards[e['bufnr']] endif endfor return a:errors endfunction " }}}2 " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.7.0/autoload/syntastic/preprocess.vim000066400000000000000000000243741260473072400223140ustar00rootroot00000000000000if exists('g:loaded_syntastic_preprocess_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_preprocess_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 function! syntastic#preprocess#cabal(errors) abort " {{{2 let out = [] let star = 0 for err in a:errors if star if err ==# '' let star = 0 else let out[-1] .= ' ' . err endif else call add(out, err) if err =~# '\m^*\s' let star = 1 endif endif endfor return out endfunction " }}}2 function! syntastic#preprocess#checkstyle(errors) abort " {{{2 let out = [] let fname = expand('%', 1) for err in a:errors if match(err, '\m') > -1 let line = str2nr(matchstr(err, '\m\ \[[^]]+\])+\ze:'', "", "")') endfunction " }}}2 function! syntastic#preprocess#flow(errors) abort " {{{2 let idx = 0 while idx < len(a:errors) && a:errors[idx][0] !=# '{' let idx += 1 endwhile let errs = s:_decode_JSON(join(a:errors[idx :], '')) let out = [] if type(errs) == type({}) && has_key(errs, 'errors') && type(errs['errors']) == type([]) for e in errs['errors'] if type(e) == type({}) && has_key(e, 'message') && type(e['message']) == type([]) && len(e['message']) let m = e['message'][0] let t = e['message'][1:] try let msg = \ m['path'] . ':' . \ m['line'] . ':' . \ m['start'] . ':' . \ (m['line'] ==# m['endline'] && str2nr(m['end']) > 0 ? m['end'] . ':' : '') . \ ' ' . m['descr'] if len(t) let msg .= ' ' . join(map(t, \ 'v:val["descr"] . " (" . v:val["path"] . ":" . v:val["line"] . ":" . v:val["start"] . ' . \ '"," . (v:val["line"] !=# v:val["endline"] ? v:val["endline"] . ":" : "") . ' . \ 'v:val["end"] . ")"')) endif let msg = substitute(msg, '\r', '', 'g') let msg = substitute(msg, '\n', ' ', 'g') call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker javascript/flow: unrecognized error format') let out = [] break endtry else call syntastic#log#warn('checker javascript/flow: unrecognized error format') let out = [] break endif endfor else call syntastic#log#warn('checker javascript/flow: unrecognized error format') endif return out endfunction " }}}2 function! syntastic#preprocess#iconv(errors) abort " {{{2 return \ has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' ? \ map(a:errors, 'iconv(v:val, "utf-8", &encoding)') : \ a:errors endfunction " }}}2 function! syntastic#preprocess#killEmpty(errors) abort " {{{2 return filter(copy(a:errors), 'v:val !=# ""') endfunction " }}}2 function! syntastic#preprocess#perl(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^(.*)\sat\s(.{-})\sline\s(\d+)(.*)$') if !empty(parts) call add(out, parts[2] . ':' . parts[3] . ':' . parts[1] . parts[4]) endif endfor return syntastic#util#unique(out) endfunction " }}}2 function! syntastic#preprocess#prospector(errors) abort " {{{2 let errs = s:_decode_JSON(join(a:errors, '')) let out = [] if type(errs) == type({}) && has_key(errs, 'messages') if type(errs['messages']) == type([]) for e in errs['messages'] if type(e) == type({}) try if e['source'] ==# 'pylint' let e['location']['character'] += 1 endif let msg = \ e['location']['path'] . ':' . \ e['location']['line'] . ':' . \ e['location']['character'] . ': ' . \ e['code'] . ' ' . \ e['message'] . ' ' . \ '[' . e['source'] . ']' call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker python/prospector: unrecognized error format') let out = [] break endtry else call syntastic#log#warn('checker python/prospector: unrecognized error format') let out = [] break endif endfor else call syntastic#log#warn('checker python/prospector: unrecognized error format') endif endif return out endfunction " }}}2 function! syntastic#preprocess#rparse(errors) abort " {{{2 let errlist = copy(a:errors) " remove uninteresting lines and handle continuations let i = 0 while i < len(errlist) if i > 0 && errlist[i][:1] ==# ' ' && errlist[i] !~# '\m\s\+\^$' let errlist[i-1] .= errlist[i][1:] call remove(errlist, i) elseif errlist[i] !~# '\m^\(Lint:\|Lint checking:\|Error in\) ' call remove(errlist, i) else let i += 1 endif endwhile let out = [] let fname = '' for e in errlist if match(e, '\m^Lint: ') == 0 let parts = matchlist(e, '\m^Lint: \(.*\): found on lines \([0-9, ]\+\)\(+\(\d\+\) more\)\=') if len(parts) >= 3 for line in split(parts[2], '\m,\s*') call add(out, 'E:' . fname . ':' . line . ': ' . parts[1]) endfor endif if len(parts) >= 5 && parts[4] !=# '' call add(out, 'E:' . fname . ':0: ' . parts[1] . ' - ' . parts[4] . ' messages not shown') endif elseif match(e, '\m^Lint checking: ') == 0 let fname = matchstr(e, '\m^Lint checking: \zs.*') elseif match(e, '\m^Error in ') == 0 call add(out, substitute(e, '\m^Error in .\+ : .\+\ze:\d\+:\d\+: ', 'E:' . fname, '')) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#tslint(errors) abort " {{{2 return map(copy(a:errors), 'substitute(v:val, ''\m^\(([^)]\+)\)\s\(.\+\)$'', ''\2 \1'', "")') endfunction " }}}2 function! syntastic#preprocess#validator(errors) abort " {{{2 let out = [] for e in a:errors let parts = matchlist(e, '\v^"([^"]+)"(.+)') if len(parts) >= 3 " URL decode, except leave alone any "+" let parts[1] = substitute(parts[1], '\m%\(\x\x\)', '\=nr2char("0x".submatch(1))', 'g') let parts[1] = substitute(parts[1], '\m\\"', '"', 'g') let parts[1] = substitute(parts[1], '\m\\\\', '\\', 'g') call add(out, '"' . parts[1] . '"' . parts[2]) endif endfor return out endfunction " }}}2 function! syntastic#preprocess#vint(errors) abort " {{{2 let errs = s:_decode_JSON(join(a:errors, '')) let out = [] if type(errs) == type([]) for e in errs if type(e) == type({}) try let msg = \ e['file_path'] . ':' . \ e['line_number'] . ':' . \ e['column_number'] . ':' . \ e['severity'][0] . ': ' . \ e['description'] . ' (' . \ e['policy_name'] . ')' call add(out, msg) catch /\m^Vim\%((\a\+)\)\=:E716/ call syntastic#log#warn('checker vim/vint: unrecognized error format') let out = [] break endtry else call syntastic#log#warn('checker vim/vint: unrecognized error format') let out = [] break endif endfor else call syntastic#log#warn('checker vim/vint: unrecognized error format') endif return out endfunction " }}}2 " }}}1 " Private functions {{{1 " @vimlint(EVL102, 1, l:true) " @vimlint(EVL102, 1, l:false) " @vimlint(EVL102, 1, l:null) function! s:_decode_JSON(json) abort " {{{2 if a:json ==# '' return [] endif " The following is inspired by https://github.com/MarcWeber/vim-addon-manager and " http://stackoverflow.com/questions/17751186/iterating-over-a-string-in-vimscript-or-parse-a-json-file/19105763#19105763 " A hat tip to Marc Weber for this trick if substitute(a:json, '\v\"%(\\.|[^"\\])*\"|true|false|null|[+-]?\d+%(\.\d+%([Ee][+-]?\d+)?)?', '', 'g') !~# "[^,:{}[\\] \t]" " JSON artifacts let true = 1 let false = 0 let null = '' try let object = eval(a:json) catch " malformed JSON let object = '' endtry else let object = '' endif return object endfunction " }}}2 " @vimlint(EVL102, 0, l:true) " @vimlint(EVL102, 0, l:false) " @vimlint(EVL102, 0, l:null) " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.7.0/autoload/syntastic/util.vim000066400000000000000000000362721260473072400211040ustar00rootroot00000000000000if exists('g:loaded_syntastic_util_autoload') || !exists('g:loaded_syntastic_plugin') finish endif let g:loaded_syntastic_util_autoload = 1 let s:save_cpo = &cpo set cpo&vim " Public functions {{{1 function! syntastic#util#isRunningWindows() abort " {{{2 return has('win16') || has('win32') || has('win64') endfunction " }}}2 function! syntastic#util#DevNull() abort " {{{2 if syntastic#util#isRunningWindows() return 'NUL' endif return '/dev/null' endfunction " }}}2 " Get directory separator function! syntastic#util#Slash() abort " {{{2 return (!exists('+shellslash') || &shellslash) ? '/' : '\' endfunction " }}}2 function! syntastic#util#CygwinPath(path) abort " {{{2 return substitute(syntastic#util#system('cygpath -m ' . syntastic#util#shescape(a:path)), "\n", '', 'g') endfunction " }}}2 function! syntastic#util#system(command) abort " {{{2 let old_shell = &shell let old_lc_messages = $LC_MESSAGES let old_lc_all = $LC_ALL let &shell = syntastic#util#var('shell') let $LC_MESSAGES = 'C' let $LC_ALL = '' let out = system(a:command) let $LC_ALL = old_lc_all let $LC_MESSAGES = old_lc_messages let &shell = old_shell return out endfunction " }}}2 " Create a temporary directory function! syntastic#util#tmpdir() abort " {{{2 let tempdir = '' if (has('unix') || has('mac')) && executable('mktemp') " TODO: option "-t" to mktemp(1) is not portable let tmp = $TMPDIR !=# '' ? $TMPDIR : $TMP !=# '' ? $TMP : '/tmp' let out = split(syntastic#util#system('mktemp -q -d ' . tmp . '/vim-syntastic-' . getpid() . '-XXXXXXXX'), "\n") if v:shell_error == 0 && len(out) == 1 let tempdir = out[0] endif endif if tempdir ==# '' if has('win32') || has('win64') let tempdir = $TEMP . syntastic#util#Slash() . 'vim-syntastic-' . getpid() elseif has('win32unix') let tempdir = syntastic#util#CygwinPath('/tmp/vim-syntastic-' . getpid()) elseif $TMPDIR !=# '' let tempdir = $TMPDIR . '/vim-syntastic-' . getpid() else let tempdir = '/tmp/vim-syntastic-' . getpid() endif try call mkdir(tempdir, 'p', 0700) catch /\m^Vim\%((\a\+)\)\=:E739/ call syntastic#log#error(v:exception) let tempdir = '.' endtry endif return tempdir endfunction " }}}2 " Recursively remove a directory function! syntastic#util#rmrf(what) abort " {{{2 " try to make sure we don't delete directories we didn't create if a:what !~? 'vim-syntastic-' return endif if getftype(a:what) ==# 'dir' if !exists('s:rmrf') let s:rmrf = \ has('unix') || has('mac') ? 'rm -rf' : \ has('win32') || has('win64') ? 'rmdir /S /Q' : \ has('win16') || has('win95') || has('dos16') || has('dos32') ? 'deltree /Y' : '' endif if s:rmrf !=# '' silent! call syntastic#util#system(s:rmrf . ' ' . syntastic#util#shescape(a:what)) else call s:_rmrf(a:what) endif else silent! call delete(a:what) endif endfunction " }}}2 " Search the first 5 lines of the file for a magic number and return a map " containing the args and the executable " " e.g. " " #!/usr/bin/perl -f -bar " " returns " " {'exe': '/usr/bin/perl', 'args': ['-f', '-bar']} function! syntastic#util#parseShebang() abort " {{{2 for lnum in range(1, 5) let line = getline(lnum) if line =~# '^#!' let line = substitute(line, '\v^#!\s*(\S+/env(\s+-\S+)*\s+)?', '', '') let exe = matchstr(line, '\m^\S*\ze') let args = split(matchstr(line, '\m^\S*\zs.*')) return { 'exe': exe, 'args': args } endif endfor return { 'exe': '', 'args': [] } endfunction " }}}2 " Get the value of a variable. Allow local variables to override global ones. function! syntastic#util#var(name, ...) abort " {{{2 return \ exists('b:syntastic_' . a:name) ? b:syntastic_{a:name} : \ exists('g:syntastic_' . a:name) ? g:syntastic_{a:name} : \ a:0 > 0 ? a:1 : '' endfunction " }}}2 " Parse a version string. Return an array of version components. function! syntastic#util#parseVersion(version, ...) abort " {{{2 return map(split(matchstr( a:version, a:0 ? a:1 : '\v^\D*\zs\d+(\.\d+)+\ze' ), '\m\.'), 'str2nr(v:val)') endfunction " }}}2 " Verify that the 'installed' version is at least the 'required' version. " " 'installed' and 'required' must be arrays. If they have different lengths, " the "missing" elements will be assumed to be 0 for the purposes of checking. " " See http://semver.org for info about version numbers. function! syntastic#util#versionIsAtLeast(installed, required) abort " {{{2 return syntastic#util#compareLexi(a:installed, a:required) >= 0 endfunction " }}}2 " Almost lexicographic comparison of two lists of integers. :) If lists " have different lengths, the "missing" elements are assumed to be 0. function! syntastic#util#compareLexi(a, b) abort " {{{2 for idx in range(max([len(a:a), len(a:b)])) let a_element = str2nr(get(a:a, idx, 0)) let b_element = str2nr(get(a:b, idx, 0)) if a_element != b_element return a_element > b_element ? 1 : -1 endif endfor " still here, thus everything matched return 0 endfunction " }}}2 " strwidth() was added in Vim 7.3; if it doesn't exist, we use strlen() " and hope for the best :) let s:_width = function(exists('*strwidth') ? 'strwidth' : 'strlen') lockvar s:_width function! syntastic#util#screenWidth(str, tabstop) abort " {{{2 let chunks = split(a:str, "\t", 1) let width = s:_width(chunks[-1]) for c in chunks[:-2] let cwidth = s:_width(c) let width += cwidth + a:tabstop - cwidth % a:tabstop endfor return width endfunction " }}}2 " Print as much of a:msg as possible without "Press Enter" prompt appearing function! syntastic#util#wideMsg(msg) abort " {{{2 let old_ruler = &ruler let old_showcmd = &showcmd "This is here because it is possible for some error messages to "begin with \n which will cause a "press enter" prompt. let msg = substitute(a:msg, "\n", '', 'g') "convert tabs to spaces so that the tabs count towards the window "width as the proper amount of characters let chunks = split(msg, "\t", 1) let msg = join(map(chunks[:-2], 'v:val . repeat(" ", &tabstop - s:_width(v:val) % &tabstop)'), '') . chunks[-1] let msg = strpart(msg, 0, &columns - 1) set noruler noshowcmd call syntastic#util#redraw(0) echo msg let &ruler = old_ruler let &showcmd = old_showcmd endfunction " }}}2 " Check whether a buffer is loaded, listed, and not hidden function! syntastic#util#bufIsActive(buffer) abort " {{{2 " convert to number, or hell breaks loose let buf = str2nr(a:buffer) if !bufloaded(buf) || !buflisted(buf) return 0 endif " get rid of hidden buffers for tab in range(1, tabpagenr('$')) if index(tabpagebuflist(tab), buf) >= 0 return 1 endif endfor return 0 endfunction " }}}2 " Start in directory a:where and walk up the parent folders until it finds a " file named a:what; return path to that file function! syntastic#util#findFileInParent(what, where) abort " {{{2 let old_suffixesadd = &suffixesadd let &suffixesadd = '' let file = findfile(a:what, escape(a:where, ' ') . ';') let &suffixesadd = old_suffixesadd return file endfunction " }}}2 " Start in directory a:where and walk up the parent folders until it finds a " file matching a:what; return path to that file function! syntastic#util#findGlobInParent(what, where) abort " {{{2 let here = fnamemodify(a:where, ':p') let root = syntastic#util#Slash() if syntastic#util#isRunningWindows() && here[1] ==# ':' " The drive letter is an ever-green source of fun. That's because " we don't care about running syntastic on Amiga these days. ;) let root = fnamemodify(root, ':p') let root = here[0] . root[1:] endif let old = '' while here !=# '' let p = split(globpath(here, a:what, 1), '\n') if !empty(p) return fnamemodify(p[0], ':p') elseif here ==? root || here ==? old break endif let old = here " we use ':h:h' rather than ':h' since ':p' adds a trailing '/' " if 'here' is a directory let here = fnamemodify(here, ':p:h:h') endwhile return '' endfunction " }}}2 " Returns unique elements in a list function! syntastic#util#unique(list) abort " {{{2 let seen = {} let uniques = [] for e in a:list if !has_key(seen, e) let seen[e] = 1 call add(uniques, e) endif endfor return uniques endfunction " }}}2 " A less noisy shellescape() function! syntastic#util#shescape(string) abort " {{{2 return a:string =~# '\m^[A-Za-z0-9_/.-]\+$' ? a:string : shellescape(a:string) endfunction " }}}2 " A less noisy shellescape(expand()) function! syntastic#util#shexpand(string, ...) abort " {{{2 return syntastic#util#shescape(a:0 ? expand(a:string, a:1) : expand(a:string, 1)) endfunction " }}}2 " Escape arguments function! syntastic#util#argsescape(opt) abort " {{{2 if type(a:opt) == type('') && a:opt !=# '' return [a:opt] elseif type(a:opt) == type([]) return map(copy(a:opt), 'syntastic#util#shescape(v:val)') endif return [] endfunction " }}}2 " Decode XML entities function! syntastic#util#decodeXMLEntities(string) abort " {{{2 let str = a:string let str = substitute(str, '\m<', '<', 'g') let str = substitute(str, '\m>', '>', 'g') let str = substitute(str, '\m"', '"', 'g') let str = substitute(str, '\m'', "'", 'g') let str = substitute(str, '\m&', '\&', 'g') return str endfunction " }}}2 function! syntastic#util#redraw(full) abort " {{{2 if a:full redraw! else redraw endif endfunction " }}}2 function! syntastic#util#dictFilter(errors, filter) abort " {{{2 let rules = s:_translateFilter(a:filter) " call syntastic#log#debug(g:_SYNTASTIC_DEBUG_TRACE, "applying filter:", rules) try call filter(a:errors, rules) catch /\m^Vim\%((\a\+)\)\=:E/ let msg = matchstr(v:exception, '\m^Vim\%((\a\+)\)\=:\zs.*') call syntastic#log#error('quiet_messages: ' . msg) endtry endfunction " }}}2 " Return a [seconds, fractions] list of strings, representing the " (hopefully high resolution) time since program start function! syntastic#util#stamp() abort " {{{2 return split( split(reltimestr(reltime(g:_SYNTASTIC_START)))[0], '\.' ) endfunction " }}}2 let s:_str2float = function(exists('*str2float') ? 'str2float' : 'str2nr') lockvar s:_str2float function! syntastic#util#str2float(val) abort " {{{2 return s:_str2float(a:val) endfunction " }}}2 function! syntastic#util#float2str(val) abort " {{{2 return s:_float2str(a:val) endfunction " }}}2 " Crude printf()-like width formatter. Handles wide characters. function! syntastic#util#wformat(format, str) abort " {{{2 if a:format ==# '' return a:str endif echomsg string(a:format) . ', ' . string(a:str) let specs = matchlist(a:format, '\v^(-?)(0?)(%([1-9]\d*))?%(\.(\d+))?$') if len(specs) < 5 return a:str endif let flushleft = specs[1] ==# '-' let lpad = specs[2] ==# '0' ? '0' : ' ' let minlen = str2nr(specs[3]) let maxlen = str2nr(specs[4]) let out = substitute(a:str, "\t", ' ', 'g') if maxlen && s:_width(out) > maxlen let chars = filter(split(out, '\zs\ze', 1), 'v:val !=# ""') let out = '' if flushleft for c in chars if s:_width(out . c) < maxlen let out .= c else let out .= &encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '>' break endif endfor else call reverse(chars) for c in chars if s:_width(c . out) < maxlen let out = c . out else let out = (&encoding ==# 'utf-8' && &termencoding ==# 'utf-8' ? "\u2026" : '<') . out break endif endfor endif endif if minlen && s:_width(out) < minlen if flushleft let out .= repeat(' ', minlen - s:_width(out)) else let out = repeat(lpad, minlen - s:_width(out)) . out endif endif return out endfunction " }}}2 " }}}1 " Private functions {{{1 function! s:_translateFilter(filters) abort " {{{2 let conditions = [] for k in keys(a:filters) if type(a:filters[k]) == type([]) call extend(conditions, map(copy(a:filters[k]), 's:_translateElement(k, v:val)')) else call add(conditions, s:_translateElement(k, a:filters[k])) endif endfor if conditions == [] let conditions = ['1'] endif return len(conditions) == 1 ? conditions[0] : join(map(conditions, '"(" . v:val . ")"'), ' && ') endfunction " }}}2 function! s:_translateElement(key, term) abort " {{{2 let fkey = a:key if fkey[0] ==# '!' let fkey = fkey[1:] let not = 1 else let not = 0 endif if fkey ==? 'level' let op = not ? ' ==? ' : ' !=? ' let ret = 'v:val["type"]' . op . string(a:term[0]) elseif fkey ==? 'type' if a:term ==? 'style' let op = not ? ' ==? ' : ' !=? ' let ret = 'get(v:val, "subtype", "")' . op . '"style"' else let op = not ? '!' : '' let ret = op . 'has_key(v:val, "subtype")' endif elseif fkey ==? 'regex' let op = not ? ' =~? ' : ' !~? ' let ret = 'v:val["text"]' . op . string(a:term) elseif fkey ==? 'file' || fkey[:4] ==? 'file:' let op = not ? ' =~# ' : ' !~# ' let ret = 'bufname(str2nr(v:val["bufnr"]))' let mod = fkey[4:] if mod !=# '' let ret = 'fnamemodify(' . ret . ', ' . string(mod) . ')' endif let ret .= op . string(a:term) else call syntastic#log#warn('quiet_messages: ignoring invalid key ' . strtrans(string(fkey))) let ret = '1' endif return ret endfunction " }}}2 function! s:_rmrf(what) abort " {{{2 if !exists('s:rmdir') let s:rmdir = syntastic#util#shescape(get(g:, 'netrw_localrmdir', 'rmdir')) endif if getftype(a:what) ==# 'dir' if filewritable(a:what) != 2 return endif for f in split(globpath(a:what, '*', 1), "\n") call s:_rmrf(f) endfor silent! call syntastic#util#system(s:rmdir . ' ' . syntastic#util#shescape(a:what)) else silent! call delete(a:what) endif endfunction " }}}2 function! s:_float2str_smart(val) abort " {{{2 return printf('%.1f', a:val) endfunction " }}}2 function! s:_float2str_dumb(val) abort " {{{2 return a:val endfunction " }}}2 let s:_float2str = function(has('float') ? 's:_float2str_smart' : 's:_float2str_dumb') lockvar s:_float2str " }}}1 let &cpo = s:save_cpo unlet s:save_cpo " vim: set sw=4 sts=4 et fdm=marker: syntastic-3.7.0/doc/000077500000000000000000000000001260473072400143145ustar00rootroot00000000000000syntastic-3.7.0/doc/syntastic.txt000066400000000000000000001406111260473072400171010ustar00rootroot00000000000000*syntastic.txt* Syntax checking on the fly has never been so pimp. *syntastic* It's a bird! It's a plane! ZOMG It's ... ~ _____ __ __ _ ~ / ___/__ ______ / /_____ ______/ /_(_)____ ~ \__ \/ / / / __ \/ __/ __ `/ ___/ __/ / ___/ ~ ___/ / /_/ / / / / /_/ /_/ (__ ) /_/ / /__ ~ /____/\__, /_/ /_/\__/\__,_/____/\__/_/\___/ ~ /____/ ~ Reference Manual~ ============================================================================== CONTENTS *syntastic-contents* 1.Intro........................................|syntastic-intro| 1.1.Quick start............................|syntastic-quickstart| 1.2.Recommended settings...................|syntastic-recommended| 2.Functionality provided.......................|syntastic-functionality| 2.1.The statusline flag....................|syntastic-statusline-flag| 2.2.Error signs............................|syntastic-error-signs| 2.3.Error window...........................|syntastic-error-window| 2.4.Error highlighting.....................|syntastic-highlighting| 2.5.Aggregating errors.....................|syntastic-aggregating-errors| 2.6.Filtering errors.......................|syntastic-filtering-errors| 3.Commands.....................................|syntastic-commands| 4.Global Options...............................|syntastic-global-options| 5.Checker Options..............................|syntastic-checker-options| 5.1.Choosing which checkers to use.........|syntastic-filetype-checkers| 5.2.Choosing the executable................|syntastic-config-exec| 5.3.Configuring specific checkers..........|syntastic-config-makeprg| 5.4.Sorting errors.........................|syntastic-config-sort| 6.Notes........................................|syntastic-notes| 6.1.Handling of composite filetypes........|syntastic-composite| 6.2.Editing files over network.............|syntastic-netrw| 6.3.The 'shellslash' option................|syntastic-shellslash| 6.4.Saving Vim sessions....................|syntastic-sessions| 7.Compatibility with other software............|syntastic-compatibility| 7.1.The csh and tcsh shells................|syntastic-csh| 7.2.Eclim..................................|syntastic-eclim| 7.3.The fish shell.........................|syntastic-fish| 7.4.The fizsh shell........................|syntastic-fizsh| 7.5.flagship...............................|syntastic-flagship| 7.6.powerline..............................|syntastic-powerline| 7.7.The PowerShell shell...................|syntastic-powershell| 7.8.python-mode............................|syntastic-pymode| 7.9.vim-auto-save..........................|syntastic-vim-auto-save| 7.10.vim-go................................|syntastic-vim-go| 7.11.vim-virtualenv........................|syntastic-vim-virtualenv| 7.12.YouCompleteMe.........................|syntastic-ycm| 7.13.The zsh shell and MacVim..............|syntastic-zsh| 8.About........................................|syntastic-about| 9.License......................................|syntastic-license| ============================================================================== 1. Intro *syntastic-intro* Syntastic is a syntax checking plugin that runs files through external syntax checkers. This can be done on demand, or automatically as files are saved and opened. If syntax errors are detected, the user is notified and is happy because they didn't have to compile their code or execute their script to find them. Syntastic comes in two parts: the syntax checker plugins, and the core. The syntax checker plugins are defined on a per-filetype basis where each one wraps up an external syntax checking program. The core script delegates off to these plugins and uses their output to provide the syntastic functionality. Take a look at the wiki for a list of supported filetypes and checkers: https://github.com/scrooloose/syntastic/wiki/Syntax-Checkers Note: This doc only deals with using syntastic. To learn how to write syntax checker integrations, see the guide on the GitHub wiki: https://github.com/scrooloose/syntastic/wiki/Syntax-Checker-Guide ------------------------------------------------------------------------------ 1.1. Quick start *syntastic-quickstart* Syntastic comes preconfigured with a default list of enabled checkers per |filetype|. This list is kept reasonably short to prevent slowing down Vim or trying to use conflicting checkers. You can see the list of checkers available for the current filetype with the |:SyntasticInfo| command. You probably want to override the configured list of checkers for the filetypes you use, and also change the arguments passed to specific checkers to suit your needs. See |syntastic-checker-options| below for details. Use |:SyntasticCheck| to manually check right now. Use |:Errors| to open the |location-list| window, and |:lclose| to close it. You can clear the error list with |:SyntasticReset|, and you can use |:SyntasticToggleMode| to switch between active (checking on writing the buffer) and passive (manual) checking. You don't have to switch focus to the |location-list| window to jump to the different errors. Vim provides several built-in commands for this, for example |:lnext| and |:lprevious|. You may want to add shortcut mappings for these commands, or perhaps install a plugin such as Tim Pope's 'unimpaired' (see https://github.com/tpope/vim-unimpaired) that provides such mappings. ------------------------------------------------------------------------------ 1.2. Recommended settings *syntastic-recommended* Syntastic has numerous options that can be configured, and the defaults are not particularly well suitable for new users. It is recommended that you start by adding the following lines to your vimrc, and return to them later as needed: > set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list = 1 let g:syntastic_auto_loc_list = 1 let g:syntastic_check_on_open = 1 let g:syntastic_check_on_wq = 0 < ============================================================================== 2. Functionality provided *syntastic-functionality* Syntax checking can be done automatically or on demand (see |'syntastic_mode_map'| and |:SyntasticToggleMode| for configuring this). When syntax checking is done, the features below can be used to notify the user of errors. See |syntastic-global-options| for how to configure and activate/deactivate these features. * A statusline flag * Signs beside lines with errors * The |location-list| can be populated with the errors for the associated buffer * Erroneous parts of lines can be highlighted (this functionality is only provided by some syntax checkers) * Balloons (if the |+balloon_eval| feature is compiled in) can be used to display error messages for erroneous lines when hovering the mouse over them * Error messages from multiple checkers can be aggregated in a single list ------------------------------------------------------------------------------ 2.1. The statusline flag *syntastic-statusline-flag* To use the statusline flag, this must appear in your |'statusline'| setting > %{SyntasticStatuslineFlag()} < Something like this could be more useful: > set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* < When syntax errors are detected a flag will be shown. The content of the flag is derived from the |syntastic_stl_format| option. ------------------------------------------------------------------------------ 2.2. Error signs *syntastic-error-signs* Syntastic uses the |:sign| commands (provided that the |+signs| feature is compiled in) to mark lines with errors and warnings in the sign column. To enable this feature, use the |'syntastic_enable_signs'| option. Signs are colored using the Error and Todo syntax highlight groups by default (see |group-name|). If you wish to customize the colors for the signs, you can use the following groups: SyntasticErrorSign - For syntax errors, links to 'error' by default SyntasticWarningSign - For syntax warnings, links to 'todo' by default SyntasticStyleErrorSign - For style errors, links to 'SyntasticErrorSign' by default SyntasticStyleWarningSign - For style warnings, links to 'SyntasticWarningSign' by default Example: > highlight SyntasticErrorSign guifg=white guibg=red < To set up highlighting for the line where a sign resides, you can use the following highlight groups: SyntasticErrorLine SyntasticWarningLine SyntasticStyleErrorLine - Links to 'SyntasticErrorLine' by default SyntasticStyleWarningLine - Links to 'SyntasticWarningLine' by default Example: > highlight SyntasticErrorLine guibg=#2f0000 < ------------------------------------------------------------------------------ 2.3. The error window *syntastic-error-window* You can use the |:Errors| command to display the errors for the current buffer in the |location-list|. By default syntastic doesn't fill the |location-list| with the errors found by the checkers, in order to reduce clashes with other plugins. Consequently, if you run |:lopen| or |:lwindow| rather than |:Errors| to open the error window you wouldn't see syntastic's list of errors. If you insist on using |:lopen| or |:lwindow| you should either run |:SyntasticSetLoclist| after running the checks, or set |syntastic_always_populate_loc_list| which tells syntastic to update the |location-list| automatically. ------------------------------------------------------------------------------ 2.4. Error highlighting *syntastic-highlighting* Some checkers provide enough information for syntastic to be able to highlight errors. By default the SpellBad syntax highlight group is used to color errors, and the SpellCap group is used for warnings. If you wish to customize the colors for highlighting you can use the following groups: SyntasticError - Links to 'SpellBad' by default SyntasticWarning - Links to 'SpellCap' by default SyntasticStyleError - Links to SyntasticError by default SyntasticStyleWarning - Links to SyntasticWarning by default Example: > highlight SyntasticError guibg=#2f0000 < ------------------------------------------------------------------------------ 2.5. Aggregating errors *syntastic-aggregating-errors* By default, namely if |'syntastic_aggregate_errors'| is unset, syntastic runs in turn the checkers corresponding to the filetype of the current file (see |syntastic-filetype-checkers|), and stops as soon as a checker reports any errors. It then notifies you of the errors using the notification mechanisms above. In this mode error lists are always produced by a single checker, and, if you open the error window, the name of the checker that generated the errors is shown on the statusline of the error window. If |'syntastic_aggregate_errors'| is set, syntastic runs all checkers that apply (still cf. |syntastic-filetype-checkers|), then aggregates errors found by all checkers in a single list, and notifies you. In this mode each error message is labeled with the name of the checker that generated it, but you can disable generation of these labels by turning off '|syntastic_id_checkers|'. If |'syntastic_sort_aggregated_errors'| is set (which is the default), messages in the aggregated list are grouped by file, then sorted by line number, then type, then column number. Otherwise messages produced by the same checker are grouped together, and sorting within each group is decided by the variables |'syntastic___sort'|. ------------------------------------------------------------------------------ 2.6 Filtering errors *syntastic-filtering-errors* You can selectively disable some of the errors found by checkers either using |'syntastic_quiet_messages'|, or by specifying a list of patterns in |'syntastic_ignore_files'|. See also: |'syntastic___quiet_messages'| and |'b:syntastic_skip_checks'|. ============================================================================== 3. Commands *syntastic-commands* :Errors *:Errors* When errors have been detected, use this command to pop up the |location-list| and display the error messages. Please note that the |:Errors| command overwrites the current location list with syntastic's own location list. :SyntasticToggleMode *:SyntasticToggleMode* Toggles syntastic between active and passive mode. See |'syntastic_mode_map'| for more info. :SyntasticCheck *:SyntasticCheck* Manually cause a syntax check to be done. By default the checkers in the |'g:syntastic__checkers'| or |'b:syntastic_checkers'| lists are run, cf. |syntastic-filetype-checkers|. If |'syntastic_aggregate_errors'| is unset (which is the default), checking stops the first time a checker reports any errors; if |'syntastic_aggregate_errors'| is set, all checkers that apply are run in turn, and all errors found are aggregated in a single list. The command may be followed by a (space separated) list of checkers. In this case |'g:syntastic__checkers'| and |'b:syntastic_checkers'| are ignored, and the checkers named by the command's arguments are run instead, in the order specified. The set by |'syntastic_aggregate_errors'| still apply. Example: > :SyntasticCheck flake8 pylint < :SyntasticInfo *:SyntasticInfo* The command takes an optional argument, and outputs information about the checkers available for the filetype named by said argument, or for the current filetype if no argument was provided. :SyntasticReset *:SyntasticReset* Resets the list of errors and turns off all error notifiers. :SyntasticSetLoclist *:SyntasticSetLoclist* If |'syntastic_always_populate_loc_list'| is not set, the |location-list| is not filled in automatically with the list of errors detected by the checkers. This is useful if you run syntastic along with other plugins that use location lists. The |:SyntasticSetLoclist| command allows you to stick the errors into the location list explicitly. ============================================================================== 4. Global Options *syntastic-global-options* *'syntastic_check_on_open'* Default: 0 If this variable is enabled, syntastic in active mode will run syntax checks when buffers are first loaded, as well as on saving: > let g:syntastic_check_on_open = 1 < *'syntastic_check_on_wq'* Default: 1 In active mode syntax checks are normally run whenever buffers are written to disk, even when the writes happen just before quitting Vim. If you want to skip checks when you issue |:wq|, |:x|, and |:ZZ|, set this variable to 0: > let g:syntastic_check_on_wq = 0 < *'syntastic_aggregate_errors'* Default: 0 When enabled, syntastic runs all checkers that apply to the current filetype, then aggregates errors found by all checkers and displays them. When disabled, syntastic runs each checker in turn, and stops to display the results the first time a checker finds any errors. > let g:syntastic_aggregate_errors = 1 < *'syntastic_id_checkers'* Default: 1 When results from multiple checkers are aggregated in a single error list (that is either when |'syntastic_aggregate_errors'| is enabled, or when checking a file with a composite filetype), it might not be immediately obvious which checker has produced a given error message. This variable instructs syntastic to label error messages with the names of the checkers that created them. > let g:syntastic_id_checkers = 0 < *'syntastic_sort_aggregated_errors'* Default: 1 By default, when results from multiple checkers are aggregated in a single error list (that is either when |'syntastic_aggregate_errors'| is enabled, or when checking a file with a composite filetype), errors are grouped by file, then sorted by line number, then grouped by type (namely errors take precedence over warnings), then they are sorted by column number. If you want to leave messages grouped by checker output, set this variable to 0: > let g:syntastic_sort_aggregated_errors = 0 < *'syntastic_echo_current_error'* Default: 1 If enabled, syntastic will echo current error to the command window. If multiple errors are found on the same line, |'syntastic_cursor_columns'| is used to decide which one is shown. > let g:syntastic_echo_current_error = 1 < *'syntastic_cursor_columns'* Default: 1 This option controls which errors are echoed to the command window if |'syntastic_echo_current_error'| is set and multiple errors are found on the same line. When the option is enabled, the first error corresponding to the current column is shown. Otherwise, the first error on the current line is echoed, regardless of the cursor position on the current line. When dealing with very large lists of errors, disabling this option can speed up navigation significantly: > let g:syntastic_cursor_column = 0 < *'syntastic_enable_signs'* Default: 1 Use this option to tell syntastic whether to use the |:sign| interface to mark syntax errors: > let g:syntastic_enable_signs = 1 < *'syntastic_error_symbol'* *'syntastic_style_error_symbol'* *'syntastic_warning_symbol'* *'syntastic_style_warning_symbol'* Use this option to control what the syntastic |:sign| text contains. Several error symbols can be customized: syntastic_error_symbol - For syntax errors, defaults to '>>' syntastic_style_error_symbol - For style errors, defaults to 'S>' syntastic_warning_symbol - For syntax warnings, defaults to '>>' syntastic_style_warning_symbol - For style warnings, defaults to 'S>' Example: > let g:syntastic_error_symbol = "✗" let g:syntastic_warning_symbol = "⚠" < *'syntastic_enable_balloons'* Default: 1 Use this option to tell syntastic whether to display error messages in balloons when the mouse is hovered over erroneous lines: > let g:syntastic_enable_balloons = 1 < Note that Vim must be compiled with |+balloon_eval|. *'syntastic_enable_highlighting'* Default: 1 Use this option to tell syntastic whether to use syntax highlighting to mark errors (where possible). Highlighting can be turned off with the following > let g:syntastic_enable_highlighting = 0 < *'syntastic_always_populate_loc_list'* Default: 0 By default syntastic doesn't fill the |location-list| with the errors found by the checkers, in order to reduce clashes with other plugins. Enable this option to tell syntastic to always stick any detected errors into the |location-list|: > let g:syntastic_always_populate_loc_list = 1 < Please note that if |'syntastic_auto_jump'| is set to a non-zero value the location list is overwritten with Syntastic's own list when taking a jump, regardless of the value of |'syntastic_always_populate_loc_list'|. The location list is also overwritten when running the |:Errors| command. *'syntastic_auto_jump'* Default: 0 Enable this option if you want the cursor to jump to the first detected issue when saving or opening a file. When set to 0 the cursor won't jump automatically. > let g:syntastic_auto_jump = 0 < When set to 1 the cursor will always jump to the first issue detected, regardless of type. > let g:syntastic_auto_jump = 1 < When set to 2 the cursor will jump to the first issue detected, but only if this issue is an error. > let g:syntastic_auto_jump = 2 < When set to 3 the cursor will jump to the first error detected, if any. If all issues detected are warnings, the cursor won't jump. > let g:syntastic_auto_jump = 3 < Please note that in either situation taking the jump also has the side effect of the location list being overwritten with Syntastic's own location list, regardless of the value of |'syntastic_always_populate_loc_list'|. *'syntastic_auto_loc_list'* Default: 2 Use this option to tell syntastic to automatically open and/or close the |location-list| (see |syntastic-error-window|). When set to 0 the error window will not be opened or closed automatically. > let g:syntastic_auto_loc_list = 0 < When set to 1 the error window will be automatically opened when errors are detected, and closed when none are detected. > let g:syntastic_auto_loc_list = 1 < When set to 2 the error window will be automatically closed when no errors are detected, but not opened automatically. > let g:syntastic_auto_loc_list = 2 < *'syntastic_loc_list_height'* Default: 10 Use this option to specify the height of the location lists that syntastic opens. > let g:syntastic_loc_list_height = 5 < *'syntastic_ignore_files'* Default: [] Use this option to specify files that syntastic should never check. It's a list of |regular-expression| patterns. The full paths of files (see |::p|) are matched against these patterns, and the matches are case-sensitive. Use |\c| to specify case-insensitive patterns. Example: > let g:syntastic_ignore_files = ['\m^/usr/include/', '\m\c\.h$'] < *'syntastic_filetype_map'* Default: {} Use this option to map non-standard filetypes to standard ones. Corresponding checkers are mapped accordingly, which allows syntastic to check files with non-standard filetypes: > let g:syntastic_filetype_map = { \ "plaintex": "tex", \ "gentoo-metadata": "xml" } < Composite filetypes can also be mapped to simple types, which disables the default behaviour of running both checkers against the input file: > let g:syntastic_filetype_map = { "handlebars.html": "handlebars" } < *'syntastic_mode_map'* Default: { "mode": "active", "active_filetypes": [], "passive_filetypes": [] } Use this option to fine tune when automatic syntax checking is done (or not done). The option should be set to something like: > let g:syntastic_mode_map = { \ "mode": "active", \ "active_filetypes": ["ruby", "php"], \ "passive_filetypes": ["puppet"] } < "mode" can be mapped to one of two values - "active" or "passive". When set to "active", syntastic does automatic checking whenever a buffer is saved or initially opened. When set to "passive" syntastic only checks when the user calls |:SyntasticCheck|. The exceptions to these rules are defined with "active_filetypes" and "passive_filetypes". In passive mode, automatic checks are still done for filetypes in the "active_filetypes" array (and "passive_filetypes" is ignored). In active mode, automatic checks are not done for any filetypes in the "passive_filetypes" array ("active_filetypes" is ignored). If any of "mode", "active_filetypes", or "passive_filetypes" are left unspecified, they default to values above. If local variable |'b:syntastic_mode'| is defined its value takes precedence over all calculations involving |'syntastic_mode_map'| for the corresponding buffer. At runtime, the |:SyntasticToggleMode| command can be used to switch between active and passive modes. *'b:syntastic_mode'* Default: unset Only the local form |'b:syntastic_mode'| is used. When set to either "active" or "passive", it takes precedence over |'syntastic_mode_map'| when deciding whether the corresponding buffer should be checked automatically. *'syntastic_quiet_messages'* Default: {} Use this option to filter out some of the messages produced by checkers. The option should be set to something like: > let g:syntastic_quiet_messages = { \ "!level": "errors", \ "type": "style", \ "regex": '\m\[C03\d\d\]', \ "file:p": ['\m^/usr/include/', '\m\c\.h$'] } < Each element turns off messages matching the patterns specified by the corresponding value. Values are lists, but if a list consist of a single element you may omit the brackets (e.g. you may write "style" instead of ["style"]). Elements with values [] or '' are ignored (this is useful for overriding filters, cf. |filter-overrides|). "level" - takes one of two values, "warnings" or "errors" "type" - can be either "syntax" or "style" "regex" - is matched against the messages' text as a case-insensitive |regular-expression| "file" - is matched against the filenames the messages refer to, as a case-sensitive |regular-expression|. If a key is prefixed by an exclamation mark "!", the corresponding filter is negated (i.e. the above example silences all messages that are NOT errors). The "file" key may be followed by one or more filename modifiers (see |filename-modifiers|). The modifiers are applied to the filenames the messages refer to before matching against the value (i.e. in the above example the full path of the issues are matched against '\m^/usr/include/' and '\m\c\.h$'). If |'syntastic_id_checkers'| is set, filters are applied before error messages are labeled with the names of the checkers that created them. There are also checker-specific variants of this option, providing finer control. They are named |'syntastic___quiet_messages'|. For a particular checker, if both a |'syntastic_quiet_messages'| filter and a checker-specific filter are present, they are both applied (to the list of errors produced by the said checker). In case of conflicting values for the same keys, the values of the checker-specific filters take precedence. *filter-overrides* Since filter elements with values [] or '' are ignored, you can disable global filters for particular checkers, by setting the values of the corresponding elements in |'syntastic___quiet_messages'| to [] or ''. For example, the following setting will silence all warnings, except for the ones produced by "pylint": > let g:syntastic_quiet_messages = { "level": "warnings" } let g:syntastic_python_pylint_quiet_messages = { "level" : [] } < *'syntastic_stl_format'* Default: [Syntax: line:%F (%t)] Use this option to control what the syntastic statusline text contains. Several magic flags are available to insert information: %e - number of errors %w - number of warnings %t - total number of warnings and errors %ne - filename of file containing first error %nw - filename of file containing first warning %N - filename of file containing first warning or error %pe - filename with path of file containing first error %pw - filename with path of file containing first warning %P - filename with path of file containing first warning or error %fe - line number of first error %fw - line number of first warning %F - line number of first warning or error These flags accept width and alignment controls similar to the ones used by |'statusline'| flags: %-0{minwid}.{maxwid}{flag} All fields except {flag} are optional. A single percent sign can be given as "%%". Several additional flags are available to hide text under certain conditions: %E{...} - hide the text in the brackets unless there are errors %W{...} - hide the text in the brackets unless there are warnings %B{...} - hide the text in the brackets unless there are both warnings AND errors These flags can't be nested. Example: > let g:syntastic_stl_format = '[%E{Err: %fe #%e}%B{, }%W{Warn: %fw #%w}]' < If this format is used and the current buffer has 5 errors and 1 warning starting on lines 20 and 10 respectively then this would appear on the statusline: > [Err: 20 #5, Warn: 10 #1] < If the buffer had 2 warnings, starting on line 5 then this would appear: > [Warn: 5 #2] < *'b:syntastic_skip_checks'* Default: unset Only the local form |'b:syntastic_skip_checks'| is used. When set to a true value, no checks are run against the corresponding buffer. Example: > let b:syntastic_skip_checks = 1 < *'syntastic_full_redraws'* Default: 0 in GUI Vim and MacVim, 1 otherwise Controls whether syntastic calls |:redraw| or |:redraw!| for screen redraws. Changing it can in principle make screen redraws smoother, but it can also cause screen to flicker, or cause ghost characters. Leaving it to the default should be safe. *'syntastic_exit_checks'* Default: 0 when running under "cmd.exe" on Windows, 1 otherwise Syntastic attempts to catch abnormal termination conditions from checkers by looking at their exit codes. The "cmd.exe" shell on Windows make these checks meaningless, by returning 1 to Vim when the checkers exit with non-zero codes. The above variable can be used to disable exit code checks in syntastic. *'syntastic_shell'* Default: Vim's 'shell' This is the (full path to) the shell syntastic will use to run the checkers. On UNIX and Mac OS-X this shell must accept Bourne-compatible syntax for file "stdout" and "stderr" redirections ">file" and "2>file". Examples of compatible shells are "zsh", "bash", "ksh", and of course the original Bourne "sh". This shell is independent of Vim's 'shell', and it isn't used for interactive operations. It must take care to initialize all environment variables needed by the checkers you're using. Example: > let g:syntastic_shell = "/bin/sh" < *'syntastic_debug'* Default: 0 Set this to the sum of one or more of the following flags to enable debugging: 1 - trace general workflow 2 - dump location lists 4 - trace notifiers 8 - trace autocommands 16 - dump options 32 - trace running of specific checkers Example: > let g:syntastic_debug = 1 < Syntastic will then add debugging messages to Vim's |message-history|. You can examine these messages with |:mes|. *'syntastic_debug_file'* Default: unset When set, debugging messages are written to the file named by its value, in addition to being added to Vim's |message-history|: > let g:syntastic_debug_file = '~/syntastic.log' < *'syntastic_extra_filetypes'* Default: [] List of filetypes handled by checkers external to syntastic. If you have a Vim plugin that adds a checker for syntastic, and if the said checker deals with a filetype that is unknown to syntastic, you might consider adding that filetype to this list: > let g:syntastic_extra_filetypes = [ "make", "gitcommit" ] < This will allow |:SyntasticInfo| to do proper tab completion for the new filetypes. ============================================================================== 5. Checker Options *syntastic-checker-options* ------------------------------------------------------------------------------ 5.1 Choosing which checkers to use *syntastic-filetype-checkers* *'g:syntastic__checkers'* You can tell syntastic which checkers to run for a given filetype by setting a variable 'g:syntastic__checkers' to a list of checkers, e.g. > let g:syntastic_php_checkers = ["php", "phpcs", "phpmd"] < *'b:syntastic_checkers'* There is also a per-buffer version of this setting, 'b:syntastic_checkers'. When set, it takes precedence over |'g:syntastic__checkers'|. You can use this in an autocmd to configure specific checkers for particular paths: > autocmd FileType python if stridx(expand("%:p"), "/some/path/") == 0 | \ let b:syntastic_checkers = ["pylint"] | endif < If neither |'g:syntastic__checkers'| nor |'b:syntastic_checkers'| is set, a default list of checker is used. Beware however that this list deliberately kept minimal, for performance reasons. Take a look at the wiki to find out what checkers and filetypes are supported by syntastic: https://github.com/scrooloose/syntastic/wiki/Syntax-Checkers Use |:SyntasticInfo| to see which checkers are available for a given filetype. ------------------------------------------------------------------------------ 5.2 Choosing the executable *syntastic-config-exec* *'syntastic___exec'* The executable run by a checker is normally defined automatically, when the checker is registered. You can however override it, by setting the variable 'g:syntastic___exec': > let g:syntastic_ruby_mri_exec = '~/bin/ruby2' < This variable has a local version, 'b:syntastic___exec', which takes precedence over the global one in the corresponding buffer. *'b:syntastic__exec'* And there is also a local variable named 'b:syntastic__exec', which takes precedence over both 'b:syntastic___exec' and 'g:syntastic___exec' in the buffers where it is defined. ------------------------------------------------------------------------------ 5.3 Configuring specific checkers *syntastic-config-makeprg* Most checkers use the 'makeprgBuild()' function and provide many options by default - in fact you can customise every part of the command that gets called. *'syntastic___