From f676f799e7ddcffa8055a7ac4490be965eef5c26 Mon Sep 17 00:00:00 2001 From: Amir Date: Sun, 7 Jan 2024 16:14:20 +0100 Subject: [PATCH] Updated plugins --- ...anguage_server.vim => language_server.vim} | 17 +- .../ale/ale_linters/c/clangcheck.vim | 38 +++ .../ale/ale_linters/cairo/scarb.vim | 31 ++ .../ale/ale_linters/dafny/dafny.vim | 2 +- .../ale/ale_linters/elixir/elixir_ls.vim | 3 +- .../ale/ale_linters/elixir/lexical.vim | 19 ++ .../ale_linters/elm/{elm_ls.vim => ls.vim} | 9 +- .../ale/ale_linters/eruby/erb.vim | 4 +- .../ale_linters/fortran/language_server.vim | 1 + .../ale/ale_linters/go/gobuild.vim | 17 +- .../ale/ale_linters/go/govet.vim | 21 +- .../handlebars/embertemplatelint.vim | 7 +- .../ale/ale_linters/haskell/hls.vim | 5 +- .../ale/ale_linters/html/angular.vim | 2 +- .../ale/ale_linters/java/javalsp.vim | 1 + .../ale/ale_linters/javascript/flow_ls.vim | 3 +- .../ale/ale_linters/json/vscodejson.vim | 18 +- .../ale/ale_linters/julia/languageserver.vim | 1 + .../ale/ale_linters/kotlin/languageserver.vim | 1 + .../ale_linters/lua/lua_language_server.vim | 2 +- .../ale/ale_linters/lua/luacheck.vim | 37 ++- .../ale/ale_linters/nix/rnix_lsp.vim | 1 + .../ale/ale_linters/ocaml/ols.vim | 1 + .../ale/ale_linters/php/phpmd.vim | 4 +- .../ale/ale_linters/puppet/languageserver.vim | 1 + .../ale/ale_linters/purescript/ls.vim | 1 + .../ale/ale_linters/python/jedils.vim | 1 + .../ale/ale_linters/python/ruff.vim | 22 +- .../ale/ale_linters/r/languageserver.vim | 1 + .../ale/ale_linters/reason/ls.vim | 1 + .../ale/ale_linters/reason/ols.vim | 1 + .../ale/ale_linters/ruby/packwerk.vim | 55 ++++ .../ale/ale_linters/rust/analyzer.vim | 1 + .../ale/ale_linters/sh/shell.vim | 5 - .../ale/ale_linters/solidity/solhint.vim | 83 ++++- .../ale/ale_linters/swift/sourcekitlsp.vim | 1 + .../ale_linters/terraform/terraform_ls.vim | 1 + sources_non_forked/ale/ale_linters/v/v.vim | 17 +- .../ale/ale_linters/vue/vls.vim | 1 + .../ale/ale_linters/yaml/actionlint.vim | 42 ++- .../ale/ale_linters/yaml/ls.vim | 1 + sources_non_forked/ale/autoload/ale.vim | 24 +- .../ale/autoload/ale/code_action.vim | 12 +- .../ale/autoload/ale/codefix.vim | 14 +- .../ale/autoload/ale/completion.vim | 10 +- .../ale/autoload/ale/debugging.vim | 116 ++++++- .../ale/autoload/ale/definition.vim | 18 +- .../ale/autoload/ale/engine.vim | 2 +- .../ale/autoload/ale/engine/ignore.vim | 67 +++- .../ale/autoload/ale/events.vim | 91 +++++- .../ale/autoload/ale/filerename.vim | 4 +- sources_non_forked/ale/autoload/ale/fix.vim | 2 +- .../ale/autoload/ale/fix/registry.vim | 17 +- .../ale/autoload/ale/fixers/forge.vim | 11 + .../ale/autoload/ale/fixers/nickel_format.vim | 16 + .../ale/autoload/ale/fixers/ruff_format.vim | 72 +++++ .../ale/autoload/ale/handlers/actionlint.vim | 36 --- .../ale/autoload/ale/handlers/cairo.vim | 41 +++ .../ale/autoload/ale/handlers/deno.vim | 17 +- .../ale/autoload/ale/handlers/hdl_checker.vim | 4 +- .../ale/autoload/ale/handlers/shellcheck.vim | 2 +- .../ale/autoload/ale/handlers/solhint.vim | 98 ------ sources_non_forked/ale/autoload/ale/hover.vim | 7 +- .../ale/autoload/ale/linter.vim | 12 +- .../ale/autoload/ale/lsp/reset.vim | 69 ++++- .../ale/autoload/ale/lsp_linter.vim | 147 +++++---- .../ale/autoload/ale/organize_imports.vim | 8 +- .../ale/autoload/ale/python.vim | 9 +- .../ale/autoload/ale/references.vim | 6 +- .../ale/autoload/ale/rename.vim | 18 +- sources_non_forked/ale/autoload/ale/sign.vim | 6 +- .../ale/autoload/ale/symbol.vim | 4 +- .../ale/autoload/ale/uri/jdt.vim | 14 +- sources_non_forked/ale/autoload/ale/util.vim | 13 +- .../ale/autoload/ale/virtualtext.vim | 51 +++- sources_non_forked/ale/doc/ale-c.txt | 37 ++- sources_non_forked/ale/doc/ale-cairo.txt | 15 + .../ale/doc/ale-development.txt | 4 +- sources_non_forked/ale/doc/ale-elixir.txt | 18 ++ sources_non_forked/ale/doc/ale-java.txt | 2 +- sources_non_forked/ale/doc/ale-nickel.txt | 25 ++ sources_non_forked/ale/doc/ale-python.txt | 64 ++++ sources_non_forked/ale/doc/ale-ruby.txt | 20 ++ sources_non_forked/ale/doc/ale-rust.txt | 7 +- sources_non_forked/ale/doc/ale-solidity.txt | 9 + .../doc/ale-supported-languages-and-tools.txt | 8 + sources_non_forked/ale/doc/ale-typescript.txt | 4 +- sources_non_forked/ale/doc/ale.txt | 213 +++++++++---- .../ale/ftplugin/ale-fix-suggest.vim | 3 + sources_non_forked/ale/ftplugin/ale-info.vim | 22 ++ .../ale/ftplugin/ale-preview-selection.vim | 15 + .../ale/ftplugin/ale-preview.vim | 3 + sources_non_forked/ale/lspconfig.vim | 3 + .../ale/lua/ale/diagnostics.lua | 82 +++++ sources_non_forked/ale/lua/ale/util.lua | 14 + sources_non_forked/ale/lua/diagnostics.lua | 49 --- sources_non_forked/ale/plugin/ale.vim | 24 +- sources_non_forked/ale/supported-tools.md | 8 + .../ale/syntax/ale-fix-suggest.vim | 2 +- sources_non_forked/ale/syntax/ale-info.vim | 30 ++ sources_non_forked/dracula/INSTALL.md | 27 +- sources_non_forked/dracula/README.md | 7 +- sources_non_forked/dracula/colors/dracula.vim | 20 ++ sources_non_forked/dracula/dracula-pro.png | Bin 0 -> 339197 bytes .../autoload/editorconfig_core/ini.vim | 2 +- .../editorconfig-vim/doc/editorconfig.txt | 61 ++-- .../editorconfig-vim/plugin/editorconfig.vim | 7 +- .../lightline.vim/autoload/lightline.vim | 6 +- .../lightline/colorscheme/rosepine_moon.vim | 41 +++ .../lightline.vim/colorscheme.md | 4 + .../lightline.vim/doc/lightline.txt | 4 +- .../nerdtree/.github/PULL_REQUEST_TEMPLATE.md | 15 - sources_non_forked/nerdtree/CHANGELOG.md | 30 ++ sources_non_forked/nerdtree/README.markdown | 32 +- .../nerdtree/autoload/nerdtree.vim | 38 ++- .../nerdtree/autoload/nerdtree/ui_glue.vim | 8 + sources_non_forked/nerdtree/doc/NERDTree.txt | 55 +++- .../nerdtree/lib/nerdtree/creator.vim | 32 +- .../nerdtree/lib/nerdtree/path.vim | 27 +- .../nerdtree/lib/nerdtree/tree_dir_node.vim | 26 +- .../nerdtree/lib/nerdtree/ui.vim | 19 ++ .../nerdtree/nerdtree_plugin/fs_menu.vim | 95 +++++- .../nerdtree/plugin/NERD_tree.vim | 5 + .../nerdtree/syntax/nerdtree.vim | 2 +- sources_non_forked/nginx.vim/syntax/nginx.vim | 4 +- .../typescript-vim/syntax/typescript.vim | 198 ++++++------ .../vim-abolish/plugin/abolish.vim | 2 +- .../vim-flake8/{README.mdown => README.md} | 0 .../vim-flake8/autoload/flake8.vim | 60 +++- .../vim-fugitive/autoload/fugitive.vim | 288 ++++++++++++------ .../vim-fugitive/doc/fugitive.txt | 15 +- sources_non_forked/vim-gitgutter/README.mkd | 2 + .../vim-gitgutter/autoload/gitgutter.vim | 18 +- .../vim-gitgutter/autoload/gitgutter/diff.vim | 38 +-- .../vim-gitgutter/autoload/gitgutter/hunk.vim | 6 +- .../autoload/gitgutter/utility.vim | 101 +++++- .../vim-gitgutter/test/test_gitgutter.vim | 62 +++- sources_non_forked/vim-markdown/README.md | 21 ++ .../vim-markdown/doc/vim-markdown.txt | 24 ++ .../vim-markdown/ftplugin/markdown.vim | 21 +- .../vim-markdown/syntax/markdown.vim | 17 +- .../vim-markdown/test/strikethrough.vader | 41 +++ .../vim-markdown/test/syntax.vader | 224 ++++++++++++++ .../vim-markdown/test/table-format.vader | 15 + .../vim-ruby/autoload/rubycomplete.vim | 5 +- .../vim-ruby/compiler/eruby.vim | 1 - sources_non_forked/vim-ruby/compiler/rake.vim | 1 - .../vim-ruby/compiler/rspec.vim | 1 - sources_non_forked/vim-ruby/compiler/ruby.vim | 1 - .../vim-ruby/compiler/rubyunit.vim | 1 - .../vim-ruby/ftplugin/eruby.vim | 1 - sources_non_forked/vim-ruby/ftplugin/ruby.vim | 37 ++- sources_non_forked/vim-ruby/indent/eruby.vim | 1 - sources_non_forked/vim-ruby/indent/ruby.vim | 1 - sources_non_forked/vim-ruby/syntax/eruby.vim | 1 - sources_non_forked/vim-ruby/syntax/ruby.vim | 1 - sources_non_forked/vim-snipmate/README.md | 61 ++-- .../vim-snipmate/autoload/snipMate.vim | 96 ++++-- .../vim-snipmate/doc/snipMate.txt | 51 +++- .../vim-snipmate/plugin/snipMate.vim | 4 - sources_non_forked/vim-snippets/README.md | 3 + .../vim-snippets/UltiSnips/java.snippets | 2 +- .../vim-snippets/UltiSnips/php.snippets | 2 +- .../vim-snippets/UltiSnips/rst.snippets | 2 +- .../vim-snippets/UltiSnips/tex.snippets | 188 ------------ .../vim-snippets/pythonx/vimsnippets.py | 2 +- .../vim-snippets/snippets/c.snippets | 2 - .../vim-snippets/snippets/cpp.snippets | 26 ++ .../vim-snippets/snippets/dart.snippets | 7 + .../vim-snippets/snippets/scheme.snippets | 2 +- .../vim-snippets/snippets/tex.snippets | 10 + .../vim-surround/README.markdown | 2 +- 172 files changed, 3227 insertions(+), 1204 deletions(-) rename sources_non_forked/ale/ale_linters/ansible/{ansible_language_server.vim => language_server.vim} (60%) create mode 100644 sources_non_forked/ale/ale_linters/c/clangcheck.vim create mode 100644 sources_non_forked/ale/ale_linters/cairo/scarb.vim create mode 100644 sources_non_forked/ale/ale_linters/elixir/lexical.vim rename sources_non_forked/ale/ale_linters/elm/{elm_ls.vim => ls.vim} (85%) create mode 100644 sources_non_forked/ale/ale_linters/ruby/packwerk.vim create mode 100644 sources_non_forked/ale/autoload/ale/fixers/forge.vim create mode 100644 sources_non_forked/ale/autoload/ale/fixers/nickel_format.vim create mode 100644 sources_non_forked/ale/autoload/ale/fixers/ruff_format.vim delete mode 100644 sources_non_forked/ale/autoload/ale/handlers/actionlint.vim create mode 100644 sources_non_forked/ale/autoload/ale/handlers/cairo.vim delete mode 100644 sources_non_forked/ale/autoload/ale/handlers/solhint.vim create mode 100644 sources_non_forked/ale/doc/ale-nickel.txt create mode 100644 sources_non_forked/ale/ftplugin/ale-info.vim create mode 100644 sources_non_forked/ale/lspconfig.vim create mode 100644 sources_non_forked/ale/lua/ale/diagnostics.lua create mode 100644 sources_non_forked/ale/lua/ale/util.lua delete mode 100644 sources_non_forked/ale/lua/diagnostics.lua create mode 100644 sources_non_forked/ale/syntax/ale-info.vim create mode 100644 sources_non_forked/dracula/dracula-pro.png create mode 100644 sources_non_forked/lightline.vim/autoload/lightline/colorscheme/rosepine_moon.vim rename sources_non_forked/vim-flake8/{README.mdown => README.md} (100%) create mode 100644 sources_non_forked/vim-markdown/test/strikethrough.vader diff --git a/sources_non_forked/ale/ale_linters/ansible/ansible_language_server.vim b/sources_non_forked/ale/ale_linters/ansible/language_server.vim similarity index 60% rename from sources_non_forked/ale/ale_linters/ansible/ansible_language_server.vim rename to sources_non_forked/ale/ale_linters/ansible/language_server.vim index d1f3fb7d..0c064353 100644 --- a/sources_non_forked/ale/ale_linters/ansible/ansible_language_server.vim +++ b/sources_non_forked/ale/ale_linters/ansible/language_server.vim @@ -4,17 +4,17 @@ call ale#Set('ansible_language_server_executable', 'ansible-language-server') call ale#Set('ansible_language_server_config', {}) -function! ale_linters#ansible#ansible_language_server#Executable(buffer) abort +function! ale_linters#ansible#language_server#Executable(buffer) abort return ale#Var(a:buffer, 'ansible_language_server_executable') endfunction -function! ale_linters#ansible#ansible_language_server#GetCommand(buffer) abort - let l:executable = ale_linters#ansible#ansible_language_server#Executable(a:buffer) +function! ale_linters#ansible#language_server#GetCommand(buffer) abort + let l:executable = ale_linters#ansible#language_server#Executable(a:buffer) return ale#Escape(l:executable) . ' --stdio' endfunction -function! ale_linters#ansible#ansible_language_server#FindProjectRoot(buffer) abort +function! ale_linters#ansible#language_server#FindProjectRoot(buffer) abort let l:dir = fnamemodify( \ ale#path#FindNearestFile(a:buffer, 'ansible.cfg'), \ ':h' @@ -37,10 +37,11 @@ function! ale_linters#ansible#ansible_language_server#FindProjectRoot(buffer) ab endfunction call ale#linter#Define('ansible', { -\ 'name': 'ansible-language-server', +\ 'name': 'language_server', +\ 'aliases': ['ansible_language_server', 'ansible-language-server'], \ 'lsp': 'stdio', -\ 'executable': function('ale_linters#ansible#ansible_language_server#Executable'), -\ 'command': function('ale_linters#ansible#ansible_language_server#GetCommand'), -\ 'project_root': function('ale_linters#ansible#ansible_language_server#FindProjectRoot'), +\ 'executable': function('ale_linters#ansible#language_server#Executable'), +\ 'command': function('ale_linters#ansible#language_server#GetCommand'), +\ 'project_root': function('ale_linters#ansible#language_server#FindProjectRoot'), \ 'lsp_config': {b -> ale#Var(b, 'ansible_language_server_config')} \}) diff --git a/sources_non_forked/ale/ale_linters/c/clangcheck.vim b/sources_non_forked/ale/ale_linters/c/clangcheck.vim new file mode 100644 index 00000000..54dad47b --- /dev/null +++ b/sources_non_forked/ale/ale_linters/c/clangcheck.vim @@ -0,0 +1,38 @@ +" Author: gagbo +" : luibo +" : Jorengarenar +" Description: clang-check linter for C files +" modified from cpp/clangcheck.vim to match for C + +call ale#Set('c_clangcheck_executable', 'clang-check') +call ale#Set('c_clangcheck_options', '') +call ale#Set('c_build_dir', '') + +function! ale_linters#c#clangcheck#GetCommand(buffer) abort + let l:user_options = ale#Var(a:buffer, 'c_clangcheck_options') + + " Try to find compilation database to link automatically + let l:build_dir = ale#Var(a:buffer, 'c_build_dir') + + if empty(l:build_dir) + let [l:root, l:json_file] = ale#c#FindCompileCommands(a:buffer) + let l:build_dir = ale#path#Dirname(l:json_file) + endif + + " The extra arguments in the command are used to prevent .plist files from + " being generated. These are only added if no build directory can be + " detected. + return '%e -analyze %s' + \ . (empty(l:build_dir) ? ' --extra-arg=-Xclang --extra-arg=-analyzer-output=text --extra-arg=-fno-color-diagnostics': '') + \ . ale#Pad(l:user_options) + \ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '') +endfunction + +call ale#linter#Define('c', { +\ 'name': 'clangcheck', +\ 'output_stream': 'stderr', +\ 'executable': {b -> ale#Var(b, 'c_clangcheck_executable')}, +\ 'command': function('ale_linters#c#clangcheck#GetCommand'), +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'lint_file': 1, +\}) diff --git a/sources_non_forked/ale/ale_linters/cairo/scarb.vim b/sources_non_forked/ale/ale_linters/cairo/scarb.vim new file mode 100644 index 00000000..48212f0b --- /dev/null +++ b/sources_non_forked/ale/ale_linters/cairo/scarb.vim @@ -0,0 +1,31 @@ +" Author: 0xhyoga <0xhyoga@gmx.com>, +" Description: scarb for cairo files + +function! ale_linters#cairo#scarb#GetScarbExecutable(bufnr) abort + if ale#path#FindNearestFile(a:bufnr, 'Scarb.toml') isnot# '' + return 'scarb' + else + " if there is no Scarb.toml file, we don't use scarb even if it exists, + " so we return '', because executable('') apparently always fails + return '' + endif +endfunction + +function! ale_linters#cairo#scarb#GetCommand(buffer, version) abort + return 'scarb build' +endfunction + +call ale#linter#Define('cairo', { +\ 'name': 'scarb', +\ 'executable': function('ale_linters#cairo#scarb#GetScarbExecutable'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#cairo#scarb#GetScarbExecutable(buffer), +\ '%e --version', +\ function('ale_linters#cairo#scarb#GetCommand'), +\ )}, +\ 'callback': 'ale#handlers#cairo#HandleCairoErrors', +\ 'output_stream': 'both', +\ 'lint_file': 1, +\}) + diff --git a/sources_non_forked/ale/ale_linters/dafny/dafny.vim b/sources_non_forked/ale/ale_linters/dafny/dafny.vim index 2a9f761a..8a114d22 100644 --- a/sources_non_forked/ale/ale_linters/dafny/dafny.vim +++ b/sources_non_forked/ale/ale_linters/dafny/dafny.vim @@ -1,4 +1,5 @@ " Author: Taylor Blau +call ale#Set('dafny_dafny_timelimit', 10) function! ale_linters#dafny#dafny#Handle(buffer, lines) abort let l:pattern = '\v(.*)\((\d+),(\d+)\): (.*): (.*)' @@ -31,7 +32,6 @@ function! ale_linters#dafny#dafny#GetCommand(buffer) abort return printf('dafny %%s /compile:0 /timeLimit:%d', ale#Var(a:buffer, 'dafny_dafny_timelimit')) endfunction -call ale#Set('dafny_dafny_timelimit', 10) call ale#linter#Define('dafny', { \ 'name': 'dafny', \ 'executable': 'dafny', diff --git a/sources_non_forked/ale/ale_linters/elixir/elixir_ls.vim b/sources_non_forked/ale/ale_linters/elixir/elixir_ls.vim index a7d7110c..c7dda600 100644 --- a/sources_non_forked/ale/ale_linters/elixir/elixir_ls.vim +++ b/sources_non_forked/ale/ale_linters/elixir/elixir_ls.vim @@ -12,7 +12,8 @@ function! ale_linters#elixir#elixir_ls#GetExecutable(buffer) abort endfunction call ale#linter#Define('elixir', { -\ 'name': 'elixir-ls', +\ 'name': 'elixir_ls', +\ 'aliases': ['elixir-ls', 'elixirls'], \ 'lsp': 'stdio', \ 'executable': function('ale_linters#elixir#elixir_ls#GetExecutable'), \ 'command': function('ale_linters#elixir#elixir_ls#GetExecutable'), diff --git a/sources_non_forked/ale/ale_linters/elixir/lexical.vim b/sources_non_forked/ale/ale_linters/elixir/lexical.vim new file mode 100644 index 00000000..ea13142e --- /dev/null +++ b/sources_non_forked/ale/ale_linters/elixir/lexical.vim @@ -0,0 +1,19 @@ +" Author: Axel Clark +" Description: Lexical integration (https://github.com/lexical-lsp/lexical) + +call ale#Set('elixir_lexical_release', 'lexical') + +function! ale_linters#elixir#lexical#GetExecutable(buffer) abort + let l:dir = ale#path#Simplify(ale#Var(a:buffer, 'elixir_lexical_release')) + let l:cmd = has('win32') ? '\start_lexical.bat' : '/start_lexical.sh' + + return l:dir . l:cmd +endfunction + +call ale#linter#Define('elixir', { +\ 'name': 'lexical', +\ 'lsp': 'stdio', +\ 'executable': function('ale_linters#elixir#lexical#GetExecutable'), +\ 'command': function('ale_linters#elixir#lexical#GetExecutable'), +\ 'project_root': function('ale#handlers#elixir#FindMixUmbrellaRoot'), +\}) diff --git a/sources_non_forked/ale/ale_linters/elm/elm_ls.vim b/sources_non_forked/ale/ale_linters/elm/ls.vim similarity index 85% rename from sources_non_forked/ale/ale_linters/elm/elm_ls.vim rename to sources_non_forked/ale/ale_linters/elm/ls.vim index a02dbf42..38a5b234 100644 --- a/sources_non_forked/ale/ale_linters/elm/elm_ls.vim +++ b/sources_non_forked/ale/ale_linters/elm/ls.vim @@ -10,13 +10,13 @@ call ale#Set('elm_ls_elm_format_path', '') call ale#Set('elm_ls_elm_test_path', '') call ale#Set('elm_ls_elm_analyse_trigger', 'change') -function! elm_ls#GetRootDir(buffer) abort +function! ale_linters#elm#ls#GetProjectRoot(buffer) abort let l:elm_json = ale#path#FindNearestFile(a:buffer, 'elm.json') return !empty(l:elm_json) ? fnamemodify(l:elm_json, ':p:h') : '' endfunction -function! elm_ls#GetOptions(buffer) abort +function! ale_linters#elm#ls#GetOptions(buffer) abort return { \ 'elmPath': ale#Var(a:buffer, 'elm_ls_elm_path'), \ 'elmFormatPath': ale#Var(a:buffer, 'elm_ls_elm_format_path'), @@ -26,7 +26,8 @@ function! elm_ls#GetOptions(buffer) abort endfunction call ale#linter#Define('elm', { -\ 'name': 'elm_ls', +\ 'name': 'ls', +\ 'aliases': ['elm_ls'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#path#FindExecutable(b, 'elm_ls', [ \ 'node_modules/.bin/elm-language-server', @@ -34,7 +35,7 @@ call ale#linter#Define('elm', { \ 'elm-lsp' \ ])}, \ 'command': '%e --stdio', -\ 'project_root': function('elm_ls#GetRootDir'), +\ 'project_root': function('ale_linters#elm#ls#GetProjectRoot'), \ 'language': 'elm', \ 'initialization_options': function('elm_ls#GetOptions') \}) diff --git a/sources_non_forked/ale/ale_linters/eruby/erb.vim b/sources_non_forked/ale/ale_linters/eruby/erb.vim index eaaec577..0ca157aa 100644 --- a/sources_non_forked/ale/ale_linters/eruby/erb.vim +++ b/sources_non_forked/ale/ale_linters/eruby/erb.vim @@ -10,8 +10,8 @@ function! ale_linters#eruby#erb#GetCommand(buffer) abort " Rails-flavored eRuby does not comply with the standard as understood by " ERB, so we'll have to do some substitution. This does not reduce the - " effectiveness of the linter-the translated code is still evaluated. - return 'ruby -r erb -e ' . ale#Escape('puts ERB.new($stdin.read.gsub(%{<%=},%{<%}), nil, %{-}).src') . '< %t | ruby -c' + " effectiveness of the linter—the translated code is still evaluated. + return 'ruby -r erb -e ' . ale#Escape('puts ERB.new($stdin.read.gsub(%{<%=},%{<%}), trim_mode: %{-}).src') . '< %t | ruby -c' endfunction call ale#linter#Define('eruby', { diff --git a/sources_non_forked/ale/ale_linters/fortran/language_server.vim b/sources_non_forked/ale/ale_linters/fortran/language_server.vim index 00aa0577..c885b699 100644 --- a/sources_non_forked/ale/ale_linters/fortran/language_server.vim +++ b/sources_non_forked/ale/ale_linters/fortran/language_server.vim @@ -12,6 +12,7 @@ endfunction call ale#linter#Define('fortran', { \ 'name': 'language_server', +\ 'aliases': ['fortls'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'fortran_language_server_executable')}, \ 'command': '%e', diff --git a/sources_non_forked/ale/ale_linters/go/gobuild.vim b/sources_non_forked/ale/ale_linters/go/gobuild.vim index 5210c5a8..0342a230 100644 --- a/sources_non_forked/ale/ale_linters/go/gobuild.vim +++ b/sources_non_forked/ale/ale_linters/go/gobuild.vim @@ -6,16 +6,6 @@ call ale#Set('go_go_executable', 'go') call ale#Set('go_gobuild_options', '') -function! ale_linters#go#gobuild#GetCommand(buffer) abort - let l:options = ale#Var(a:buffer, 'go_gobuild_options') - - " Run go test in local directory with relative path - return ale#go#EnvString(a:buffer) - \ . ale#Var(a:buffer, 'go_go_executable') . ' test' - \ . (!empty(l:options) ? ' ' . l:options : '') - \ . ' -c -o /dev/null ./' -endfunction - function! ale_linters#go#gobuild#GetMatches(lines) abort " Matches patterns like the following: " @@ -50,7 +40,12 @@ call ale#linter#Define('go', { \ 'aliases': ['go build'], \ 'executable': {b -> ale#Var(b, 'go_go_executable')}, \ 'cwd': '%s:h', -\ 'command': function('ale_linters#go#gobuild#GetCommand'), +\ 'command': {b -> +\ ale#go#EnvString(b) +\ . ale#Escape(ale#Var(b, 'go_go_executable')) . ' test' +\ . ale#Pad(ale#Var(b, 'go_gobuild_options')) +\ . ' -c -o /dev/null ./' +\ }, \ 'output_stream': 'stderr', \ 'callback': 'ale_linters#go#gobuild#Handler', \ 'lint_file': 1, diff --git a/sources_non_forked/ale/ale_linters/go/govet.vim b/sources_non_forked/ale/ale_linters/go/govet.vim index 5da8261c..414c8b11 100644 --- a/sources_non_forked/ale/ale_linters/go/govet.vim +++ b/sources_non_forked/ale/ale_linters/go/govet.vim @@ -1,28 +1,21 @@ -" Author: neersighted +" Author: neersighted , John Eikenberry " Description: go vet for Go files -" -" Author: John Eikenberry -" Description: updated to work with go1.10 call ale#Set('go_go_executable', 'go') call ale#Set('go_govet_options', '') -function! ale_linters#go#govet#GetCommand(buffer) abort - let l:options = ale#Var(a:buffer, 'go_govet_options') - - return ale#go#EnvString(a:buffer) - \ . ale#Var(a:buffer, 'go_go_executable') . ' vet ' - \ . (!empty(l:options) ? ' ' . l:options : '') - \ . ' .' -endfunction - call ale#linter#Define('go', { \ 'name': 'govet', \ 'aliases': ['go vet'], \ 'output_stream': 'stderr', \ 'executable': {b -> ale#Var(b, 'go_go_executable')}, \ 'cwd': '%s:h', -\ 'command': function('ale_linters#go#govet#GetCommand'), +\ 'command': {b -> +\ ale#go#EnvString(b) +\ . '%e vet' +\ . ale#Pad(ale#Var(b, 'go_govet_options')) +\ . ' .' +\ }, \ 'callback': 'ale#handlers#go#Handler', \ 'lint_file': 1, \}) diff --git a/sources_non_forked/ale/ale_linters/handlebars/embertemplatelint.vim b/sources_non_forked/ale/ale_linters/handlebars/embertemplatelint.vim index 17c4d08e..14fa3b2e 100644 --- a/sources_non_forked/ale/ale_linters/handlebars/embertemplatelint.vim +++ b/sources_non_forked/ale/ale_linters/handlebars/embertemplatelint.vim @@ -16,12 +16,7 @@ function! ale_linters#handlebars#embertemplatelint#GetCommand(buffer, version) a return '%e --format=json --filename %s' endif - if ale#semver#GTE(a:version, [1, 6, 0]) - " Reading from stdin was introduced in ember-template-lint@1.6.0 - return '%e --json --filename %s' - endif - - return '%e --json %t' + return '%e --json --filename %s' endfunction function! ale_linters#handlebars#embertemplatelint#GetCommandWithVersionCheck(buffer) abort diff --git a/sources_non_forked/ale/ale_linters/haskell/hls.vim b/sources_non_forked/ale/ale_linters/haskell/hls.vim index 7f9efc38..7f7f42e1 100644 --- a/sources_non_forked/ale/ale_linters/haskell/hls.vim +++ b/sources_non_forked/ale/ale_linters/haskell/hls.vim @@ -16,8 +16,9 @@ function! ale_linters#haskell#hls#FindRootFile(buffer) abort for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) for l:root_file in l:serach_root_files - if filereadable(l:path . l:root_file) - return l:path + if filereadable(l:path . '/' . l:root_file) + " Add on / so fnamemodify(..., ':h') below keeps the path. + return l:path . '/' endif endfor endfor diff --git a/sources_non_forked/ale/ale_linters/html/angular.vim b/sources_non_forked/ale/ale_linters/html/angular.vim index 4f368fb4..05caf59d 100644 --- a/sources_non_forked/ale/ale_linters/html/angular.vim +++ b/sources_non_forked/ale/ale_linters/html/angular.vim @@ -48,7 +48,7 @@ endfunction call ale#linter#Define('html', { \ 'name': 'angular', -\ 'aliases': ['angular-language-server'], +\ 'aliases': ['angular-language-server', 'angularls'], \ 'lsp': 'stdio', \ 'executable': function('ale_linters#html#angular#GetExecutable'), \ 'command': function('ale_linters#html#angular#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/java/javalsp.vim b/sources_non_forked/ale/ale_linters/java/javalsp.vim index baf584c8..fa3b0e2c 100644 --- a/sources_non_forked/ale/ale_linters/java/javalsp.vim +++ b/sources_non_forked/ale/ale_linters/java/javalsp.vim @@ -46,6 +46,7 @@ endfunction call ale#linter#Define('java', { \ 'name': 'javalsp', +\ 'aliases': ['java_language_server'], \ 'lsp': 'stdio', \ 'executable': function('ale_linters#java#javalsp#Executable'), \ 'command': function('ale_linters#java#javalsp#Command'), diff --git a/sources_non_forked/ale/ale_linters/javascript/flow_ls.vim b/sources_non_forked/ale/ale_linters/javascript/flow_ls.vim index fec34011..9755ca4e 100644 --- a/sources_non_forked/ale/ale_linters/javascript/flow_ls.vim +++ b/sources_non_forked/ale/ale_linters/javascript/flow_ls.vim @@ -17,7 +17,8 @@ function! ale_linters#javascript#flow_ls#FindProjectRoot(buffer) abort endfunction call ale#linter#Define('javascript', { -\ 'name': 'flow-language-server', +\ 'name': 'flow_ls', +\ 'aliaes': ['flow-language-server'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#path#FindExecutable(b, 'javascript_flow_ls', [ \ 'node_modules/.bin/flow', diff --git a/sources_non_forked/ale/ale_linters/json/vscodejson.vim b/sources_non_forked/ale/ale_linters/json/vscodejson.vim index dcaee010..be9eaf53 100644 --- a/sources_non_forked/ale/ale_linters/json/vscodejson.vim +++ b/sources_non_forked/ale/ale_linters/json/vscodejson.vim @@ -1,6 +1,22 @@ " Author: Dalius Dobravolskas " Description: VSCode json language server +call ale#Set('json_vscodejson_executable', '') + +function! ale_linters#json#vscodejson#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'json_vscodejson_executable') + + if l:executable is# '' + if ale#engine#IsExecutable(a:buffer, 'vscode-json-languageserver') + let l:executable = 'vscode-json-languageserver' + else + let l:executable = 'vscode-json-language-server' + endif + endif + + return l:executable +endfunction + function! ale_linters#json#vscodejson#GetProjectRoot(buffer) abort let l:git_path = ale#path#FindNearestDirectory(a:buffer, '.git') @@ -10,7 +26,7 @@ endfunction call ale#linter#Define('json', { \ 'name': 'vscodejson', \ 'lsp': 'stdio', -\ 'executable': 'vscode-json-language-server', +\ 'executable': function('ale_linters#json#vscodejson#GetExecutable'), \ 'command': '%e --stdio', \ 'project_root': function('ale_linters#json#vscodejson#GetProjectRoot'), \}) diff --git a/sources_non_forked/ale/ale_linters/julia/languageserver.vim b/sources_non_forked/ale/ale_linters/julia/languageserver.vim index 999ad815..fbfab517 100644 --- a/sources_non_forked/ale/ale_linters/julia/languageserver.vim +++ b/sources_non_forked/ale/ale_linters/julia/languageserver.vim @@ -13,6 +13,7 @@ endfunction call ale#linter#Define('julia', { \ 'name': 'languageserver', +\ 'aliases': ['julials'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'julia_executable')}, \ 'command': function('ale_linters#julia#languageserver#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/kotlin/languageserver.vim b/sources_non_forked/ale/ale_linters/kotlin/languageserver.vim index af78c0e0..18b153ae 100644 --- a/sources_non_forked/ale/ale_linters/kotlin/languageserver.vim +++ b/sources_non_forked/ale/ale_linters/kotlin/languageserver.vim @@ -21,6 +21,7 @@ endfunction call ale#linter#Define('kotlin', { \ 'name': 'languageserver', +\ 'aliaes': ['kotlin_language_server'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'kotlin_languageserver_executable')}, \ 'command': '%e', diff --git a/sources_non_forked/ale/ale_linters/lua/lua_language_server.vim b/sources_non_forked/ale/ale_linters/lua/lua_language_server.vim index ebddd4b5..0892ad3b 100644 --- a/sources_non_forked/ale/ale_linters/lua/lua_language_server.vim +++ b/sources_non_forked/ale/ale_linters/lua/lua_language_server.vim @@ -6,7 +6,7 @@ call ale#Set('lua_language_server_config', {}) call ale#linter#Define('lua', { \ 'name': 'lua_language_server', -\ 'aliases': ['lua-language-server'], +\ 'aliases': ['lua-language-server', 'lua_ls'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'lua_language_server_executable')}, \ 'command': '%e', diff --git a/sources_non_forked/ale/ale_linters/lua/luacheck.vim b/sources_non_forked/ale/ale_linters/lua/luacheck.vim index 34be2b5a..16dc08a5 100644 --- a/sources_non_forked/ale/ale_linters/lua/luacheck.vim +++ b/sources_non_forked/ale/ale_linters/lua/luacheck.vim @@ -4,8 +4,43 @@ call ale#Set('lua_luacheck_executable', 'luacheck') call ale#Set('lua_luacheck_options', '') +function! s:IsInRuntimepath(buffer) abort + let l:runtimepath_dirs = split(&runtimepath, ',') + + for l:dir in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) + for l:runtime_dir in l:runtimepath_dirs + if l:dir is# l:runtime_dir + return 1 + endif + endfor + endfor + + return 0 +endfunction + function! ale_linters#lua#luacheck#GetCommand(buffer) abort - return '%e' . ale#Pad(ale#Var(a:buffer, 'lua_luacheck_options')) + let l:options = ale#Var(a:buffer, 'lua_luacheck_options') + + " Add `--globals vim` by default if the file is in runtimepath. + if l:options !~# '--globals' + let l:in_runtime = getbufvar(a:buffer, 'ale_in_runtimepath', v:null) + + if l:in_runtime is v:null + let l:in_runtime = s:IsInRuntimepath(a:buffer) + " Save the result of check this buffer so we only check once. + call setbufvar(a:buffer, 'ale_in_runtimepath', l:in_runtime) + endif + + if l:in_runtime + if !empty(l:options) + let l:options .= ' ' + endif + + let l:options .= '--globals vim' + endif + endif + + return '%e' . ale#Pad(l:options) \ . ' --formatter plain --codes --filename %s -' endfunction diff --git a/sources_non_forked/ale/ale_linters/nix/rnix_lsp.vim b/sources_non_forked/ale/ale_linters/nix/rnix_lsp.vim index 949bed1c..99c0fbfa 100644 --- a/sources_non_forked/ale/ale_linters/nix/rnix_lsp.vim +++ b/sources_non_forked/ale/ale_linters/nix/rnix_lsp.vim @@ -9,6 +9,7 @@ endfunction call ale#linter#Define('nix', { \ 'name': 'rnix_lsp', +\ 'aliases': ['rnix'], \ 'lsp': 'stdio', \ 'executable': 'rnix-lsp', \ 'command': '%e', diff --git a/sources_non_forked/ale/ale_linters/ocaml/ols.vim b/sources_non_forked/ale/ale_linters/ocaml/ols.vim index ec71bdb4..b26c7826 100644 --- a/sources_non_forked/ale/ale_linters/ocaml/ols.vim +++ b/sources_non_forked/ale/ale_linters/ocaml/ols.vim @@ -6,6 +6,7 @@ call ale#Set('ocaml_ols_use_global', get(g:, 'ale_use_global_executables', 0)) call ale#linter#Define('ocaml', { \ 'name': 'ols', +\ 'aliases': ['ocaml-language-server'], \ 'lsp': 'stdio', \ 'executable': function('ale#handlers#ols#GetExecutable'), \ 'command': function('ale#handlers#ols#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/php/phpmd.vim b/sources_non_forked/ale/ale_linters/php/phpmd.vim index 9b1d1e44..368a66c3 100644 --- a/sources_non_forked/ale/ale_linters/php/phpmd.vim +++ b/sources_non_forked/ale/ale_linters/php/phpmd.vim @@ -7,9 +7,9 @@ let g:ale_php_phpmd_executable = get(g:, 'ale_php_phpmd_executable', 'phpmd') let g:ale_php_phpmd_ruleset = get(g:, 'ale_php_phpmd_ruleset', 'cleancode,codesize,controversial,design,naming,unusedcode') function! ale_linters#php#phpmd#GetCommand(buffer) abort - return '%e %s text' + return '%e %t text' \ . ale#Pad(ale#Var(a:buffer, 'php_phpmd_ruleset')) - \ . ' --ignore-violations-on-exit %t' + \ . ' --ignore-violations-on-exit' endfunction function! ale_linters#php#phpmd#Handle(buffer, lines) abort diff --git a/sources_non_forked/ale/ale_linters/puppet/languageserver.vim b/sources_non_forked/ale/ale_linters/puppet/languageserver.vim index 2078695f..c6b12662 100644 --- a/sources_non_forked/ale/ale_linters/puppet/languageserver.vim +++ b/sources_non_forked/ale/ale_linters/puppet/languageserver.vim @@ -29,6 +29,7 @@ endfunction call ale#linter#Define('puppet', { \ 'name': 'languageserver', +\ 'aliases': ['puppet_languageserver'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'puppet_languageserver_executable')}, \ 'command': '%e --stdio', diff --git a/sources_non_forked/ale/ale_linters/purescript/ls.vim b/sources_non_forked/ale/ale_linters/purescript/ls.vim index a20fae47..1eaf2af7 100644 --- a/sources_non_forked/ale/ale_linters/purescript/ls.vim +++ b/sources_non_forked/ale/ale_linters/purescript/ls.vim @@ -41,6 +41,7 @@ endfunction call ale#linter#Define('purescript', { \ 'name': 'purescript-language-server', +\ 'aliases': ['purescriptls'], \ 'lsp': 'stdio', \ 'executable': function('ale_linters#purescript#ls#GetExecutable'), \ 'command': function('ale_linters#purescript#ls#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/python/jedils.vim b/sources_non_forked/ale/ale_linters/python/jedils.vim index d3e15bf2..e82abd1b 100644 --- a/sources_non_forked/ale/ale_linters/python/jedils.vim +++ b/sources_non_forked/ale/ale_linters/python/jedils.vim @@ -30,6 +30,7 @@ endfunction call ale#linter#Define('python', { \ 'name': 'jedils', +\ 'aliases': ['jedi_language_server'], \ 'lsp': 'stdio', \ 'executable': function('ale_linters#python#jedils#GetExecutable'), \ 'command': function('ale_linters#python#jedils#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/python/ruff.vim b/sources_non_forked/ale/ale_linters/python/ruff.vim index 34db0899..c4f8ad1b 100644 --- a/sources_non_forked/ale/ale_linters/python/ruff.vim +++ b/sources_non_forked/ale/ale_linters/python/ruff.vim @@ -46,22 +46,26 @@ function! ale_linters#python#ruff#GetCommand(buffer, version) abort \ : '' " NOTE: ruff version `0.0.69` supports liniting input from stdin - return ale#Escape(l:executable) . l:exec_args + " NOTE: ruff version `0.1.0` deprecates `--format text` + return ale#Escape(l:executable) . l:exec_args . ' -q' \ . ale#Pad(ale#Var(a:buffer, 'python_ruff_options')) - \ . ' --format text' - \ . (ale#semver#GTE(a:version, [0, 0, 69]) ? ' --stdin-filename %s -' : ' %s') + \ . (ale#semver#GTE(a:version, [0, 1, 0]) ? ' --output-format json-lines' : ' --format json-lines') + \ . (ale#semver#GTE(a:version, [0, 0, 69]) ? ' --stdin-filename %s -' : ' %s') endfunction function! ale_linters#python#ruff#Handle(buffer, lines) abort - "Example: path/to/file.py:10:5: E999 SyntaxError: unexpected indent - let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.+)$' let l:output = [] - for l:match in ale#util#GetMatches(a:lines, l:pattern) + for l:line in a:lines + let l:item = json_decode(l:line) call add(l:output, { - \ 'lnum': l:match[1] + 0, - \ 'col': l:match[2] + 0, - \ 'text': l:match[3], + \ 'lnum': l:item.location.row, + \ 'col': l:item.location.column, + \ 'end_lnum': l:item.end_location.row, + \ 'end_col': l:item.end_location.column - 1, + \ 'code': l:item.code, + \ 'text': l:item.message, + \ 'type': l:item.code =~? '\vE\d+' ? 'E' : 'W', \}) endfor diff --git a/sources_non_forked/ale/ale_linters/r/languageserver.vim b/sources_non_forked/ale/ale_linters/r/languageserver.vim index bab869d1..1ff23fa9 100644 --- a/sources_non_forked/ale/ale_linters/r/languageserver.vim +++ b/sources_non_forked/ale/ale_linters/r/languageserver.vim @@ -19,6 +19,7 @@ endfunction call ale#linter#Define('r', { \ 'name': 'languageserver', +\ 'aliases': ['r_language_server'], \ 'lsp': 'stdio', \ 'lsp_config': {b -> ale#Var(b, 'r_languageserver_config')}, \ 'executable': 'Rscript', diff --git a/sources_non_forked/ale/ale_linters/reason/ls.vim b/sources_non_forked/ale/ale_linters/reason/ls.vim index fb1114ae..a831b506 100644 --- a/sources_non_forked/ale/ale_linters/reason/ls.vim +++ b/sources_non_forked/ale/ale_linters/reason/ls.vim @@ -15,6 +15,7 @@ endfunction call ale#linter#Define('reason', { \ 'name': 'reason-language-server', +\ 'aliases': ['reason_ls'], \ 'lsp': 'stdio', \ 'executable': {buffer -> ale#Var(buffer, 'reason_ls_executable')}, \ 'command': '%e', diff --git a/sources_non_forked/ale/ale_linters/reason/ols.vim b/sources_non_forked/ale/ale_linters/reason/ols.vim index 9fbd9b4f..e1f408f0 100644 --- a/sources_non_forked/ale/ale_linters/reason/ols.vim +++ b/sources_non_forked/ale/ale_linters/reason/ols.vim @@ -6,6 +6,7 @@ call ale#Set('reason_ols_use_global', get(g:, 'ale_use_global_executables', 0)) call ale#linter#Define('reason', { \ 'name': 'ols', +\ 'aliases': ['ocaml-language-server'], \ 'lsp': 'stdio', \ 'executable': function('ale#handlers#ols#GetExecutable'), \ 'command': function('ale#handlers#ols#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/ruby/packwerk.vim b/sources_non_forked/ale/ale_linters/ruby/packwerk.vim new file mode 100644 index 00000000..4014b2da --- /dev/null +++ b/sources_non_forked/ale/ale_linters/ruby/packwerk.vim @@ -0,0 +1,55 @@ +" Author: ymap - https://github.com/ymap +" Description: Packwerk, a static analyzer used to enforce boundaries and modularize Rails applications. + +call ale#Set('ruby_packwerk_executable', 'packwerk') +call ale#Set('ruby_packwerk_options', '') + +function! ale_linters#ruby#packwerk#Handle(buffer, lines) abort + let l:pattern = '\v^[^:]+:(\d+):(\d+)$' + let l:index = 0 + let l:output = [] + + while l:index < len(a:lines) - 1 + let l:cleaned_line = substitute(a:lines[l:index], '\v\e\[[0-9;]*m', '', 'g') + let l:match = matchlist(l:cleaned_line, l:pattern) + + if len(l:match) > 0 + call add(l:output, { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': a:lines[l:index + 1], + \}) + endif + + let l:index += 1 + endwhile + + return l:output +endfunction + +function! ale_linters#ruby#packwerk#GetCommand(buffer) abort + let l:rails_root = ale#ruby#FindRailsRoot(a:buffer) + + if l:rails_root is? '' + return '' + endif + + let l:executable = ale#Var(a:buffer, 'ruby_packwerk_executable') + let l:sep = has('win32') ? '\' : '/' + let l:abs_path = expand('#' . a:buffer . ':p') + let l:rel_path = substitute(l:abs_path, escape(l:rails_root . l:sep, '\'), '', '') + + return ale#ruby#EscapeExecutable(l:executable, 'packwerk') + \ . ' check' + \ . ale#Pad(ale#Var(a:buffer, 'ruby_packwerk_options')) + \ . ' ' + \ . ale#Escape(rel_path) +endfunction + +call ale#linter#Define('ruby', { +\ 'name': 'packwerk', +\ 'executable': {b -> ale#Var(b, 'ruby_packwerk_executable')}, +\ 'command': function('ale_linters#ruby#packwerk#GetCommand'), +\ 'callback': 'ale_linters#ruby#packwerk#Handle', +\ 'lint_file': 1, +\}) diff --git a/sources_non_forked/ale/ale_linters/rust/analyzer.vim b/sources_non_forked/ale/ale_linters/rust/analyzer.vim index 3ead3871..e3141cd3 100644 --- a/sources_non_forked/ale/ale_linters/rust/analyzer.vim +++ b/sources_non_forked/ale/ale_linters/rust/analyzer.vim @@ -28,6 +28,7 @@ endfunction call ale#linter#Define('rust', { \ 'name': 'analyzer', +\ 'aliases': ['rust_analyzer'], \ 'lsp': 'stdio', \ 'initialization_options': {b -> ale#Var(b, 'rust_analyzer_config')}, \ 'executable': {b -> ale#Var(b, 'rust_analyzer_executable')}, diff --git a/sources_non_forked/ale/ale_linters/sh/shell.vim b/sources_non_forked/ale/ale_linters/sh/shell.vim index 73ab3608..0605c285 100644 --- a/sources_non_forked/ale/ale_linters/sh/shell.vim +++ b/sources_non_forked/ale/ale_linters/sh/shell.vim @@ -1,11 +1,6 @@ " Author: w0rp " Description: Lints shell files by invoking the shell with -n -" Backwards compatibility -if exists('g:ale_linters_sh_shell_default_shell') - let g:ale_sh_shell_default_shell = g:ale_linters_sh_shell_default_shell -endif - " This option can be changed to change the default shell when the shell " cannot be taken from the hashbang line. if !exists('g:ale_sh_shell_default_shell') diff --git a/sources_non_forked/ale/ale_linters/solidity/solhint.vim b/sources_non_forked/ale/ale_linters/solidity/solhint.vim index 505bd5bb..9dc308fe 100644 --- a/sources_non_forked/ale/ale_linters/solidity/solhint.vim +++ b/sources_non_forked/ale/ale_linters/solidity/solhint.vim @@ -1,12 +1,83 @@ -" Authors: Franco Victorio - https://github.com/fvictorio, Henrique Barcelos -" https://github.com/hbarcelos +" Authors: Franco Victorio <@fvictorio>, Henrique Barcelos <@hbarcelos> " Description: Report errors in Solidity code with solhint +call ale#Set('solidity_solhint_options', '') +call ale#Set('solidity_solhint_executable', 'solhint') +call ale#Set('solidity_solhint_use_global', get(g:, 'ale_use_global_executables', 0)) + +function! ale_linters#solidity#solhint#Handle(buffer, lines) abort + let l:output = [] + + " Matches lines like the following: + " contracts/Bounty.sol:14:3: Expected indentation of 4 spaces but found 2 [Error/indent] + let l:lint_pattern = '\v^[^:]+:(\d+):(\d+): %(Parse error: )@ +\ ale#node#Executable(b, ale_linters#solidity#solhint#GetExecutable(b)) +\ . ale#Pad(ale#Var(b, 'solidity_solhint_options')) +\ . ' --formatter unix %s' +\ }, +\ 'callback': 'ale_linters#solidity#solhint#Handle', \}) diff --git a/sources_non_forked/ale/ale_linters/swift/sourcekitlsp.vim b/sources_non_forked/ale/ale_linters/swift/sourcekitlsp.vim index 560893bf..a403dcc1 100644 --- a/sources_non_forked/ale/ale_linters/swift/sourcekitlsp.vim +++ b/sources_non_forked/ale/ale_linters/swift/sourcekitlsp.vim @@ -5,6 +5,7 @@ call ale#Set('sourcekit_lsp_executable', 'sourcekit-lsp') call ale#linter#Define('swift', { \ 'name': 'sourcekitlsp', +\ 'aliases': ['sourcekit'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'sourcekit_lsp_executable')}, \ 'command': '%e', diff --git a/sources_non_forked/ale/ale_linters/terraform/terraform_ls.vim b/sources_non_forked/ale/ale_linters/terraform/terraform_ls.vim index ab35126e..7dc77941 100644 --- a/sources_non_forked/ale/ale_linters/terraform/terraform_ls.vim +++ b/sources_non_forked/ale/ale_linters/terraform/terraform_ls.vim @@ -30,6 +30,7 @@ endfunction call ale#linter#Define('terraform', { \ 'name': 'terraform_ls', +\ 'aliases': ['terraformls'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#Var(b, 'terraform_ls_executable')}, \ 'command': function('ale_linters#terraform#terraform_ls#GetCommand'), diff --git a/sources_non_forked/ale/ale_linters/v/v.vim b/sources_non_forked/ale/ale_linters/v/v.vim index afa98c56..dfe6f562 100644 --- a/sources_non_forked/ale/ale_linters/v/v.vim +++ b/sources_non_forked/ale/ale_linters/v/v.vim @@ -4,17 +4,6 @@ call ale#Set('v_v_executable', 'v') call ale#Set('v_v_options', '') -function! ale_linters#v#v#GetCommand(buffer) abort - let l:options = ale#Var(a:buffer, 'v_v_options') - - " Run v in local directory with relative path - let l:command = ale#Var(a:buffer, 'v_v_executable') - \ . ale#Pad(l:options) - \ . ' .' . ' -o /tmp/vim-ale-v' - - return l:command -endfunction - function! ale_linters#v#v#Handler(buffer, lines) abort let l:dir = expand('#' . a:buffer . ':p:h') let l:output = [] @@ -73,9 +62,11 @@ endfunction call ale#linter#Define('v', { \ 'name': 'v', -\ 'aliases': [], \ 'executable': {b -> ale#Var(b, 'v_v_executable')}, -\ 'command': function('ale_linters#v#v#GetCommand'), +\ 'command': {b -> +\ '%e' . ale#Pad(ale#Var(b, 'v_v_options')) +\ . ' . -o /tmp/vim-ale-v' +\ }, \ 'output_stream': 'stderr', \ 'callback': 'ale_linters#v#v#Handler', \ 'lint_file': 1, diff --git a/sources_non_forked/ale/ale_linters/vue/vls.vim b/sources_non_forked/ale/ale_linters/vue/vls.vim index 4bd75286..009effd0 100644 --- a/sources_non_forked/ale/ale_linters/vue/vls.vim +++ b/sources_non_forked/ale/ale_linters/vue/vls.vim @@ -12,6 +12,7 @@ endfunction call ale#linter#Define('vue', { \ 'name': 'vls', +\ 'aliases': ['vuels'], \ 'lsp': 'stdio', \ 'executable': {b -> ale#path#FindExecutable(b, 'vue_vls', [ \ 'node_modules/.bin/vls', diff --git a/sources_non_forked/ale/ale_linters/yaml/actionlint.vim b/sources_non_forked/ale/ale_linters/yaml/actionlint.vim index 1e2fda49..75fe3162 100644 --- a/sources_non_forked/ale/ale_linters/yaml/actionlint.vim +++ b/sources_non_forked/ale/ale_linters/yaml/actionlint.vim @@ -1,11 +1,47 @@ -" Author: bretello +" Author: Peter Benjamin +" Description: Linter for GitHub Workflows call ale#Set('yaml_actionlint_executable', 'actionlint') call ale#Set('yaml_actionlint_options', '') +function! ale_linters#yaml#actionlint#GetCommand(buffer) abort + let l:options = ale#Var(a:buffer, 'yaml_actionlint_options') + + if l:options !~# '-no-color' + let l:options .= ale#Pad('-no-color') + endif + + if l:options !~# '-oneline' + let l:options .= ale#Pad('-oneline') + endif + + return '%e' . ale#Pad(l:options) +endfunction + +function! ale_linters#yaml#actionlint#Handle(buffer, lines) abort + " Matches patterns line the following: + ".github/workflows/main.yml:19:0: could not parse as YAML: yaml: line 19: mapping values are not allowed in this context [yaml-syntax] + let l:pattern = '\v^.*:(\d+):(\d+): (.+) \[(.+)\]$' + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:pattern) + let l:item = { + \ 'lnum': l:match[1] + 0, + \ 'col': l:match[2] + 0, + \ 'text': l:match[3], + \ 'code': l:match[4], + \ 'type': 'E', + \} + + call add(l:output, l:item) + endfor + + return l:output +endfunction + call ale#linter#Define('yaml', { \ 'name': 'actionlint', \ 'executable': {b -> ale#Var(b, 'yaml_actionlint_executable')}, -\ 'command': function('ale#handlers#actionlint#GetCommand'), -\ 'callback': 'ale#handlers#actionlint#Handle', +\ 'command': function('ale_linters#yaml#actionlint#GetCommand'), +\ 'callback': 'ale_linters#yaml#actionlint#Handle', \}) diff --git a/sources_non_forked/ale/ale_linters/yaml/ls.vim b/sources_non_forked/ale/ale_linters/yaml/ls.vim index 8e3f6d00..79510ffe 100644 --- a/sources_non_forked/ale/ale_linters/yaml/ls.vim +++ b/sources_non_forked/ale/ale_linters/yaml/ls.vim @@ -26,6 +26,7 @@ endfunction call ale#linter#Define('yaml', { \ 'name': 'yaml-language-server', +\ 'aliases': ['yamlls'], \ 'lsp': 'stdio', \ 'executable': function('ale_linters#yaml#ls#GetExecutable'), \ 'command': function('ale_linters#yaml#ls#GetCommand'), diff --git a/sources_non_forked/ale/autoload/ale.vim b/sources_non_forked/ale/autoload/ale.vim index 23315913..d1c1112a 100644 --- a/sources_non_forked/ale/autoload/ale.vim +++ b/sources_non_forked/ale/autoload/ale.vim @@ -7,9 +7,6 @@ let g:ale_echo_msg_error_str = get(g:, 'ale_echo_msg_error_str', 'Error') let g:ale_echo_msg_info_str = get(g:, 'ale_echo_msg_info_str', 'Info') let g:ale_echo_msg_log_str = get(g:, 'ale_echo_msg_log_str', 'Log') let g:ale_echo_msg_warning_str = get(g:, 'ale_echo_msg_warning_str', 'Warning') -" Ignoring linters, for disabling some, or ignoring LSP diagnostics. -let g:ale_linters_ignore = get(g:, 'ale_linters_ignore', {}) -let g:ale_disable_lsp = get(g:, 'ale_disable_lsp', 0) " LSP window/showMessage format let g:ale_lsp_show_message_format = get(g:, 'ale_lsp_show_message_format', '%severity%:%linter%: %s') @@ -100,7 +97,24 @@ function! s:Lint(buffer, should_lint_file, timer_id) abort " Use the filetype from the buffer let l:filetype = getbufvar(a:buffer, '&filetype') let l:linters = ale#linter#Get(l:filetype) - let l:linters = ale#linter#RemoveIgnored(a:buffer, l:filetype, l:linters) + + let l:ignore_config = ale#Var(a:buffer, 'linters_ignore') + let l:disable_lsp = ale#Var(a:buffer, 'disable_lsp') + + " Load code to ignore linters only if we need to. + if ( + \ !empty(l:ignore_config) + \ || l:disable_lsp is 1 + \ || l:disable_lsp is v:true + \ || (l:disable_lsp is# 'auto' && get(g:, 'lspconfig', 0)) + \) + let l:linters = ale#engine#ignore#Exclude( + \ l:filetype, + \ l:linters, + \ l:ignore_config, + \ l:disable_lsp, + \) + endif " Tell other sources that they can start checking the buffer now. let g:ale_want_results_buffer = a:buffer @@ -208,7 +222,7 @@ endfunction " valid for cmd on Windows, or most shells on Unix. function! ale#Env(variable_name, value) abort if has('win32') - return 'set ' . a:variable_name . '=' . ale#Escape(a:value) . ' && ' + return 'set ' . ale#Escape(a:variable_name . '=' . a:value) . ' && ' endif return a:variable_name . '=' . ale#Escape(a:value) . ' ' diff --git a/sources_non_forked/ale/autoload/ale/code_action.vim b/sources_non_forked/ale/autoload/ale/code_action.vim index db31aad5..4167e907 100644 --- a/sources_non_forked/ale/autoload/ale/code_action.vim +++ b/sources_non_forked/ale/autoload/ale/code_action.vim @@ -339,17 +339,7 @@ function! ale#code_action#GetCodeActions(options) abort silent! aunmenu PopUp.Refactor\.\.\. " Only display the menu items if there's an LSP server. - let l:has_lsp = 0 - - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - let l:has_lsp = 1 - - break - endif - endfor - - if l:has_lsp + if len(ale#lsp_linter#GetEnabled(bufnr(''))) > 0 if !empty(expand('')) silent! anoremenu PopUp.Rename :ALERename endif diff --git a/sources_non_forked/ale/autoload/ale/codefix.vim b/sources_non_forked/ale/autoload/ale/codefix.vim index 34ce3e15..6eaadb23 100644 --- a/sources_non_forked/ale/autoload/ale/codefix.vim +++ b/sources_non_forked/ale/autoload/ale/codefix.vim @@ -473,15 +473,9 @@ function! ale#codefix#Execute(range, ...) abort endif let l:MenuCallback = get(a:000, 0, v:null) - let l:lsp_linters = [] + let l:linters = ale#lsp_linter#GetEnabled(bufnr('')) - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call add(l:lsp_linters, l:linter) - endif - endfor - - if empty(l:lsp_linters) + if empty(l:linters) if l:MenuCallback is v:null call s:message('No active LSPs') else @@ -491,7 +485,7 @@ function! ale#codefix#Execute(range, ...) abort return endif - for l:lsp_linter in l:lsp_linters - call s:ExecuteGetCodeFix(l:lsp_linter, a:range, l:MenuCallback) + for l:linter in l:linters + call s:ExecuteGetCodeFix(l:linter, a:range, l:MenuCallback) endfor endfunction diff --git a/sources_non_forked/ale/autoload/ale/completion.vim b/sources_non_forked/ale/autoload/ale/completion.vim index c05ca53d..4fd02721 100644 --- a/sources_non_forked/ale/autoload/ale/completion.vim +++ b/sources_non_forked/ale/autoload/ale/completion.vim @@ -824,6 +824,8 @@ endfunction " the current buffer. 1 will be returned if there's a potential source of " completion data ALE can use, and 0 will be returned otherwise. function! ale#completion#CanProvideCompletions() abort + " NOTE: We can report that ALE can provide completions to Deoplete from + " here, and we might ignore linters still below. for l:linter in ale#linter#Get(&filetype) if !empty(l:linter.lsp) return 1 @@ -890,11 +892,9 @@ function! ale#completion#GetCompletions(...) abort let l:started = 0 - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - if ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) - let l:started = 1 - endif + for l:linter in ale#lsp_linter#GetEnabled(l:buffer) + if ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) + let l:started = 1 endif endfor diff --git a/sources_non_forked/ale/autoload/ale/debugging.vim b/sources_non_forked/ale/autoload/ale/debugging.vim index c100d6e6..89f5258f 100644 --- a/sources_non_forked/ale/autoload/ale/debugging.vim +++ b/sources_non_forked/ale/autoload/ale/debugging.vim @@ -1,6 +1,8 @@ " Author: w0rp " Description: This file implements debugging information for ALE +let g:ale_info_default_mode = get(g:, 'ale_info_default_mode', 'preview') + let s:global_variable_list = [ \ 'ale_cache_executable_check_failures', \ 'ale_change_sign_column_color', @@ -18,6 +20,7 @@ let s:global_variable_list = [ \ 'ale_fix_on_save', \ 'ale_fixers', \ 'ale_history_enabled', +\ 'ale_info_default_mode', \ 'ale_history_log_output', \ 'ale_keep_list_window_open', \ 'ale_lint_delay', @@ -53,7 +56,6 @@ let s:global_variable_list = [ \ 'ale_sign_style_warning', \ 'ale_sign_warning', \ 'ale_sign_highlight_linenrs', -\ 'ale_statusline_format', \ 'ale_type_map', \ 'ale_use_neovim_diagnostics_api', \ 'ale_use_global_executables', @@ -199,11 +201,42 @@ function! s:EchoLSPErrorMessages(all_linter_names) abort endfor endfunction -function! ale#debugging#Info() abort +function! s:GetIgnoredLinters(buffer, enabled_linters) abort + let l:filetype = &filetype + let l:ignore_config = ale#Var(a:buffer, 'linters_ignore') + let l:disable_lsp = ale#Var(a:buffer, 'disable_lsp') + + if ( + \ !empty(l:ignore_config) + \ || l:disable_lsp is 1 + \ || l:disable_lsp is v:true + \ || (l:disable_lsp is# 'auto' && get(g:, 'lspconfig', 0)) + \) + let l:non_ignored = ale#engine#ignore#Exclude( + \ l:filetype, + \ a:enabled_linters, + \ l:ignore_config, + \ l:disable_lsp, + \) + else + let l:non_ignored = copy(a:enabled_linters) + endif + + call map(l:non_ignored, 'v:val.name') + + return filter( + \ copy(a:enabled_linters), + \ 'index(l:non_ignored, v:val.name) < 0' + \) +endfunction + +function! ale#debugging#Info(...) abort + let l:options = (a:0 > 0) ? a:1 : {} + let l:show_preview_info = get(l:options, 'preview') + let l:buffer = bufnr('') let l:filetype = &filetype - " We get the list of enabled linters for free by the above function. let l:enabled_linters = deepcopy(ale#linter#Get(l:filetype)) " But have to build the list of available linters ourselves. @@ -227,13 +260,10 @@ function! ale#debugging#Info() abort let l:fixers = uniq(sort(l:fixers[0] + l:fixers[1])) let l:fixers_string = join(map(copy(l:fixers), '"\n " . v:val'), '') - let l:non_ignored_names = map( - \ copy(ale#linter#RemoveIgnored(l:buffer, l:filetype, l:enabled_linters)), - \ 'v:val[''name'']', - \) - let l:ignored_names = filter( - \ copy(l:enabled_names), - \ 'index(l:non_ignored_names, v:val) < 0' + " Get the names of ignored linters. + let l:ignored_names = map( + \ s:GetIgnoredLinters(l:buffer, l:enabled_linters), + \ 'v:val.name' \) call s:Echo(' Current Filetype: ' . l:filetype) @@ -241,13 +271,31 @@ function! ale#debugging#Info() abort call s:EchoLinterAliases(l:all_linters) call s:Echo(' Enabled Linters: ' . string(l:enabled_names)) call s:Echo(' Ignored Linters: ' . string(l:ignored_names)) - call s:Echo(' Suggested Fixers: ' . l:fixers_string) - call s:Echo(' Linter Variables:') - call s:Echo('') - call s:EchoLinterVariables(l:variable_list) + call s:Echo(' Suggested Fixers:' . l:fixers_string) + " We use this line with only a space to know where to end highlights. + call s:Echo(' ') + + " Only show Linter Variables directive if there are any. + if !empty(l:variable_list) + call s:Echo(' Linter Variables:') + + if l:show_preview_info + call s:Echo('" Press Space to read :help for a setting') + endif + + call s:EchoLinterVariables(l:variable_list) + " We use this line with only a space to know where to end highlights. + call s:Echo(' ') + endif + call s:Echo(' Global Variables:') - call s:Echo('') + + if l:show_preview_info + call s:Echo('" Press Space to read :help for a setting') + endif + call s:EchoGlobalVariables() + call s:Echo(' ') call s:EchoLSPErrorMessages(l:all_names) call s:Echo(' Command History:') call s:Echo('') @@ -275,3 +323,41 @@ function! ale#debugging#InfoToFile(filename) abort call writefile(split(l:output, "\n"), l:expanded_filename) call s:Echo('ALEInfo written to ' . l:expanded_filename) endfunction + +function! ale#debugging#InfoToPreview() abort + let l:output = execute('call ale#debugging#Info({''preview'': 1})') + + call ale#preview#Show(split(l:output, "\n"), { + \ 'filetype': 'ale-info', + \}) +endfunction + +function! ale#debugging#InfoCommand(...) abort + if len(a:000) > 1 + " no-custom-checks + echom 'Invalid ALEInfo arguments!' + + return + endif + + " Get 'echo' from '-echo', if there's an argument. + let l:mode = get(a:000, '')[1:] + + if empty(l:mode) + let l:mode = ale#Var(bufnr(''), 'info_default_mode') + endif + + if l:mode is# 'echo' + call ale#debugging#Info() + elseif l:mode is# 'clip' || l:mode is# 'clipboard' + call ale#debugging#InfoToClipboard() + else + call ale#debugging#InfoToPreview() + endif +endfunction + +function! ale#debugging#InfoToClipboardDeprecatedCommand() abort + " no-custom-checks + echom 'ALEInfoToClipboard is deprecated. Use ALEInfo -clipboard instead.' + call ale#debugging#InfoToClipboard() +endfunction diff --git a/sources_non_forked/ale/autoload/ale/definition.vim b/sources_non_forked/ale/autoload/ale/definition.vim index fd6cd2e1..251bdcc5 100644 --- a/sources_non_forked/ale/autoload/ale/definition.vim +++ b/sources_non_forked/ale/autoload/ale/definition.vim @@ -168,26 +168,20 @@ function! s:GoToLSPDefinition(linter, options, capability) abort endfunction function! ale#definition#GoTo(options) abort - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call s:GoToLSPDefinition(l:linter, a:options, 'definition') - endif + for l:linter in ale#lsp_linter#GetEnabled(bufnr('')) + call s:GoToLSPDefinition(l:linter, a:options, 'definition') endfor endfunction function! ale#definition#GoToType(options) abort - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call s:GoToLSPDefinition(l:linter, a:options, 'typeDefinition') - endif + for l:linter in ale#lsp_linter#GetEnabled(bufnr('')) + call s:GoToLSPDefinition(l:linter, a:options, 'typeDefinition') endfor endfunction function! ale#definition#GoToImpl(options) abort - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call s:GoToLSPDefinition(l:linter, a:options, 'implementation') - endif + for l:linter in ale#lsp_linter#GetEnabled(bufnr('')) + call s:GoToLSPDefinition(l:linter, a:options, 'implementation') endfor endfunction diff --git a/sources_non_forked/ale/autoload/ale/engine.vim b/sources_non_forked/ale/autoload/ale/engine.vim index 185d54db..7e337191 100644 --- a/sources_non_forked/ale/autoload/ale/engine.vim +++ b/sources_non_forked/ale/autoload/ale/engine.vim @@ -253,7 +253,7 @@ function! ale#engine#SendResultsToNeovimDiagnostics(buffer, loclist) abort " Keep the Lua surface area really small in the VimL part of ALE, " and just require the diagnostics.lua module on demand. - let l:SendDiagnostics = luaeval('require("diagnostics").sendAleResultsToDiagnostics') + let l:SendDiagnostics = luaeval('require("ale.diagnostics").sendAleResultsToDiagnostics') call l:SendDiagnostics(a:buffer, a:loclist) endfunction diff --git a/sources_non_forked/ale/autoload/ale/engine/ignore.vim b/sources_non_forked/ale/autoload/ale/engine/ignore.vim index 80574656..8ac36eb5 100644 --- a/sources_non_forked/ale/autoload/ale/engine/ignore.vim +++ b/sources_non_forked/ale/autoload/ale/engine/ignore.vim @@ -1,6 +1,26 @@ " Author: w0rp " Description: Code for ignoring linters. Only loaded and if configured. +" A map for remapping lspconfig server names to linter names or aliases in +" ALE. We should change the names where they will conflict with names in ALE. +" +" Notes on names from nvim-lspconfig not included here. +" +" * 'rubocop' is run in a language server mode +" * 'eslint' is run via 'vscode-eslint-language-server' +let s:lspconfig_map = { +\ 'als': 'adals', +\ 'ansiblels': 'ansible-language-server', +\ 'bicep': 'bicep_language_server', +\ 'cmake': 'cmake_language_server', +\ 'denols': 'deno', +\ 'erlangls': 'erlang_ls', +\ 'html': 'vscodehtml', +\ 'ocamlls': 'ocaml-language-server', +\ 'ols': 'odin-lsp', +\ 'puppet': 'puppet_languageserver', +\} + " Given a filetype and a configuration for ignoring linters, return a List of " Strings for linter names to ignore. function! ale#engine#ignore#GetList(filetype, config) abort @@ -21,24 +41,51 @@ function! ale#engine#ignore#GetList(filetype, config) abort return [] endfunction +" This function can be mocked in tests. +function! ale#engine#ignore#GetLSPConfigNames() abort + return luaeval('require ''ale.util''.configured_lspconfig_servers()') +endfunction + +function! s:GetMappedLSPConfigNames() abort + " Check the lspconfig flag before calling luaeval. + if !get(g:, 'lspconfig', 0) + return [] + endif + + let l:lspconfig_servers = ale#engine#ignore#GetLSPConfigNames() + + return map( + \ !empty(l:lspconfig_servers) ? l:lspconfig_servers : [], + \ {_, val -> get(s:lspconfig_map, val, val) } + \) +endfunction + " Given a List of linter descriptions, exclude the linters to be ignored. function! ale#engine#ignore#Exclude(filetype, all_linters, config, disable_lsp) abort let l:names_to_remove = ale#engine#ignore#GetList(a:filetype, a:config) + + " If configured to automatically ignore otherwise configured LSP linter + " names, add them to the names to remove. This could ignore linters + " with matching names that are not marked as LSP linters. + if a:disable_lsp is# 'auto' + call extend(l:names_to_remove, s:GetMappedLSPConfigNames()) + endif + + let l:ignore_all_lsps = a:disable_lsp is 1 || a:disable_lsp is v:true let l:filtered_linters = [] for l:linter in a:all_linters - let l:name_list = [l:linter.name] + l:linter.aliases - let l:should_include = 1 + let l:should_include = index(l:names_to_remove, l:linter.name) == -1 + let l:i = 0 - for l:name in l:name_list - if index(l:names_to_remove, l:name) >= 0 - let l:should_include = 0 - break - endif - endfor + while l:should_include && l:i < len(l:linter.aliases) + let l:name = l:linter.aliases[l:i] + let l:should_include = index(l:names_to_remove, l:name) == -1 + let l:i += 1 + endwhile - if a:disable_lsp && has_key(l:linter, 'lsp') && l:linter.lsp isnot# '' - let l:should_include = 0 + if l:should_include && l:ignore_all_lsps + let l:should_include = empty(get(l:linter, 'lsp')) endif if l:should_include diff --git a/sources_non_forked/ale/autoload/ale/events.vim b/sources_non_forked/ale/autoload/ale/events.vim index eec24f46..d5cd5151 100644 --- a/sources_non_forked/ale/autoload/ale/events.vim +++ b/sources_non_forked/ale/autoload/ale/events.vim @@ -92,6 +92,62 @@ function! ale#events#FileChangedEvent(buffer) abort endif endfunction +" A timer for emulating InsertLeave. +" +" We only need a single timer, and we'll lint the last buffer we entered +" insert mode on. +if !exists('s:insert_leave_timer') + let s:insert_leave_timer = -1 +endif + +function! ale#events#EmulateInsertLeave(buffer) abort + if mode() is# 'n' + call timer_stop(s:insert_leave_timer) + call ale#Queue(0, '', a:buffer) + endif +endfunction + +function! ale#events#InsertEnterEvent(buffer) abort + if g:ale_close_preview_on_insert && exists('*ale#preview#CloseIfTypeMatches') + call ale#preview#CloseIfTypeMatches('ale-preview') + endif + + " Start a repeating timer if the use might not trigger InsertLeave, so we + " can emulate its behavior. + if ale#Var(a:buffer, 'lint_on_insert_leave') + \&& maparg("\", 'i') isnot# '' + call timer_stop(s:insert_leave_timer) + let s:insert_leave_timer = timer_start( + \ 100, + \ {-> ale#events#EmulateInsertLeave(a:buffer) }, + \ {'repeat': -1} + \) + endif +endfunction + +function! ale#events#InsertLeaveEvent(buffer) abort + if ale#Var(a:buffer, 'lint_on_insert_leave') + " Kill the InsertLeave emulation if the event fired. + call timer_stop(s:insert_leave_timer) + call ale#Queue(0) + endif + + " Look for a warning to echo as soon as we leave Insert mode. + " The script's position variable used when moving the cursor will + " not be changed here. + " + " We don't echo this message in emulated insert leave mode, as the user + " may want less work to happen on pressing versus + if exists('*ale#engine#Cleanup') + call ale#cursor#EchoCursorWarning() + + if g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor is# 1 || g:ale_virtualtext_cursor is# '1' + " Show a virtualtext message if enabled. + call ale#virtualtext#ShowCursorWarning() + endif + endif +endfunction + function! ale#events#Init() abort " This value used to be a Boolean as a Number, and is now a String. let l:text_changed = '' . g:ale_lint_on_text_changed @@ -127,33 +183,40 @@ function! ale#events#Init() abort \) endif - if g:ale_lint_on_insert_leave - autocmd InsertLeave * if ale#Var(str2nr(expand('')), 'lint_on_insert_leave') | call ale#Queue(0) | endif + " Add an InsertEnter event if we need to close the preview window + " on entering insert mode, or if we want to run ALE on leaving + " insert mode and is not the same as . + " + " We will emulate leaving insert mode for users that might not + " trigger InsertLeave. + if g:ale_close_preview_on_insert + \|| (g:ale_lint_on_insert_leave && maparg("\", 'i') isnot# '') + autocmd InsertEnter * call ale#events#InsertEnterEvent(str2nr(expand(''))) endif + let l:add_insert_leave_event = g:ale_lint_on_insert_leave + if g:ale_echo_cursor || g:ale_cursor_detail + " We need to make the message display on InsertLeave + let l:add_insert_leave_event = 1 + autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarningWithDelay() | endif - " Look for a warning to echo as soon as we leave Insert mode. - " The script's position variable used when moving the cursor will - " not be changed here. - autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#cursor#EchoCursorWarning() | endif endif if g:ale_virtualtext_cursor is# 'current' || g:ale_virtualtext_cursor is# 1 || g:ale_virtualtext_cursor is# '1' + " We need to make the message display on InsertLeave + let l:add_insert_leave_event = 1 + autocmd CursorMoved,CursorHold * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarningWithDelay() | endif - " Look for a warning to echo as soon as we leave Insert mode. - " The script's position variable used when moving the cursor will - " not be changed here. - autocmd InsertLeave * if exists('*ale#engine#Cleanup') | call ale#virtualtext#ShowCursorWarning() | endif + endif + + if l:add_insert_leave_event + autocmd InsertLeave * call ale#events#InsertLeaveEvent(str2nr(expand(''))) endif if g:ale_hover_cursor autocmd CursorHold * if exists('*ale#lsp#Send') | call ale#hover#ShowTruncatedMessageAtCursor() | endif endif - - if g:ale_close_preview_on_insert - autocmd InsertEnter * if exists('*ale#preview#CloseIfTypeMatches') | call ale#preview#CloseIfTypeMatches('ale-preview') | endif - endif endif augroup END diff --git a/sources_non_forked/ale/autoload/ale/filerename.vim b/sources_non_forked/ale/autoload/ale/filerename.vim index ec20d279..93cf78e1 100644 --- a/sources_non_forked/ale/autoload/ale/filerename.vim +++ b/sources_non_forked/ale/autoload/ale/filerename.vim @@ -94,9 +94,10 @@ function! s:ExecuteFileRename(linter, options) abort endfunction function! ale#filerename#Execute() abort + let l:buffer = bufnr('') let l:lsp_linters = [] - for l:linter in ale#linter#Get(&filetype) + for l:linter in ale#lsp_linter#GetEnabled(l:buffer) if l:linter.lsp is# 'tsserver' call add(l:lsp_linters, l:linter) endif @@ -108,7 +109,6 @@ function! ale#filerename#Execute() abort return endif - let l:buffer = bufnr('') let l:old_name = expand('#' . l:buffer . ':p') let l:new_name = ale#util#Input('New file name: ', l:old_name, 'file') diff --git a/sources_non_forked/ale/autoload/ale/fix.vim b/sources_non_forked/ale/autoload/ale/fix.vim index d9820847..786978d1 100644 --- a/sources_non_forked/ale/autoload/ale/fix.vim +++ b/sources_non_forked/ale/autoload/ale/fix.vim @@ -32,7 +32,7 @@ function! ale#fix#ApplyQueuedFixes(buffer) abort endif endif endif - catch /E21/ + catch /E21\|E5555/ " If we cannot modify the buffer now, try again later. let g:ale_fix_buffer_data[a:buffer] = l:data diff --git a/sources_non_forked/ale/autoload/ale/fix/registry.vim b/sources_non_forked/ale/autoload/ale/fix/registry.vim index d2de0fc2..050cc6c7 100644 --- a/sources_non_forked/ale/autoload/ale/fix/registry.vim +++ b/sources_non_forked/ale/autoload/ale/fix/registry.vim @@ -286,6 +286,11 @@ let s:default_registry = { \ 'suggested_filetypes': ['fish'], \ 'description': 'Format fish scripts using fish_indent.', \ }, +\ 'forge': { +\ 'function': 'ale#fixers#forge#Fix', +\ 'suggested_filetypes': ['solidity'], +\ 'description': 'Fix Solidity files with forge fmt.', +\ }, \ 'gofmt': { \ 'function': 'ale#fixers#gofmt#Fix', \ 'suggested_filetypes': ['go'], @@ -606,6 +611,11 @@ let s:default_registry = { \ 'suggested_filetypes': ['python'], \ 'description': 'Fix python files with ruff.', \ }, +\ 'ruff_format': { +\ 'function': 'ale#fixers#ruff_format#Fix', +\ 'suggested_filetypes': ['python'], +\ 'description': 'Fix python files with the ruff formatter.', +\ }, \ 'pycln': { \ 'function': 'ale#fixers#pycln#Fix', \ 'suggested_filetypes': ['python'], @@ -625,7 +635,12 @@ let s:default_registry = { \ 'function': 'ale#fixers#erbformatter#Fix', \ 'suggested_filetypes': ['eruby'], \ 'description': 'Apply erb-formatter -w to eruby/erb files.', -\ } +\ }, +\ 'nickel_format': { +\ 'function': 'ale#fixers#nickel_format#Fix', +\ 'suggested_filetypes': ['nickel'], +\ 'description': 'Fix nickel files with nickel format', +\ }, \} " Reset the function registry to the default entries. diff --git a/sources_non_forked/ale/autoload/ale/fixers/forge.vim b/sources_non_forked/ale/autoload/ale/fixers/forge.vim new file mode 100644 index 00000000..2efbb7da --- /dev/null +++ b/sources_non_forked/ale/autoload/ale/fixers/forge.vim @@ -0,0 +1,11 @@ +call ale#Set('solidity_forge_executable', 'forge') + +function! ale#fixers#forge#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'solidity_forge_executable') + + return { + \ 'command': ale#Escape(l:executable) + \ . ' fmt %t', + \ 'read_temporary_file': 1, + \} +endfunction diff --git a/sources_non_forked/ale/autoload/ale/fixers/nickel_format.vim b/sources_non_forked/ale/autoload/ale/fixers/nickel_format.vim new file mode 100644 index 00000000..07eed8f9 --- /dev/null +++ b/sources_non_forked/ale/autoload/ale/fixers/nickel_format.vim @@ -0,0 +1,16 @@ +" Author: Yining +" Description: nickel format as ALE fixer for Nickel files + +call ale#Set('nickel_nickel_format_executable', 'nickel') +call ale#Set('nickel_nickel_format_options', '') + +function! ale#fixers#nickel_format#Fix(buffer) abort + let l:executable = ale#Var(a:buffer, 'nickel_nickel_format_executable') + let l:options = ale#Var(a:buffer, 'nickel_nickel_format_options') + + return { + \ 'command': ale#Escape(l:executable) . ' format' + \ . (empty(l:options) ? '' : ' ' . l:options) + \} +endfunction + diff --git a/sources_non_forked/ale/autoload/ale/fixers/ruff_format.vim b/sources_non_forked/ale/autoload/ale/fixers/ruff_format.vim new file mode 100644 index 00000000..86858745 --- /dev/null +++ b/sources_non_forked/ale/autoload/ale/fixers/ruff_format.vim @@ -0,0 +1,72 @@ +" Author: Yining , Joseph Henrich +" Description: ruff formatter as ALE fixer for python files + +call ale#Set('python_ruff_format_executable', 'ruff') +call ale#Set('python_ruff_format_options', '') +call ale#Set('python_ruff_format_use_global', get(g:, 'ale_use_global_executables', 0)) +call ale#Set('python_ruff_format_change_directory', 1) +call ale#Set('python_ruff_format_auto_pipenv', 0) +call ale#Set('python_ruff_format_auto_poetry', 0) + +function! ale#fixers#ruff_format#GetCwd(buffer) abort + if ale#Var(a:buffer, 'python_ruff_format_change_directory') + " Run from project root if found, else from buffer dir. + let l:project_root = ale#python#FindProjectRoot(a:buffer) + + return !empty(l:project_root) ? l:project_root : '%s:h' + endif + + return '%s:h' +endfunction + +function! ale#fixers#ruff_format#GetExecutable(buffer) abort + if (ale#Var(a:buffer, 'python_auto_pipenv') || ale#Var(a:buffer, 'python_ruff_format_auto_pipenv')) + \ && ale#python#PipenvPresent(a:buffer) + return 'pipenv' + endif + + if (ale#Var(a:buffer, 'python_auto_poetry') || ale#Var(a:buffer, 'python_ruff_format_auto_poetry')) + \ && ale#python#PoetryPresent(a:buffer) + return 'poetry' + endif + + return ale#python#FindExecutable(a:buffer, 'python_ruff_format', ['ruff']) +endfunction + +function! ale#fixers#ruff_format#GetCommand(buffer) abort + let l:executable = ale#fixers#ruff_format#GetExecutable(a:buffer) + let l:exec_args = l:executable =~? 'pipenv\|poetry$' + \ ? ' run ruff' + \ : '' + + return ale#Escape(l:executable) . l:exec_args +endfunction + +function! ale#fixers#ruff_format#Fix(buffer) abort + let l:executable = ale#fixers#ruff_format#GetExecutable(a:buffer) + let l:cmd = [ale#Escape(l:executable)] + + if l:executable =~? 'pipenv\|poetry$' + call extend(l:cmd, ['run', 'ruff']) + endif + + let l:options = ale#Var(a:buffer, 'python_ruff_format_options') + + " when --stdin-filename present, ruff will use it for proj root resolution + " https://github.com/charliermarsh/ruff/pull/1281 + let l:fname = expand('#' . a:buffer . '...') + call add(l:cmd, 'format') + + if !empty(l:options) + call add(l:cmd, l:options) + endif + + call add(l:cmd, '--stdin-filename '.ale#Escape(ale#path#Simplify(l:fname))) + + call add(l:cmd, '-') + + return { + \ 'cwd': ale#fixers#ruff_format#GetCwd(a:buffer), + \ 'command': join(l:cmd, ' '), + \} +endfunction diff --git a/sources_non_forked/ale/autoload/ale/handlers/actionlint.vim b/sources_non_forked/ale/autoload/ale/handlers/actionlint.vim deleted file mode 100644 index 73843c08..00000000 --- a/sources_non_forked/ale/autoload/ale/handlers/actionlint.vim +++ /dev/null @@ -1,36 +0,0 @@ -function! ale#handlers#actionlint#GetCommand(buffer) abort - let l:options = ale#Var(a:buffer, 'yaml_actionlint_options') - - " automatically add --no-color option if not defined - if l:options !~# '--no-color' - let l:options .= ' --no-color' - endif - - " automatically add --oneline option if not defined - if l:options !~# '--oneline' - let l:options .= ' --oneline' - endif - - return '%e ' . l:options . ' %t' -endfunction - -function! ale#handlers#actionlint#Handle(buffer, lines) abort - " Matches patterns line the following: - ".github/workflows/main.yml:19:0: could not parse as YAML: yaml: line 19: mapping values are not allowed in this context [yaml-syntax] - let l:pattern = '\v^.*:(\d+):(\d+): (.+) \[(.+)\]$' - let l:output = [] - - for l:match in ale#util#GetMatches(a:lines, l:pattern) - let l:item = { - \ 'lnum': l:match[1] + 0, - \ 'col': l:match[2] + 0, - \ 'text': l:match[3], - \ 'code': l:match[4], - \ 'type': 'E', - \} - - call add(l:output, l:item) - endfor - - return l:output -endfunction diff --git a/sources_non_forked/ale/autoload/ale/handlers/cairo.vim b/sources_non_forked/ale/autoload/ale/handlers/cairo.vim new file mode 100644 index 00000000..41029c8d --- /dev/null +++ b/sources_non_forked/ale/autoload/ale/handlers/cairo.vim @@ -0,0 +1,41 @@ +" Author: 0xhyoga <0xhyoga@gmx.com>, +" Description: This file implements handlers specific to Cairo +" +function! ale#handlers#cairo#HandleCairoErrors(buffer, lines) abort + " Matches patterns like the following: + " Error: Expected ';' but got '(' + " --> /path/to/file/file.cairo:1:10:) + let l:pattern = '\v(error|warning): (.*)$' + let l:line_and_column_pattern = '\v\.cairo:(\d+):(\d+)' + let l:exclude_pattern = '\vcould not compile.*' + let l:output = [] + + for l:line in a:lines + let l:match = matchlist(l:line, l:pattern) + + if len(l:match) == 0 + let l:match = matchlist(l:line, l:line_and_column_pattern) + + if len(l:match) > 0 + let l:index = len(l:output) - 1 + let l:output[l:index]['lnum'] = l:match[1] + 0 + let l:output[l:index]['col'] = l:match[2] + 0 + endif + else + let l:text = l:match[2] + + if l:text !~# l:exclude_pattern + let l:isError = l:match[1] is? 'Error' + + call add(l:output, { + \ 'lnum': 0, + \ 'col': 0, + \ 'text': l:text, + \ 'type': l:isError ? 'E' : 'W', + \}) + endif + endif + endfor + + return l:output +endfunction diff --git a/sources_non_forked/ale/autoload/ale/handlers/deno.vim b/sources_non_forked/ale/autoload/ale/handlers/deno.vim index b762f983..1770559d 100644 --- a/sources_non_forked/ale/autoload/ale/handlers/deno.vim +++ b/sources_non_forked/ale/autoload/ale/handlers/deno.vim @@ -4,7 +4,7 @@ call ale#Set('deno_executable', 'deno') call ale#Set('deno_unstable', 0) -call ale#Set('deno_importMap', 'import_map.json') +call ale#Set('deno_import_map', 'import_map.json') call ale#Set('deno_lsp_project_root', '') function! ale#handlers#deno#GetExecutable(buffer) abort @@ -68,8 +68,19 @@ function! ale#handlers#deno#GetInitializationOptions(buffer) abort let l:options.unstable = v:true endif - if ale#Var(a:buffer, 'deno_importMap') isnot# '' - let l:options.importMap = ale#path#FindNearestFile(a:buffer, ale#Var(a:buffer, 'deno_importMap')) + " Look for a value set using the historical option name. + let l:import_map = getbufvar( + \ a:buffer, + \ 'ale_deno_importMap', + \ get(g:, 'ale_deno_importMap', '') + \) + + if empty(l:import_map) + let l:import_map = ale#Var(a:buffer, 'deno_import_map') + endif + + if !empty(l:import_map) + let l:options.importMap = ale#path#FindNearestFile(a:buffer, l:import_map) endif return l:options diff --git a/sources_non_forked/ale/autoload/ale/handlers/hdl_checker.vim b/sources_non_forked/ale/autoload/ale/handlers/hdl_checker.vim index e871b083..d45f86e1 100644 --- a/sources_non_forked/ale/autoload/ale/handlers/hdl_checker.vim +++ b/sources_non_forked/ale/autoload/ale/handlers/hdl_checker.vim @@ -61,7 +61,8 @@ endfunction " Define the hdl_checker linter for a given filetype. function! ale#handlers#hdl_checker#DefineLinter(filetype) abort call ale#linter#Define(a:filetype, { - \ 'name': 'hdl-checker', + \ 'name': 'hdl_checker', + \ 'aliases': ['hdl-checker'], \ 'lsp': 'stdio', \ 'language': a:filetype, \ 'executable': function('ale#handlers#hdl_checker#GetExecutable'), @@ -70,4 +71,3 @@ function! ale#handlers#hdl_checker#DefineLinter(filetype) abort \ 'initialization_options': function('ale#handlers#hdl_checker#GetInitOptions'), \ }) endfunction - diff --git a/sources_non_forked/ale/autoload/ale/handlers/shellcheck.vim b/sources_non_forked/ale/autoload/ale/handlers/shellcheck.vim index 17de2912..fd540e8e 100644 --- a/sources_non_forked/ale/autoload/ale/handlers/shellcheck.vim +++ b/sources_non_forked/ale/autoload/ale/handlers/shellcheck.vim @@ -102,7 +102,7 @@ function! ale#handlers#shellcheck#DefineLinter(filetype) abort " This global variable can be set with a string of comma-separated error " codes to exclude from shellcheck. For example: " let g:ale_sh_shellcheck_exclusions = 'SC2002,SC2004' - call ale#Set('sh_shellcheck_exclusions', get(g:, 'ale_linters_sh_shellcheck_exclusions', '')) + call ale#Set('sh_shellcheck_exclusions', '') call ale#Set('sh_shellcheck_executable', 'shellcheck') call ale#Set('sh_shellcheck_dialect', 'auto') call ale#Set('sh_shellcheck_options', '') diff --git a/sources_non_forked/ale/autoload/ale/handlers/solhint.vim b/sources_non_forked/ale/autoload/ale/handlers/solhint.vim deleted file mode 100644 index 611aa7bd..00000000 --- a/sources_non_forked/ale/autoload/ale/handlers/solhint.vim +++ /dev/null @@ -1,98 +0,0 @@ -" Author: Henrique Barcelos <@hbarcelos> -" Description: Functions for working with local solhint for checking *.sol files. - -let s:executables = [ -\ 'node_modules/.bin/solhint', -\ 'node_modules/solhint/solhint.js', -\ 'solhint', -\] - -let s:sep = has('win32') ? '\' : '/' - -call ale#Set('solidity_solhint_options', '') -call ale#Set('solidity_solhint_executable', 'solhint') -call ale#Set('solidity_solhint_use_global', get(g:, 'ale_use_global_executables', 0)) - -function! ale#handlers#solhint#Handle(buffer, lines) abort - " Matches patterns like the following: - " /path/to/file/file.sol: line 1, col 10, Error - 'addOne' is defined but never used. (no-unused-vars) - let l:output = [] - - let l:lint_pattern = '\v^[^:]+: line (\d+), col (\d+), (Error|Warning) - (.*) \((.*)\)$' - - for l:match in ale#util#GetMatches(a:lines, l:lint_pattern) - let l:isError = l:match[3] is? 'error' - call add(l:output, { - \ 'lnum': l:match[1] + 0, - \ 'col': l:match[2] + 0, - \ 'text': l:match[4], - \ 'code': l:match[5], - \ 'type': l:isError ? 'E' : 'W', - \}) - endfor - - let l:syntax_pattern = '\v^[^:]+: line (\d+), col (\d+), (Error|Warning) - (Parse error): (.*)$' - - for l:match in ale#util#GetMatches(a:lines, l:syntax_pattern) - let l:isError = l:match[3] is? 'error' - call add(l:output, { - \ 'lnum': l:match[1] + 0, - \ 'col': l:match[2] + 0, - \ 'text': l:match[5], - \ 'code': l:match[4], - \ 'type': l:isError ? 'E' : 'W', - \}) - endfor - - return l:output -endfunction - -function! ale#handlers#solhint#FindConfig(buffer) abort - for l:path in ale#path#Upwards(expand('#' . a:buffer . ':p:h')) - for l:basename in [ - \ '.solhintrc.js', - \ '.solhintrc.json', - \ '.solhintrc', - \] - let l:config = ale#path#Simplify(join([l:path, l:basename], s:sep)) - - if filereadable(l:config) - return l:config - endif - endfor - endfor - - return ale#path#FindNearestFile(a:buffer, 'package.json') -endfunction - -function! ale#handlers#solhint#GetExecutable(buffer) abort - return ale#path#FindExecutable(a:buffer, 'solidity_solhint', s:executables) -endfunction - -" Given a buffer, return an appropriate working directory for solhint. -function! ale#handlers#solhint#GetCwd(buffer) abort - " If solhint is installed in a directory which contains the buffer, assume - " it is the solhint project root. Otherwise, use nearest node_modules. - " Note: If node_modules not present yet, can't load local deps anyway. - let l:executable = ale#path#FindNearestExecutable(a:buffer, s:executables) - - if !empty(l:executable) - let l:nmi = strridx(l:executable, 'node_modules') - let l:project_dir = l:executable[0:l:nmi - 2] - else - let l:modules_dir = ale#path#FindNearestDirectory(a:buffer, 'node_modules') - let l:project_dir = !empty(l:modules_dir) ? fnamemodify(l:modules_dir, ':h:h') : '' - endif - - return !empty(l:project_dir) ? l:project_dir : '' -endfunction - -function! ale#handlers#solhint#GetCommand(buffer) abort - let l:executable = ale#handlers#solhint#GetExecutable(a:buffer) - - let l:options = ale#Var(a:buffer, 'solidity_solhint_options') - - return ale#node#Executable(a:buffer, l:executable) - \ . (!empty(l:options) ? ' ' . l:options : '') - \ . ' --formatter compact %s' -endfunction diff --git a/sources_non_forked/ale/autoload/ale/hover.vim b/sources_non_forked/ale/autoload/ale/hover.vim index 6ad43316..1202e08e 100644 --- a/sources_non_forked/ale/autoload/ale/hover.vim +++ b/sources_non_forked/ale/autoload/ale/hover.vim @@ -117,7 +117,7 @@ function! ale#hover#ParseLSPResult(contents) abort for l:line in split(l:item, "\n") if l:fence_language is v:null " Look for the start of a code fence. (```python, etc.) - let l:match = matchlist(l:line, '^```\(.*\)$') + let l:match = matchlist(l:line, '^``` *\([^ ]\+\) *$') if !empty(l:match) let l:fence_language = l:match[1] @@ -329,10 +329,9 @@ function! ale#hover#Show(buffer, line, col, opt) abort let l:show_documentation = get(a:opt, 'show_documentation', 0) let l:Callback = function('s:OnReady', [a:line, a:col, a:opt]) - for l:linter in ale#linter#Get(getbufvar(a:buffer, '&filetype')) + for l:linter in ale#lsp_linter#GetEnabled(a:buffer) " Only tsserver supports documentation requests at the moment. - if !empty(l:linter.lsp) - \&& (!l:show_documentation || l:linter.lsp is# 'tsserver') + if !l:show_documentation || l:linter.lsp is# 'tsserver' call ale#lsp_linter#StartLSP(a:buffer, l:linter, l:Callback) endif endfor diff --git a/sources_non_forked/ale/autoload/ale/linter.vim b/sources_non_forked/ale/autoload/ale/linter.vim index b5a32654..20104fbc 100644 --- a/sources_non_forked/ale/autoload/ale/linter.vim +++ b/sources_non_forked/ale/autoload/ale/linter.vim @@ -53,7 +53,7 @@ let s:default_ale_linters = { \ 'perl': ['perlcritic'], \ 'perl6': [], \ 'python': ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'], -\ 'rust': ['cargo', 'rls'], +\ 'rust': ['analyzer', 'cargo'], \ 'spec': [], \ 'text': [], \ 'vader': ['vimls'], @@ -417,16 +417,6 @@ function! ale#linter#Get(original_filetypes) abort return reverse(l:combined_linters) endfunction -function! ale#linter#RemoveIgnored(buffer, filetype, linters) abort - " Apply ignore lists for linters only if needed. - let l:ignore_config = ale#Var(a:buffer, 'linters_ignore') - let l:disable_lsp = ale#Var(a:buffer, 'disable_lsp') - - return !empty(l:ignore_config) || l:disable_lsp - \ ? ale#engine#ignore#Exclude(a:filetype, a:linters, l:ignore_config, l:disable_lsp) - \ : a:linters -endfunction - " Given a buffer and linter, get the executable String for the linter. function! ale#linter#GetExecutable(buffer, linter) abort let l:Executable = a:linter.executable diff --git a/sources_non_forked/ale/autoload/ale/lsp/reset.vim b/sources_non_forked/ale/autoload/ale/lsp/reset.vim index 2fc7f0a2..1801db01 100644 --- a/sources_non_forked/ale/autoload/ale/lsp/reset.vim +++ b/sources_non_forked/ale/autoload/ale/lsp/reset.vim @@ -1,9 +1,16 @@ +" Author: w0rp +" Description: Functions for resetting LSP servers. + +function! s:Message(message) abort + call ale#util#Execute('echom ' . string(a:message)) +endfunction + " Stop all LSPs and remove all of the data for them. function! ale#lsp#reset#StopAllLSPs() abort call ale#lsp#StopAll() if exists('*ale#definition#ClearLSPData') - " Clear the mapping for connections, etc. + " Clear the go to definition mapping for everything. call ale#definition#ClearLSPData() endif @@ -15,6 +22,8 @@ function! ale#lsp#reset#StopAllLSPs() abort for l:buffer_string in keys(g:ale_buffer_info) let l:buffer = str2nr(l:buffer_string) + " Non-ignored and disabled linters are included here so we can + " clear results for them after we ignore or disable them. for l:linter in ale#linter#Get(getbufvar(l:buffer, '&filetype')) if !empty(l:linter.lsp) call ale#engine#HandleLoclist(l:linter.name, l:buffer, [], 0) @@ -23,3 +32,61 @@ function! ale#lsp#reset#StopAllLSPs() abort endfor endif endfunction + +function! ale#lsp#reset#Complete(arg, line, pos) abort + let l:linter_map = ale#lsp_linter#GetLSPLinterMap() + let l:candidates = map(values(l:linter_map), {_, linter -> linter.name}) + call uniq(sort(l:candidates)) + call filter(l:candidates, {_, name -> name =~? a:arg}) + + return l:candidates +endfunction + +function! ale#lsp#reset#StopLSP(name, bang) abort + let l:linter_map = ale#lsp_linter#GetLSPLinterMap() + let l:matched = filter( + \ items(l:linter_map), + \ {_, item -> item[1].name is# a:name} + \) + + if empty(l:matched) + if a:bang isnot# '!' + call s:Message('No running language server with name: ' . a:name) + endif + + return + endif + + " Stop LSP connections first. + for [l:conn_id, l:linter] in l:matched + call ale#lsp#Stop(l:conn_id) + endfor + + if exists('*ale#definition#ClearLSPData') + " Clear the go to definition mapping for everything. + call ale#definition#ClearLSPData() + endif + + " Remove connections from the lsp_linter map. + for [l:conn_id, l:linter] in l:matched + call remove(l:linter_map, l:conn_id) + endfor + + " Remove the problems for the LSP linters in every buffer. + for [l:buffer_string, l:info] in items(g:ale_buffer_info) + let l:buffer = str2nr(l:buffer_string) + let l:should_clear_buffer = 0 + + for l:item in l:info.loclist + if l:item.linter_name is# a:name + let l:should_clear_buffer = 1 + + break + endif + endfor + + if l:should_clear_buffer + call ale#engine#HandleLoclist(a:name, l:buffer, [], 0) + endif + endfor +endfunction diff --git a/sources_non_forked/ale/autoload/ale/lsp_linter.vim b/sources_non_forked/ale/autoload/ale/lsp_linter.vim index 1c98d628..2507e400 100644 --- a/sources_non_forked/ale/autoload/ale/lsp_linter.vim +++ b/sources_non_forked/ale/autoload/ale/lsp_linter.vim @@ -8,13 +8,9 @@ if !has_key(s:, 'lsp_linter_map') let s:lsp_linter_map = {} endif -" A Dictionary to track one-shot handlers for custom LSP requests -let s:custom_handlers_map = get(s:, 'custom_handlers_map', {}) - " Clear LSP linter data for the linting engine. function! ale#lsp_linter#ClearLSPData() abort let s:lsp_linter_map = {} - let s:custom_handlers_map = {} endfunction " Only for internal use. @@ -27,28 +23,67 @@ function! ale#lsp_linter#SetLSPLinterMap(replacement_map) abort let s:lsp_linter_map = a:replacement_map endfunction -" Check if diagnostics for a particular linter should be ignored. -function! s:ShouldIgnore(buffer, linter_name) abort - " Ignore all diagnostics if LSP integration is disabled. - if ale#Var(a:buffer, 'disable_lsp') - return 1 - endif - - let l:config = ale#Var(a:buffer, 'linters_ignore') - - " Don't load code for ignoring diagnostics if there's nothing to ignore. - if empty(l:config) - return 0 - endif - +" Get all enabled LSP linters. +" This list still includes linters ignored with `ale_linters_ignore`. +" +" `ale_linters_ignore` is designed to allow language servers to be used for +" their functionality while ignoring the diagnostics they return. +function! ale#lsp_linter#GetEnabled(buffer) abort let l:filetype = getbufvar(a:buffer, '&filetype') - let l:ignore_list = ale#engine#ignore#GetList(l:filetype, l:config) + " Only LSP linters are included here. + let l:linters = filter(ale#linter#Get(l:filetype), '!empty(v:val.lsp)') + let l:disable_lsp = ale#Var(a:buffer, 'disable_lsp') - return index(l:ignore_list, a:linter_name) >= 0 + " Only load code for ignoring linters if we need it. + if ( + \ l:disable_lsp is 1 + \ || l:disable_lsp is v:true + \ || (l:disable_lsp is# 'auto' && get(g:, 'lspconfig', 0)) + \) + let l:linters = ale#engine#ignore#Exclude( + \ l:filetype, + \ l:linters, + \ [], + \ l:disable_lsp, + \) + endif + + return l:linters +endfunction + +" Check if diagnostics for a particular linter should be ignored. +function! s:ShouldIgnoreDiagnostics(buffer, linter) abort + let l:config = ale#Var(a:buffer, 'linters_ignore') + let l:disable_lsp = ale#Var(a:buffer, 'disable_lsp') + + " Only load code for ignoring linters if we need it. + if ( + \ !empty(l:config) + \ || l:disable_lsp is 1 + \ || l:disable_lsp is v:true + \ || (l:disable_lsp is# 'auto' && get(g:, 'lspconfig', 0)) + \) + " Re-use the ignore implementation just for this linter. + return empty( + \ ale#engine#ignore#Exclude( + \ getbufvar(a:buffer, '&filetype'), + \ [a:linter], + \ l:config, + \ l:disable_lsp, + \ ) + \) + endif + + return 0 endfunction function! s:HandleLSPDiagnostics(conn_id, response) abort - let l:linter_name = s:lsp_linter_map[a:conn_id] + let l:linter = get(s:lsp_linter_map, a:conn_id) + + if empty(l:linter) + return + endif + let l:filename = ale#util#ToResource(a:response.params.uri) let l:escaped_name = escape( \ fnameescape(l:filename), @@ -61,17 +96,22 @@ function! s:HandleLSPDiagnostics(conn_id, response) abort return endif - if s:ShouldIgnore(l:buffer, l:linter_name) + if s:ShouldIgnoreDiagnostics(l:buffer, l:linter) return endif let l:loclist = ale#lsp#response#ReadDiagnostics(a:response) - call ale#engine#HandleLoclist(l:linter_name, l:buffer, l:loclist, 0) + call ale#engine#HandleLoclist(l:linter.name, l:buffer, l:loclist, 0) endfunction function! s:HandleTSServerDiagnostics(response, error_type) abort - let l:linter_name = 'tsserver' + " Re-create a fake linter object for tsserver. + let l:linter = { + \ 'name': 'tsserver', + \ 'aliases': [], + \ 'lsp': 'tsserver', + \} let l:escaped_name = escape( \ fnameescape(a:response.body.file), \ has('win32') ? '^' : '^,}]' @@ -83,9 +123,9 @@ function! s:HandleTSServerDiagnostics(response, error_type) abort return endif - call ale#engine#MarkLinterInactive(l:info, l:linter_name) + call ale#engine#MarkLinterInactive(l:info, l:linter.name) - if s:ShouldIgnore(l:buffer, l:linter_name) + if s:ShouldIgnoreDiagnostics(l:buffer, l:linter) return endif @@ -123,15 +163,15 @@ function! s:HandleTSServerDiagnostics(response, error_type) abort \ + get(l:info, 'suggestion_loclist', []) \ + get(l:info, 'syntax_loclist', []) - call ale#engine#HandleLoclist(l:linter_name, l:buffer, l:loclist, 0) + call ale#engine#HandleLoclist(l:linter.name, l:buffer, l:loclist, 0) endfunction -function! s:HandleLSPErrorMessage(linter_name, response) abort +function! s:HandleLSPErrorMessage(linter, response) abort if !g:ale_history_enabled || !g:ale_history_log_output return endif - if empty(a:linter_name) + if empty(a:linter) return endif @@ -141,7 +181,7 @@ function! s:HandleLSPErrorMessage(linter_name, response) abort return endif - call ale#lsp_linter#AddErrorMessage(a:linter_name, l:message) + call ale#lsp_linter#AddErrorMessage(a:linter.name, l:message) endfunction function! ale#lsp_linter#AddErrorMessage(linter_name, message) abort @@ -160,14 +200,14 @@ function! ale#lsp_linter#HandleLSPResponse(conn_id, response) abort let l:method = get(a:response, 'method', '') if get(a:response, 'jsonrpc', '') is# '2.0' && has_key(a:response, 'error') - let l:linter_name = get(s:lsp_linter_map, a:conn_id, '') + let l:linter = get(s:lsp_linter_map, a:conn_id, {}) - call s:HandleLSPErrorMessage(l:linter_name, a:response) + call s:HandleLSPErrorMessage(l:linter, a:response) elseif l:method is# 'textDocument/publishDiagnostics' call s:HandleLSPDiagnostics(a:conn_id, a:response) elseif l:method is# 'window/showMessage' call ale#lsp_window#HandleShowMessage( - \ s:lsp_linter_map[a:conn_id], + \ s:lsp_linter_map[a:conn_id].name, \ g:ale_lsp_show_message_format, \ a:response.params \) @@ -221,11 +261,7 @@ function! ale#lsp_linter#GetConfig(buffer, linter) abort endfunction function! ale#lsp_linter#FindProjectRoot(buffer, linter) abort - let l:buffer_ale_root = getbufvar( - \ a:buffer, - \ 'ale_root', - \ getbufvar(a:buffer, 'ale_lsp_root', {}) - \) + let l:buffer_ale_root = getbufvar(a:buffer, 'ale_root', {}) if type(l:buffer_ale_root) is v:t_string return l:buffer_ale_root @@ -242,15 +278,9 @@ function! ale#lsp_linter#FindProjectRoot(buffer, linter) abort endif endif - let l:global_root = g:ale_root - - if empty(g:ale_root) && exists('g:ale_lsp_root') - let l:global_root = g:ale_lsp_root - endif - " Try to get a global setting for the root - if has_key(l:global_root, a:linter.name) - let l:Root = l:global_root[a:linter.name] + if has_key(g:ale_root, a:linter.name) + let l:Root = g:ale_root[a:linter.name] if type(l:Root) is v:t_func return l:Root(a:buffer) @@ -472,7 +502,7 @@ function! s:CheckWithLSP(linter, details) abort call ale#lsp#RegisterCallback(l:id, l:Callback) " Remember the linter this connection is for. - let s:lsp_linter_map[l:id] = a:linter.name + let s:lsp_linter_map[l:id] = a:linter if a:linter.lsp is# 'tsserver' let l:message = ale#lsp#tsserver_message#Geterr(l:buffer) @@ -501,9 +531,14 @@ endfunction function! s:HandleLSPResponseToCustomRequests(conn_id, response) abort if has_key(a:response, 'id') - \&& has_key(s:custom_handlers_map, a:response.id) - let l:Handler = remove(s:custom_handlers_map, a:response.id) - call l:Handler(a:response) + " Get the custom handlers Dictionary from the linter map. + let l:linter = get(s:lsp_linter_map, a:conn_id, {}) + let l:custom_handlers = get(l:linter, 'custom_handlers', {}) + + if has_key(l:custom_handlers, a:response.id) + let l:Handler = remove(l:custom_handlers, a:response.id) + call l:Handler(a:response) + endif endif endfunction @@ -514,7 +549,17 @@ function! s:OnReadyForCustomRequests(args, linter, lsp_details) abort if l:request_id > 0 && has_key(a:args, 'handler') let l:Callback = function('s:HandleLSPResponseToCustomRequests') call ale#lsp#RegisterCallback(l:id, l:Callback) - let s:custom_handlers_map[l:request_id] = a:args.handler + + " Remember the linter this connection is for. + let s:lsp_linter_map[l:id] = a:linter + + " Add custom_handlers to the linter Dictionary. + if !has_key(a:linter, 'custom_handlers') + let a:linter.custom_handlers = {} + endif + + " Put the handler function in the map to call later. + let a:linter.custom_handlers[l:request_id] = a:args.handler endif endfunction diff --git a/sources_non_forked/ale/autoload/ale/organize_imports.vim b/sources_non_forked/ale/autoload/ale/organize_imports.vim index a6e77863..fb00bc21 100644 --- a/sources_non_forked/ale/autoload/ale/organize_imports.vim +++ b/sources_non_forked/ale/autoload/ale/organize_imports.vim @@ -19,7 +19,7 @@ function! ale#organize_imports#HandleTSServerResponse(conn_id, response) abort \ }, \ { \ 'conn_id': a:conn_id, - \ 'should_save': !&hidden, + \ 'should_save': g:ale_save_hidden || !&hidden, \ }, \) endfunction @@ -57,9 +57,7 @@ function! s:OrganizeImports(linter) abort endfunction function! ale#organize_imports#Execute() abort - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call s:OrganizeImports(l:linter) - endif + for l:linter in ale#lsp_linter#GetEnabled(bufnr('')) + call s:OrganizeImports(l:linter) endfor endfunction diff --git a/sources_non_forked/ale/autoload/ale/python.vim b/sources_non_forked/ale/autoload/ale/python.vim index 615986f9..2c7e0049 100644 --- a/sources_non_forked/ale/autoload/ale/python.vim +++ b/sources_non_forked/ale/autoload/ale/python.vim @@ -7,14 +7,17 @@ call ale#Set('python_auto_poetry', '0') let s:sep = has('win32') ? '\' : '/' " bin is used for Unix virtualenv directories, and Scripts is for Windows. let s:bin_dir = has('unix') ? 'bin' : 'Scripts' +" The default virtualenv directory names are ordered from the likely most +" common names down to the least common. `.env` might be more common, but it's +" also likely to conflict with a `.env` file for environment variables, so we +" search for it last. (People really shouldn't use that name.) let g:ale_virtualenv_dir_names = get(g:, 'ale_virtualenv_dir_names', [ -\ '.env', \ '.venv', \ 'env', -\ 've-py3', \ 've', -\ 'virtualenv', \ 'venv', +\ 'virtualenv', +\ '.env', \]) function! ale#python#FindProjectRootIni(buffer) abort diff --git a/sources_non_forked/ale/autoload/ale/references.vim b/sources_non_forked/ale/autoload/ale/references.vim index c32663fe..df253c9c 100644 --- a/sources_non_forked/ale/autoload/ale/references.vim +++ b/sources_non_forked/ale/autoload/ale/references.vim @@ -179,9 +179,7 @@ function! ale#references#Find(...) abort let l:column = min([l:column, len(getline(l:line))]) let l:Callback = function('s:OnReady', [l:line, l:column, l:options]) - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) - endif + for l:linter in ale#lsp_linter#GetEnabled(l:buffer) + call ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) endfor endfunction diff --git a/sources_non_forked/ale/autoload/ale/rename.vim b/sources_non_forked/ale/autoload/ale/rename.vim index a722cc94..d7bc8699 100644 --- a/sources_non_forked/ale/autoload/ale/rename.vim +++ b/sources_non_forked/ale/autoload/ale/rename.vim @@ -85,7 +85,7 @@ function! ale#rename#HandleTSServerResponse(conn_id, response) abort \ }, \ { \ 'conn_id': a:conn_id, - \ 'should_save': !&hidden, + \ 'should_save': g:ale_save_hidden || !&hidden, \ }, \) endfunction @@ -118,7 +118,7 @@ function! ale#rename#HandleLSPResponse(conn_id, response) abort \ }, \ { \ 'conn_id': a:conn_id, - \ 'should_save': !&hidden, + \ 'should_save': g:ale_save_hidden || !&hidden, \ }, \) endif @@ -178,15 +178,9 @@ function! s:ExecuteRename(linter, options) abort endfunction function! ale#rename#Execute() abort - let l:lsp_linters = [] + let l:linters = ale#lsp_linter#GetEnabled(bufnr('')) - for l:linter in ale#linter#Get(&filetype) - if !empty(l:linter.lsp) - call add(l:lsp_linters, l:linter) - endif - endfor - - if empty(l:lsp_linters) + if empty(l:linters) call s:message('No active LSPs') return @@ -201,8 +195,8 @@ function! ale#rename#Execute() abort return endif - for l:lsp_linter in l:lsp_linters - call s:ExecuteRename(l:lsp_linter, { + for l:linter in l:linters + call s:ExecuteRename(l:linter, { \ 'old_name': l:old_name, \ 'new_name': l:new_name, \}) diff --git a/sources_non_forked/ale/autoload/ale/sign.vim b/sources_non_forked/ale/autoload/ale/sign.vim index e043216f..15517bf8 100644 --- a/sources_non_forked/ale/autoload/ale/sign.vim +++ b/sources_non_forked/ale/autoload/ale/sign.vim @@ -9,11 +9,11 @@ let g:ale_max_signs = get(g:, 'ale_max_signs', -1) " there are errors. let g:ale_change_sign_column_color = get(g:, 'ale_change_sign_column_color', 0) " These variables dictate what signs are used to indicate errors and warnings. -let g:ale_sign_error = get(g:, 'ale_sign_error', '>>') +let g:ale_sign_error = get(g:, 'ale_sign_error', 'E') let g:ale_sign_style_error = get(g:, 'ale_sign_style_error', g:ale_sign_error) -let g:ale_sign_warning = get(g:, 'ale_sign_warning', '--') +let g:ale_sign_warning = get(g:, 'ale_sign_warning', 'W') let g:ale_sign_style_warning = get(g:, 'ale_sign_style_warning', g:ale_sign_warning) -let g:ale_sign_info = get(g:, 'ale_sign_info', g:ale_sign_warning) +let g:ale_sign_info = get(g:, 'ale_sign_info', 'I') let g:ale_sign_priority = get(g:, 'ale_sign_priority', 30) " This variable sets an offset which can be set for sign IDs. " This ID can be changed depending on what IDs are set for other plugins. diff --git a/sources_non_forked/ale/autoload/ale/symbol.vim b/sources_non_forked/ale/autoload/ale/symbol.vim index 6c65f1b2..ba971e74 100644 --- a/sources_non_forked/ale/autoload/ale/symbol.vim +++ b/sources_non_forked/ale/autoload/ale/symbol.vim @@ -102,8 +102,8 @@ function! ale#symbol#Search(args) abort call setbufvar(l:buffer, 'ale_symbol_request_made', 0) let l:Callback = function('s:OnReady', [l:query, l:options]) - for l:linter in ale#linter#Get(getbufvar(l:buffer, '&filetype')) - if !empty(l:linter.lsp) && l:linter.lsp isnot# 'tsserver' + for l:linter in ale#lsp_linter#GetEnabled(l:buffer) + if l:linter.lsp isnot# 'tsserver' call ale#lsp_linter#StartLSP(l:buffer, l:linter, l:Callback) endif endfor diff --git a/sources_non_forked/ale/autoload/ale/uri/jdt.vim b/sources_non_forked/ale/autoload/ale/uri/jdt.vim index 46cea268..7df10b4e 100644 --- a/sources_non_forked/ale/autoload/ale/uri/jdt.vim +++ b/sources_non_forked/ale/autoload/ale/uri/jdt.vim @@ -21,11 +21,11 @@ function! s:OpenJDTLink(root, uri, line, column, options, result) abort call ale#util#Open(a:uri, a:line, a:column, a:options) autocmd AleURISchemes BufNewFile,BufReadPre jdt://** call ale#uri#jdt#ReadJDTLink(expand('')) - if !empty(getbufvar(bufnr(''), 'ale_lsp_root', '')) + if !empty(getbufvar(bufnr(''), 'ale_root', '')) return endif - let b:ale_lsp_root = a:root + let b:ale_root = a:root set filetype=java call setline(1, split(l:contents, '\n')) @@ -39,6 +39,8 @@ endfunction function! ale#uri#jdt#OpenJDTLink(encoded_uri, line, column, options, conn_id) abort let l:found_eclipselsp = v:false + " We should only arrive here from a 'go to definition' request, so we'll + " assume the eclipselsp linter is enabled. for l:linter in ale#linter#Get('java') if l:linter.name is# 'eclipselsp' let l:found_eclipselsp = v:true @@ -81,14 +83,14 @@ endfunction " Read jdt:// contents, as part of current project, into current buffer. function! ale#uri#jdt#ReadJDTLink(encoded_uri) abort - if !empty(getbufvar(bufnr(''), 'ale_lsp_root', '')) + if !empty(getbufvar(bufnr(''), 'ale_root', '')) return endif let l:linter_map = ale#lsp_linter#GetLSPLinterMap() - for l:conn_id in keys(l:linter_map) - if l:linter_map[l:conn_id] is# 'eclipselsp' + for [l:conn_id, l:linter] in items(l:linter_map) + if l:linter.name is# 'eclipselsp' let l:root = l:conn_id[stridx(l:conn_id, ':')+1:] endif endfor @@ -98,7 +100,7 @@ function! ale#uri#jdt#ReadJDTLink(encoded_uri) abort endif let l:uri = a:encoded_uri - let b:ale_lsp_root = l:root + let b:ale_root = l:root set filetype=java call ale#lsp_linter#SendRequest( diff --git a/sources_non_forked/ale/autoload/ale/util.vim b/sources_non_forked/ale/autoload/ale/util.vim index 2dc71ce5..98af1635 100644 --- a/sources_non_forked/ale/autoload/ale/util.vim +++ b/sources_non_forked/ale/autoload/ale/util.vim @@ -522,7 +522,18 @@ function! ale#util#SetBufferContents(buffer, lines) abort " Use a Vim API for setting lines in other buffers, if available. if l:has_bufline_api - call setbufline(a:buffer, 1, l:new_lines) + if has('nvim') + " save and restore signs to avoid flickering + let signs = sign_getplaced(a:buffer, {'group': 'ale'})[0].signs + + call nvim_buf_set_lines(a:buffer, 0, l:first_line_to_remove, 0, l:new_lines) + + " restore signs (invalid line numbers will be skipped) + call sign_placelist(map(signs, {_, v -> extend(v, {'buffer': a:buffer})})) + else + call setbufline(a:buffer, 1, l:new_lines) + endif + call deletebufline(a:buffer, l:first_line_to_remove, '$') " Fall back on setting lines the old way, for the current buffer. else diff --git a/sources_non_forked/ale/autoload/ale/virtualtext.vim b/sources_non_forked/ale/autoload/ale/virtualtext.vim index 72bc8e6f..551211e8 100644 --- a/sources_non_forked/ale/autoload/ale/virtualtext.vim +++ b/sources_non_forked/ale/autoload/ale/virtualtext.vim @@ -31,7 +31,8 @@ let g:ale_virtualtext_delay = get(g:, 'ale_virtualtext_delay', 10) " Controls the positioning of virtualtext let g:ale_virtualtext_column = get(g:, 'ale_virtualtext_column', 0) let g:ale_virtualtext_maxcolumn = get(g:, 'ale_virtualtext_maxcolumn', 0) -let g:ale_virtualtext_single = get(g:,'ale_virtualtext_single',0) +" If 1, only show the first problem with virtualtext. +let g:ale_virtualtext_single = get(g:, 'ale_virtualtext_single', 1) let s:cursor_timer = get(s:, 'cursor_timer', -1) let s:last_pos = get(s:, 'last_pos', [0, 0, 0]) @@ -273,6 +274,32 @@ function! ale#virtualtext#ShowCursorWarningWithDelay() abort endif endfunction +function! ale#virtualtext#CompareSeverityPerLine(left, right) abort + " Compare lines + if a:left.lnum < a:right.lnum + return -1 + endif + + if a:left.lnum > a:right.lnum + return 1 + endif + + let l:left_priority = ale#util#GetItemPriority(a:left) + let l:right_priority = ale#util#GetItemPriority(a:right) + + " Put highest priority items first. + if l:left_priority > l:right_priority + return -1 + endif + + if l:left_priority < l:right_priority + return 1 + endif + + " Put the first seen problem first. + return a:left.col - a:right.col +endfunction + function! ale#virtualtext#SetTexts(buffer, loclist) abort if !has('nvim') && s:emulate_virt return @@ -280,17 +307,19 @@ function! ale#virtualtext#SetTexts(buffer, loclist) abort call ale#virtualtext#Clear(a:buffer) - let l:filter = ale#Var(a:buffer,'virtualtext_single') - let l:seen = {} + let l:buffer_list = filter(copy(a:loclist), 'v:val.bufnr == a:buffer') - for l:item in a:loclist - if l:item.bufnr == a:buffer - let l:line = max([1, l:item.lnum]) + if ale#Var(a:buffer,'virtualtext_single') + " If we want a single problem per line, sort items on each line by + " highest severity and then lowest column position, then de-duplicate + " the items by line. + call uniq( + \ sort(l:buffer_list, function('ale#virtualtext#CompareSeverityPerLine')), + \ {a, b -> a.lnum - b.lnum} + \) + endif - if !has_key(l:seen,l:line) || l:filter == 0 - call ale#virtualtext#ShowMessage(a:buffer, l:item) - let l:seen[l:line] = 1 - endif - endif + for l:item in l:buffer_list + call ale#virtualtext#ShowMessage(a:buffer, l:item) endfor endfunction diff --git a/sources_non_forked/ale/doc/ale-c.txt b/sources_non_forked/ale/doc/ale-c.txt index d3517e79..b8b448fb 100644 --- a/sources_non_forked/ale/doc/ale-c.txt +++ b/sources_non_forked/ale/doc/ale-c.txt @@ -25,10 +25,10 @@ g:ale_c_build_dir_names *g:ale_c_build_dir_names* Type: |List| Default: `['build', 'bin']` - A list of directory names to be used when searching upwards from cpp files + A list of directory names to be used when searching upwards from C files to discover compilation databases with. For directory named `'foo'`, ALE will search for `'foo/compile_commands.json'` in all directories on and - above the directory containing the cpp file to find path to compilation + above the directory containing the C file to find path to compilation database. This feature is useful for the clang tools wrapped around LibTooling (namely here, clang-tidy) @@ -202,6 +202,37 @@ g:ale_c_ccls_init_options *g:ale_c_ccls_init_options* https://github.com/MaskRay/ccls/wiki/Customization#initialization-options. +=============================================================================== +clangcheck *ale-c-clangcheck* + +`clang-check` will be run only when files are saved to disk, so that +`compile_commands.json` files can be used. It is recommended to use this +linter in combination with `compile_commands.json` files. +Therefore, `clang-check` linter reads the options |g:ale_c_build_dir| and +|g:ale_c_build_dir_names|. Also, setting |g:ale_c_build_dir| actually +overrides |g:ale_c_build_dir_names|. + + +g:ale_c_clangcheck_executable *g:ale_c_clangcheck_executable* + *b:ale_c_clangcheck_executable* + Type: |String| + Default: `'clang-check'` + + This variable can be changed to use a different executable for clangcheck. + + +g:ale_c_clangcheck_options *g:ale_c_clangcheck_options* + *b:ale_c_clangcheck_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to clang-check. + + This variable should not be set to point to build subdirectory with + `-p path/to/build` option, as it is handled by the |g:ale_c_build_dir| + option. + + =============================================================================== clangd *ale-c-clangd* @@ -378,7 +409,7 @@ g:ale_c_cquery_executable *g:ale_c_cquery_executable* This variable can be changed to use a different executable for cquery. -g:ale_cpp_cquery_cache_directory *g:ale_c_cquery_cache_directory* +g:ale_c_cquery_cache_directory *g:ale_c_cquery_cache_directory* *b:ale_c_cquery_cache_directory* Type: |String| Default: `'~/.cache/cquery'` diff --git a/sources_non_forked/ale/doc/ale-cairo.txt b/sources_non_forked/ale/doc/ale-cairo.txt index 0a78e68a..070b76e5 100644 --- a/sources_non_forked/ale/doc/ale-cairo.txt +++ b/sources_non_forked/ale/doc/ale-cairo.txt @@ -2,6 +2,19 @@ ALE Cairo Integration *ale-cairo-options* +=============================================================================== +scarb *ale-cairo-scarb* + +g:ale_cairo_scarb_executable *g:ale_cairo_scarb_executable* + *b:ale_cairo_scarb_executable* + + Default: `'scarb build'` + + For Cairo1 projects using Scarb + + For more information read 'https://docs.swmansion.com/scarb/' + + =============================================================================== starknet *ale-cairo-starknet* @@ -13,3 +26,5 @@ g:ale_cairo_starknet_executable *g:ale_cairo_starknet_executable* Overrides the starknet-compile binary after installing the cairo-language. For more information read 'https://starknet.io/docs/quickstart.html' + +=============================================================================== diff --git a/sources_non_forked/ale/doc/ale-development.txt b/sources_non_forked/ale/doc/ale-development.txt index 6bc009fd..6ba03da1 100644 --- a/sources_non_forked/ale/doc/ale-development.txt +++ b/sources_non_forked/ale/doc/ale-development.txt @@ -48,7 +48,7 @@ documented functions and options, until a major version is planned. Breaking changes should be preceded by a deprecation phase complete with warnings. Changes required for security may be an exception. -ALE supports Vim 8 and above, and NeoVim 0.2.0 or newer. These are the +ALE supports Vim 8 and above, and NeoVim 0.6.0 or newer. These are the earliest versions of Vim and NeoVim which support |job|, |timer|, |closure|, and |lambda| features. All ALE code should be written so it is compatible with these versions of Vim, or with version checks so particular features can @@ -156,7 +156,7 @@ environments. 1. Vim 8.0.0027 on Linux via GitHub Actions. 2. Vim 9.0.0297 on Linux via GitHub Actions. -3. NeoVim 0.2.0 on Linux via GitHub Actions. +3. NeoVim 0.6.0 on Linux via GitHub Actions. 4. NeoVim 0.8.0 on Linux via GitHub Actions. 6. Vim 8 (stable builds) on Windows via AppVeyor. diff --git a/sources_non_forked/ale/doc/ale-elixir.txt b/sources_non_forked/ale/doc/ale-elixir.txt index 693db5aa..351b442a 100644 --- a/sources_non_forked/ale/doc/ale-elixir.txt +++ b/sources_non_forked/ale/doc/ale-elixir.txt @@ -104,5 +104,23 @@ cspell *ale-elixir-cspell* See |ale-cspell-options| +=============================================================================== +lexical *ale-elixir-lexical* + +Lexical (https://github.com/lexical-lsp/lexical) + +g:ale_elixir_lexical_release *g:ale_elixir_lexical_release* + *b:ale_elixir_lexical_release* + Type: |String| + Default: `'lexical'` + + Location of the lexical release directory. This directory must contain + the language server scripts (start_lexical.sh and start_lexical.bat). + + For example, set release to: `/home/projects/lexical/_build/dev/rel/lexical` + + There are currnetly no configuration options for lexical. + + =============================================================================== vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/sources_non_forked/ale/doc/ale-java.txt b/sources_non_forked/ale/doc/ale-java.txt index 69611866..aed3aaf8 100644 --- a/sources_non_forked/ale/doc/ale-java.txt +++ b/sources_non_forked/ale/doc/ale-java.txt @@ -264,7 +264,7 @@ g:ale_java_eclipselsp_workspace_path *g:ale_java_eclipselsp_workspace_path* Type: |String| Default: `''` - If you have Eclipse installed is good idea to set this variable to the + If you have Eclipse installed it is a good idea to set this variable to the absolute path of the Eclipse workspace. If not set this value will be set to the parent folder of the project root. diff --git a/sources_non_forked/ale/doc/ale-nickel.txt b/sources_non_forked/ale/doc/ale-nickel.txt new file mode 100644 index 00000000..a8dd6af8 --- /dev/null +++ b/sources_non_forked/ale/doc/ale-nickel.txt @@ -0,0 +1,25 @@ +=============================================================================== +ALE Nickel Integration *ale-nickel-options* + + +=============================================================================== +nickel_format *ale-nickel-nickel-format* + +g:ale_nickel_nickel_format_executable *g:ale_nickel_nickel_format_executable* + *b:ale_nickel_nickel_format_executable* + Type: |String| + Default: `'nickel'` + + This option can be changed to change the path for `nickel`. + + +g:ale_nickel_nickel_format_options *g:ale_nickel_nickel_format_options* + *b:ale_nickel_nickel_format_options* + Type: |String| + Default: `''` + + This option can be changed to pass extra options to `'nickel format'` + + +=============================================================================== + vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/sources_non_forked/ale/doc/ale-python.txt b/sources_non_forked/ale/doc/ale-python.txt index d7c5cacc..ec118c5a 100644 --- a/sources_non_forked/ale/doc/ale-python.txt +++ b/sources_non_forked/ale/doc/ale-python.txt @@ -1322,6 +1322,70 @@ g:ale_python_ruff_auto_poetry *g:ale_python_ruff_auto_poetry* if true. This is overridden by a manually-set executable. +=============================================================================== +ruff-format *ale-python-ruff-format* + +g:ale_python_ruff_format_change_directory + *g:ale_python_ruff_format_change_directory* + *b:ale_python_ruff_format_change_directory* + Type: |Number| + Default: `1` + + If set to `1`, `ruff` will be run from a detected project root, per + |ale-python-root|. if set to `0` or no project root detected, + `ruff` will be run from the buffer's directory. + + +g:ale_python_ruff_format_executable *g:ale_python_ruff_format_executable* + *b:ale_python_ruff_format_executable* + Type: |String| + Default: `'ruff'` + + See |ale-integrations-local-executables| + + Set this to `'pipenv'` to invoke `'pipenv` `run` `ruff'`. + Set this to `'poetry'` to invoke `'poetry` `run` `ruff'`. + + +g:ale_python_ruff_format_options *g:ale_python_ruff_format_options* + *b:ale_python_ruff_format_options* + Type: |String| + Default: `''` + + This variable can be changed to add command-line arguments to the ruff + invocation. + + For example, to select/enable and/or disable some error codes, + you may want to set > + let g:ale_python_ruff_format_options = '--ignore F401' + + +g:ale_python_ruff_format_use_global *g:ale_python_ruff_format_use_global* + *b:ale_python_ruff_format_use_global* + Type: |Number| + Default: `get(g:, 'ale_use_global_executables', 0)` + + See |ale-integrations-local-executables| + + +g:ale_python_ruff_format_auto_pipenv *g:ale_python_ruff_format_auto_pipenv* + *b:ale_python_ruff_format_auto_pipenv* + Type: |Number| + Default: `0` + + Detect whether the file is inside a pipenv, and set the executable to `pipenv` + if true. This is overridden by a manually-set executable. + + +g:ale_python_ruff_format_auto_poetry *g:ale_python_ruff_format_auto_poetry* + *b:ale_python_ruff_format_auto_poetry* + Type: |Number| + Default: `0` + + Detect whether the file is inside a poetry, and set the executable to `poetry` + if true. This is overridden by a manually-set executable. + + =============================================================================== unimport *ale-python-unimport* diff --git a/sources_non_forked/ale/doc/ale-ruby.txt b/sources_non_forked/ale/doc/ale-ruby.txt index b0773fdd..ff9aa798 100644 --- a/sources_non_forked/ale/doc/ale-ruby.txt +++ b/sources_non_forked/ale/doc/ale-ruby.txt @@ -48,6 +48,26 @@ g:ale_ruby_debride_options *g:ale_ruby_debride_options* This variable can be changed to modify flags given to debride. +=============================================================================== +packwerk *ale-ruby-packwerk* + +g:ale_ruby_packwerk_executable *g:ale_ruby_packwerk_executable* + *b:ale_ruby_packwerk_executable* + Type: |String| + Default: `'packwerk'` + + Override the invoked packwerk binary. Set this to `'bundle'` to invoke + `'bundle` `exec` packwerk'. + + +g:ale_ruby_packwerk_options *g:ale_ruby_packwerk_options* + *b:ale_ruby_packwerk_options* + Type: |String| + Default: `''` + + This variable can be changed to modify flags given to packwerk. + + =============================================================================== prettier *ale-ruby-prettier* diff --git a/sources_non_forked/ale/doc/ale-rust.txt b/sources_non_forked/ale/doc/ale-rust.txt index 48f558e8..897fcaa1 100644 --- a/sources_non_forked/ale/doc/ale-rust.txt +++ b/sources_non_forked/ale/doc/ale-rust.txt @@ -33,11 +33,12 @@ Integration Information 5. rustfmt -- If you have `rustfmt` installed, you can use it as a fixer to consistently reformat your Rust code. - Only cargo and rls are enabled by default. To switch to using rustc instead - of cargo, configure |g:ale_linters| appropriately: > + Only cargo and rust-analyze are enabled by default. To switch to using rustc + instead of cargo, configure |b:ale_linters| in your ftplugin file + appropriately: > " See the help text for the option for more information. - let g:ale_linters = {'rust': ['rustc', 'rls']} + let b:ale_linters = ['analyzer', 'rustc'] < Also note that rustc 1.18. or later is needed. diff --git a/sources_non_forked/ale/doc/ale-solidity.txt b/sources_non_forked/ale/doc/ale-solidity.txt index c4d2f02f..6cf97344 100644 --- a/sources_non_forked/ale/doc/ale-solidity.txt +++ b/sources_non_forked/ale/doc/ale-solidity.txt @@ -36,6 +36,15 @@ solium *ale-solidity-solium* See the corresponding solium usage for detailed instructions (https://github.com/duaraghav8/Solium#usage). +=============================================================================== +forge *ale-solidity-forge* + + `forge fmt` is not a linter, only a formatter. It should be used only as a + fixer. + + `forge fmt` should work out-of-the-box. You can further configure it using + `foundry.toml`. See the corresponding documentation for detailed + instructions (https://book.getfoundry.sh/reference/config/formatter). =============================================================================== vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/sources_non_forked/ale/doc/ale-supported-languages-and-tools.txt b/sources_non_forked/ale/doc/ale-supported-languages-and-tools.txt index 40c78f76..aa49a1b1 100644 --- a/sources_non_forked/ale/doc/ale-supported-languages-and-tools.txt +++ b/sources_non_forked/ale/doc/ale-supported-languages-and-tools.txt @@ -67,6 +67,7 @@ Notes: * `ccls` * `clang` (`cc`) * `clang-format` + * `clangcheck`!! * `clangd` * `clangtidy`!! * `cppcheck` @@ -101,6 +102,7 @@ Notes: * `gcc` (`cc`) * `uncrustify` * Cairo + * `scarb`!! * `starknet` * Chef * `cookstyle` @@ -168,6 +170,7 @@ Notes: * `dialyxir` * `dogma`!! * `elixir-ls` + * `lexical` * `mix`!! * Elm * `elm-format` @@ -380,6 +383,8 @@ Notes: * `mmc`!! * NASM * `nasm`!! +* Nickel + * `nickel_format` * Nim * `nim check`!! * `nimlsp` @@ -504,6 +509,7 @@ Notes: * `refurb` * `reorder-python-imports` * ruff + * ruff-format * `unimport` * `vulture`!! * `yapf` @@ -546,6 +552,7 @@ Notes: * `brakeman`!! * `cspell` * `debride` + * `packwerk`!! * `prettier` * `rails_best_practices`!! * `reek` @@ -586,6 +593,7 @@ Notes: * SML * `smlnj` * Solidity + * `forge` * `solc` * `solhint` * `solium` diff --git a/sources_non_forked/ale/doc/ale-typescript.txt b/sources_non_forked/ale/doc/ale-typescript.txt index 4a993793..ab3f17bd 100644 --- a/sources_non_forked/ale/doc/ale-typescript.txt +++ b/sources_non_forked/ale/doc/ale-typescript.txt @@ -42,8 +42,8 @@ g:ale_deno_unstable *g:ale_deno_unstable* Enable or disable unstable Deno features and APIs. -g:ale_deno_importMap *g:ale_deno_importMap* - *b:ale_deno_importMap* +g:ale_deno_import_map *g:ale_deno_import_map* + *b:ale_deno_import_map* Type: |String| Default: `'import_map.json'` diff --git a/sources_non_forked/ale/doc/ale.txt b/sources_non_forked/ale/doc/ale.txt index e73abc99..5f7999b8 100644 --- a/sources_non_forked/ale/doc/ale.txt +++ b/sources_non_forked/ale/doc/ale.txt @@ -121,7 +121,7 @@ circumstances. ALE will report problems with your code in the following ways, listed with their relevant options. -* Via the Neovim diagnostics API (Off by default) - |g:ale_use_neovim_diagnostics_api| +* Via Neovim diagnostics (On in Neovim 0.6+) - |g:ale_use_neovim_diagnostics_api| * By updating loclist. (On by default) - |g:ale_set_loclist| * By updating quickfix. (Off by default) - |g:ale_set_quickfix| * By setting error highlights. - |g:ale_set_highlights| @@ -455,6 +455,11 @@ If you want to use another plugin for LSP features and tsserver, you can use the |g:ale_disable_lsp| setting to disable ALE's own LSP integrations, or ignore particular linters with |g:ale_linters_ignore|. +If for any reason you want to stop a language server ALE starts, such as when +a project configuration has significantly changed, or new files have been +added the language server isn't aware of, use either |ALEStopLSP| or +|ALEStopAllLSPs| to stop the server until ALE automatically starts it again. + ------------------------------------------------------------------------------- 5.1 Completion *ale-completion* @@ -737,6 +742,7 @@ You may wish to remove some other menu items you don't want to see: > =============================================================================== 6. Global Options *ale-options* + g:airline#extensions#ale#enabled *g:airline#extensions#ale#enabled* Type: |Number| @@ -815,7 +821,6 @@ g:ale_command_wrapper *g:ale_command_wrapper* " Has the same effect as the above. let g:ale_command_wrapper = 'nice -n5 %*' < - For passing all of the arguments for a command as one argument to a wrapper, `%@` can be used instead. > @@ -840,7 +845,6 @@ g:ale_completion_delay *g:ale_completion_delay* g:ale_completion_enabled *g:ale_completion_enabled* *b:ale_completion_enabled* - Type: |Number| Default: `0` @@ -881,7 +885,7 @@ g:ale_completion_autoimport *g:ale_completion_autoimport* When this option is set to `1`, ALE will try to automatically import completion results from external modules. It can be disabled by setting it to `0`. Some LSP servers include auto imports on every completion item so - disabling automatic imports may drop some or all completion items returnend + disabling automatic imports may drop some or all completion items returned by it (e.g. eclipselsp). @@ -906,7 +910,7 @@ g:ale_completion_excluded_words *g:ale_completion_excluded_words* g:ale_completion_symbols *g:ale_completion_symbols* Type: |Dictionary| - + Default: See `autoload/ale/completion.vim` A mapping from completion types to symbols for completions. See |ale-symbols| for more information. @@ -960,6 +964,7 @@ g:ale_completion_max_suggestions *g:ale_completion_max_suggestions* Adjust this option as needed, depending on the complexity of your codebase and your available processing power. + g:ale_cursor_detail *g:ale_cursor_detail* Type: |Number| @@ -984,7 +989,6 @@ g:ale_cursor_detail *g:ale_cursor_detail* g:ale_default_navigation *g:ale_default_navigation* *b:ale_default_navigation* - Type: |String| Default: `'buffer'` @@ -1003,12 +1007,16 @@ g:ale_detail_to_floating_preview *g:ale_detail_to_floating_preview* g:ale_disable_lsp *g:ale_disable_lsp* *b:ale_disable_lsp* + Type: |Number| OR |String| + Default: `'auto'` - Type: |Number| - Default: `0` + When this option is set to `'auto'`, ALE will automatically disable linters + that it detects as having already been configured with the nvim-lspconfig + plugin. When this option is set to `1`, ALE ignores all linters powered by + LSP, and also `tsserver`. - When this option is set to `1`, ALE ignores all linters powered by LSP, - and also `tsserver`. + Any linters that are disabled will also not be usable for LSP functionality + other than just linting. Please see also |ale-lsp|. @@ -1054,7 +1062,6 @@ g:ale_echo_msg_error_str *g:ale_echo_msg_error_str* g:ale_echo_msg_format *g:ale_echo_msg_format* *b:ale_echo_msg_format* - Type: |String| Default: `'%code: %%s'` @@ -1113,7 +1120,6 @@ g:ale_echo_msg_warning_str *g:ale_echo_msg_warning_str* g:ale_enabled *g:ale_enabled* *b:ale_enabled* - Type: |Number| Default: `1` @@ -1128,16 +1134,16 @@ g:ale_enabled *g:ale_enabled* " Disable linting for all minified JS files. let g:ale_pattern_options = {'\.min.js$': {'ale_enabled': 0}} < - See |g:ale_pattern_options| for more information on that option. g:ale_exclude_highlights *g:ale_exclude_highlights* *b:ale_exclude_highlights* - Type: |List| Default: `[]` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + A list of regular expressions for matching against highlight messages to remove. For example: > @@ -1149,7 +1155,6 @@ g:ale_exclude_highlights *g:ale_exclude_highlights* g:ale_fixers *g:ale_fixers* *b:ale_fixers* - Type: |Dictionary| Default: `{}` @@ -1171,7 +1176,6 @@ g:ale_fixers *g:ale_fixers* g:ale_fix_on_save *g:ale_fix_on_save* *b:ale_fix_on_save* - Type: |Number| Default: `0` @@ -1193,7 +1197,6 @@ g:ale_fix_on_save *g:ale_fix_on_save* g:ale_fix_on_save_ignore *g:ale_fix_on_save_ignore* *b:ale_fix_on_save_ignore* - Type: |Dictionary| or |List| Default: `{}` @@ -1241,11 +1244,12 @@ g:ale_floating_preview_popup_opts *g:ale_floating_preview_popup_opts* Type: |String| or |Dictionary| Default: `''` - Either a dictionary of options or the string name of a function that returns a - dictionary of options. This will be used as an argument to |popup_create| for - Vim users or |nvim_open_win| for NeoVim users. Note that in either case, the - resulting dictionary is merged with ALE defaults rather than expliciting overriding - them. This only takes effect if |g:ale_floating_preview| is enabled. + Either a dictionary of options or the string name of a function that returns + a dictionary of options. This will be used as an argument to |popup_create| + for Vim users or |nvim_open_win| for NeoVim users. In either case, the + resulting dictionary is merged with ALE defaults rather than explicitly + overriding them. This only takes effect if |g:ale_floating_preview| is + enabled. NOTE: for Vim users see |popup_create-arguments|, for NeoVim users see |nvim_open_win| for argument details @@ -1260,23 +1264,22 @@ g:ale_floating_preview_popup_opts *g:ale_floating_preview_popup_opts* let g:ale_floating_preview_popup_opts = 'g:CustomOpts' < - g:ale_floating_window_border *g:ale_floating_window_border* Type: |List| Default: `['|', '-', '+', '+', '+', '+', '|', '-']` When set to `[]`, window borders are disabled. The elements in the list set - the the characters for the left side, top, top-left corner, top-right - corner, bottom-right corner, bottom-left corner, right side, and bottom of - the floating window, respectively. + the characters for the left side, top, top-left corner, top-right + corner, bottom-right corner, bottom-left corner, right side, and bottom of + the floating window, respectively. If the terminal supports Unicode, you might try setting the value to ` ['│', '─', '╭', '╮', '╯', '╰', '│', '─']`, to make it look nicer. NOTE: For compatibility with previous versions, if the list does not have - elements for the right side and bottom, the left side and top will be used - instead. + elements for the right side and bottom, the left side and top will be used + instead. g:ale_history_enabled *g:ale_history_enabled* @@ -1346,6 +1349,15 @@ g:ale_hover_to_floating_preview *g:ale_hover_to_floating_preview* hover messages. +g:ale_info_default_mode *g:ale_info_default_mode* + *b:ale_info_default_mode* + Type: |String| + Default: `'preview'` + + Changes the default mode used for |ALEInfo|. See documentation for |ALEInfo| + for more information. + + g:ale_keep_list_window_open *g:ale_keep_list_window_open* *b:ale_keep_list_window_open* Type: |Number| @@ -1457,7 +1469,6 @@ g:ale_lint_on_text_changed *g:ale_lint_on_text_changed* g:ale_lint_on_insert_leave *g:ale_lint_on_insert_leave* *b:ale_lint_on_insert_leave* - Type: |Number| Default: `1` @@ -1545,7 +1556,6 @@ g:ale_linter_aliases *g:ale_linter_aliases* g:ale_filename_mappings *g:ale_filename_mappings* *b:ale_filename_mappings* - Type: |Dictionary| or |List| Default: `{}` @@ -1653,7 +1663,7 @@ g:ale_linters *g:ale_linters* \ 'perl': ['perlcritic'], \ 'perl6': [], \ 'python': ['flake8', 'mypy', 'pylint', 'pyright', 'ruff'], - \ 'rust': ['cargo', 'rls'], + \ 'rust': ['analyzer', 'cargo'], \ 'spec': [], \ 'text': [], \ 'vader': ['vimls'], @@ -1713,7 +1723,6 @@ g:ale_linters_explicit *g:ale_linters_explicit* g:ale_linters_ignore *g:ale_linters_ignore* *b:ale_linters_ignore* - Type: |Dictionary| or |List| Default: `{}` @@ -1749,7 +1758,6 @@ g:ale_list_vertical *g:ale_list_vertical* g:ale_loclist_msg_format *g:ale_loclist_msg_format* *b:ale_loclist_msg_format* - Type: |String| Default: `g:ale_echo_msg_format` @@ -1826,6 +1834,8 @@ g:ale_max_signs *g:ale_max_signs* Type: |Number| Default: `-1` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + When set to any positive integer, ALE will not render any more than the given number of signs for any one buffer. @@ -1946,7 +1956,6 @@ g:ale_rename_tsserver_find_in_comments *g:ale_rename_tsserver_find_in_comments* g:ale_rename_tsserver_find_in_strings *g:ale_rename_tsserver_find_in_strings* - Type: |Number| Default: `0` @@ -1957,7 +1966,6 @@ g:ale_rename_tsserver_find_in_strings *g:ale_rename_tsserver_find_in_strings* g:ale_root *g:ale_root* *b:ale_root* - Type: |Dictionary| or |String| Default: `{}` @@ -1974,9 +1982,18 @@ g:ale_root *g:ale_root* LSP linter, it will not run. +g:ale_save_hidden *g:ale_save_hidden* + + Type: |Number| + Default: `0` + + When set to `1`, save buffers when 'hidden' is set when applying code + actions or rename operations, such as through |ALERename| or + |ALEOrganizeImports|. + + g:ale_set_balloons *g:ale_set_balloons* *b:ale_set_balloons* - Type: |Number| or |String| Default: `has('balloon_eval') && has('gui_running')` @@ -1994,7 +2011,6 @@ g:ale_set_balloons *g:ale_set_balloons* let g:ale_set_balloons = has('gui_running') ? 'hover' : 0 < - Balloons can be enabled for terminal versions of Vim that support balloons, but some versions of Vim will produce strange mouse behavior when balloons are enabled. To configure balloons for your terminal, you should first @@ -2028,6 +2044,11 @@ g:ale_set_highlights *g:ale_set_highlights* Type: |Number| Default: `has('syntax')` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + In addition, ALE's highlight groups will not be used when setting + highlights through Neovim's diagnostics API. See |diagnostic-highlights| for + how to configure Neovim diagnostic highlighting. + When this option is set to `1`, highlights will be set for problems. ALE will use the following highlight groups for problems: @@ -2088,6 +2109,12 @@ g:ale_set_signs *g:ale_set_signs* When this option is set to `1`, the |sign| column will be populated with signs marking where problems appear in the file. + When |g:ale_use_neovim_diagnostics_api| is `1`, the only other setting that + will be respected for signs is |g:ale_sign_priority|. ALE's highlight groups + will and other sign settings will not apply when setting signs through + Neovim's diagnostics API. See |diagnostic-signs| for how to configure signs + in Neovim. + ALE will use the following highlight groups for problems: |ALEErrorSign| - Items with `'type': 'E'` @@ -2141,7 +2168,6 @@ g:ale_sign_priority *g:ale_sign_priority* g:ale_shell *g:ale_shell* *b:ale_shell* - Type: |String| Default: not set @@ -2159,7 +2185,6 @@ g:ale_shell *g:ale_shell* g:ale_shell_arguments *g:ale_shell_arguments* *b:ale_shell_arguments* - Type: |String| Default: not set @@ -2173,6 +2198,8 @@ g:ale_sign_column_always *g:ale_sign_column_always* Type: |Number| Default: `0` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + By default, the sign gutter will disappear when all warnings and errors have been fixed for a file. When this option is set to `1`, the sign column will remain open. This can be preferable if you don't want the text in your file @@ -2182,7 +2209,9 @@ g:ale_sign_column_always *g:ale_sign_column_always* g:ale_sign_error *g:ale_sign_error* Type: |String| - Default: `'>>'` + Default: `'E'` + + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. The sign for errors in the sign gutter. @@ -2190,7 +2219,9 @@ g:ale_sign_error *g:ale_sign_error* g:ale_sign_info *g:ale_sign_info* Type: |String| - Default: `g:ale_sign_warning` + Default: `'I'` + + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. The sign for "info" markers in the sign gutter. @@ -2200,6 +2231,8 @@ g:ale_sign_style_error *g:ale_sign_style_error* Type: |String| Default: `g:ale_sign_error` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + The sign for style errors in the sign gutter. @@ -2208,6 +2241,8 @@ g:ale_sign_style_warning *g:ale_sign_style_warning* Type: |String| Default: `g:ale_sign_warning` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + The sign for style warnings in the sign gutter. @@ -2216,6 +2251,8 @@ g:ale_sign_offset *g:ale_sign_offset* Type: |Number| Default: `1000000` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + This variable controls offset from which numeric IDs will be generated for new signs. Signs cannot share the same ID values, so when two Vim plugins set signs at the same time, the IDs have to be configured such that they do @@ -2228,7 +2265,9 @@ g:ale_sign_offset *g:ale_sign_offset* g:ale_sign_warning *g:ale_sign_warning* Type: |String| - Default: `'--'` + Default: `'W'` + + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. The sign for warnings in the sign gutter. @@ -2238,6 +2277,8 @@ g:ale_sign_highlight_linenrs *g:ale_sign_highlight_linenrs* Type: |Number| Default: `0` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + When set to `1`, this option enables highlighting problems on the 'number' column in Vim versions that support `numhl` highlights. This option must be configured before ALE is loaded. @@ -2295,16 +2336,13 @@ g:ale_use_global_executables *g:ale_use_global_executables* g:ale_use_neovim_diagnostics_api *g:ale_use_neovim_diagnostics_api* Type: |Number| - Default: `0` + Default: `has('nvim-0.6')` If enabled, this option will disable ALE's standard UI, and instead send all linter output to Neovim's diagnostics API. This allows you to collect errors from nvim-lsp, ALE, and anything else that uses diagnostics all in - one place. The following options are ignored when using the diagnostics API: - - - |g:ale_set_highlights| - - |g:ale_set_signs| - - |g:ale_virtualtext_cursor| + one place. Many options for configuring how problems appear on the screen + will not apply when the API is enabled. To enable this option, set the value to `1`. @@ -2324,11 +2362,17 @@ g:ale_virtualtext_cursor *g:ale_virtualtext_cursor* `'current'`, `'1'`, or `1` - Show problems for the current line. `'disabled'`, `'0'`, or `0` - Do not show problems with virtual-text. + When |g:ale_use_neovim_diagnostics_api| is `1`, `'current'` will behave the + same as `'all'`. + Messages are only displayed after a short delay. See |g:ale_virtualtext_delay|. - Messages can be prefixed with a string. See |g:ale_virtualtext_prefix|. + Messages can be prefixed with a string if not using Neovim's diagnostics + API. See |g:ale_virtualtext_prefix|. - ALE will use the following highlight groups for problems: + If and only if not displaying problems via Neovim's diagnostics API, + highlights for configuring ALE's virtualtext messages can be configured with + custom highlight groups: |ALEVirtualTextError| - Items with `'type': 'E'` |ALEVirtualTextWarning| - Items with `'type': 'W'` @@ -2342,6 +2386,8 @@ g:ale_virtualtext_delay *g:ale_virtualtext_delay* Type: |Number| Default: `10` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + Given any integer, this option controls the number of milliseconds before ALE will show a message for a problem near the cursor. @@ -2354,6 +2400,8 @@ g:ale_virtualtext_prefix *g:ale_virtualtext_prefix* Type: |String| Default: `'%comment% %type%: '` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + Prefix to be used with |g:ale_virtualtext_cursor|. This setting can be changed in each buffer with `b:ale_virtualtext_prefix`. @@ -2375,6 +2423,8 @@ g:ale_virtualtext_maxcolumn *g:ale_virtualtext_maxcolumn* Type: |String| or |Number| Default: `0` + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + Virtualtext column range, from `column` to `maxcolumn`. If a line is `column` or less characters long, the virtualtext message is shifted right to `column`. @@ -2390,23 +2440,28 @@ g:ale_virtualtext_maxcolumn *g:ale_virtualtext_maxcolumn* When `column` is set to zero, column positioning is disabled, when `maxcolumn` is set to zero, no maximum line length is enforced. + g:ale_virtualtext_single *g:ale_virtualtext_single* *b:ale_virtualtext_single* Type: |Number| - Default: `0` + Default: `1` - Enable or disable concatenation of multiple virtualtext messages on a single - line. By default, if a line has multiple errors or warnings, each will be + This setting has no effect when |g:ale_use_neovim_diagnostics_api| is `1`. + + Enable or disable concatenation of multiple virtual text messages on a single + line. By default, if a line has multiple errors or warnings, each will be appended in turn. - With `single` set to a non-zero value, only the first message appears. - (No attempt is made to prefer message types such as errors over warnings) + With `single` set to a non-zero value, only the first problem on a line will + be printed with virtual text. The most severe problem on a line will be + printed. If two problems exist on a line of equal severity, the problem at + the left-most position will be printed. + g:ale_virtualenv_dir_names *g:ale_virtualenv_dir_names* *b:ale_virtualenv_dir_names* - Type: |List| - Default: `['.env', '.venv', 'env', 've-py3', 've', 'virtualenv', 'venv']` + Default: `['.venv', 'env', 've', 'venv', 'virtualenv', '.env']` A list of directory names to be used when searching upwards from Python files to discover virtualenv directories with. @@ -2418,7 +2473,6 @@ g:ale_virtualenv_dir_names *g:ale_virtualenv_dir_names* g:ale_warn_about_trailing_blank_lines *g:ale_warn_about_trailing_blank_lines* *b:ale_warn_about_trailing_blank_lines* - Type: |Number| Default: `1` @@ -2430,7 +2484,6 @@ g:ale_warn_about_trailing_blank_lines *g:ale_warn_about_trailing_blank_lines* g:ale_warn_about_trailing_whitespace *g:ale_warn_about_trailing_whitespace* *b:ale_warn_about_trailing_whitespace* - Type: |Number| Default: `1` @@ -2447,7 +2500,6 @@ g:ale_warn_about_trailing_whitespace *g:ale_warn_about_trailing_whitespace* g:ale_windows_node_executable_path *g:ale_windows_node_executable_path* *b:ale_windows_node_executable_path* - Type: |String| Default: `'node.exe'` @@ -2866,6 +2918,7 @@ documented in additional help files. astyle................................|ale-c-astyle| cc....................................|ale-c-cc| ccls..................................|ale-c-ccls| + clangcheck............................|ale-c-clangcheck| clangd................................|ale-c-clangd| clang-format..........................|ale-c-clangformat| clangtidy.............................|ale-c-clangtidy| @@ -2875,6 +2928,7 @@ documented in additional help files. flawfinder............................|ale-c-flawfinder| uncrustify............................|ale-c-uncrustify| cairo...................................|ale-cairo-options| + scarb.................................|ale-cairo-scarb| starknet..............................|ale-cairo-starknet| chef....................................|ale-chef-options| cookstyle.............................|ale-chef-cookstyle| @@ -2951,6 +3005,7 @@ documented in additional help files. elixir-ls.............................|ale-elixir-elixir-ls| credo.................................|ale-elixir-credo| cspell................................|ale-elixir-cspell| + lexical...............................|ale-elixir-lexical| elm.....................................|ale-elm-options| elm-format............................|ale-elm-elm-format| elm-ls................................|ale-elm-elm-ls| @@ -3134,6 +3189,8 @@ documented in additional help files. mmc...................................|ale-mercury-mmc| nasm....................................|ale-nasm-options| nasm..................................|ale-nasm-nasm| + nickel..................................|ale-nickel-options| + nickel_format.........................|ale-nickel-nickel-format| nim.....................................|ale-nim-options| nimcheck..............................|ale-nim-nimcheck| nimlsp................................|ale-nim-nimlsp| @@ -3250,6 +3307,7 @@ documented in additional help files. refurb................................|ale-python-refurb| reorder-python-imports................|ale-python-reorder_python_imports| ruff..................................|ale-python-ruff| + ruff-format...........................|ale-python-ruff-format| unimport..............................|ale-python-unimport| vulture...............................|ale-python-vulture| yapf..................................|ale-python-yapf| @@ -3281,6 +3339,7 @@ documented in additional help files. brakeman..............................|ale-ruby-brakeman| cspell................................|ale-ruby-cspell| debride...............................|ale-ruby-debride| + packwerk..............................|ale-ruby-packwerk| prettier..............................|ale-ruby-prettier| rails_best_practices..................|ale-ruby-rails_best_practices| reek..................................|ale-ruby-reek| @@ -3326,6 +3385,7 @@ documented in additional help files. solc..................................|ale-solidity-solc| solhint...............................|ale-solidity-solhint| solium................................|ale-solidity-solium| + forge.................................|ale-solidity-forge| spec....................................|ale-spec-options| rpmlint...............................|ale-spec-rpmlint| sql.....................................|ale-sql-options| @@ -3645,14 +3705,15 @@ ALERename *ALERename* The symbol where the cursor is resting will be the symbol renamed, and a prompt will open to request a new name. - The rename operation will save all modified buffers when `set nohidden` is - set, because that disables leaving unsaved buffers in the background. See - `:help hidden` for more details. + The rename operation will not save modified buffers when 'hidden' is on + unless |g:ale_save_hidden| is `1`. + ALEFileRename *ALEFileRename* Rename a file and fix imports using `tsserver`. + ALECodeAction *ALECodeAction* Apply a code action via LSP servers or `tsserver`. @@ -3825,7 +3886,7 @@ ALEDetail *ALEDetail* *:ALEInfo* ALEInfo *ALEInfo* -ALEInfoToClipboard *ALEInfoToClipboard* + *ALEInfoToFile* Print runtime information about ALE, including the values of global and buffer-local settings for ALE, the linters that are enabled, the commands @@ -3837,8 +3898,17 @@ ALEInfoToClipboard *ALEInfoToClipboard* |g:ale_history_log_output| to `1` to enable logging of output for commands. ALE will only log the output captured for parsing problems, etc. - The command `:ALEInfoToClipboard` can be used to output ALEInfo directly to - your clipboard. This might not work on every machine. + You can pass options to the command to control how ALE displays the + information, such as `:ALEInfo -echo`, etc. > + + -preview Show the info in a preview window. + -clip OR -clipboard Copy the information to your clipboard. + -echo echo all of the information with :echo +< + The default mode can be configured with |g:ale_info_default_mode|. + + When shown in a preview window, syntax highlights can be defined for the + `ale-info` filetype. `:ALEInfoToFile` will write the ALE runtime information to a given filename. The filename works just like |:w|. @@ -3871,6 +3941,17 @@ ALEStopAllLSPs *ALEStopAllLSPs* This command can be used when LSP clients mess up and need to be restarted. +ALEStopLSP `linter_name` *ALEStopLSP* + + `ALEStopLSP` will stop a specific language server with a given linter name. + Completion is supported for currently running language servers. All language + servers with the given name will be stopped across all buffers for all + projects. + + If the command is run with a bang (`:ALEStopLSP!`), all warnings will be + suppressed. + + =============================================================================== 9. API *ale-api* diff --git a/sources_non_forked/ale/ftplugin/ale-fix-suggest.vim b/sources_non_forked/ale/ftplugin/ale-fix-suggest.vim index 189a4dc2..42ade0fd 100644 --- a/sources_non_forked/ale/ftplugin/ale-fix-suggest.vim +++ b/sources_non_forked/ale/ftplugin/ale-fix-suggest.vim @@ -1,2 +1,5 @@ " Close the ALEFixSuggest window with the q key. noremap q :q! + +let b:undo_ftplugin = get(b:, 'undo_ftplugin', 'execute') +let b:undo_ftplugin .= ' | execute "silent! unmap q"' diff --git a/sources_non_forked/ale/ftplugin/ale-info.vim b/sources_non_forked/ale/ftplugin/ale-info.vim new file mode 100644 index 00000000..c2c794b2 --- /dev/null +++ b/sources_non_forked/ale/ftplugin/ale-info.vim @@ -0,0 +1,22 @@ +" Close the ALEInfo preview window with the q key. +noremap q :q! + +" Explicitly use the default synmaxcol for ale-info. +setlocal synmaxcol=3000 + +function! ALEInfoOpenHelp() abort + let l:variable = matchstr(getline('.'), '\v[gb]:ale_[a-z0-9_]+') + + if !empty(l:variable) + execute('help ' . l:variable) + endif +endfunction + +" Press space to open :help for an ALE Variable +nnoremap :call ALEInfoOpenHelp() + +let b:undo_ftplugin = get(b:, 'undo_ftplugin', 'execute') +let b:undo_ftplugin .= ' | setlocal synmaxcol<' +let b:undo_ftplugin .= ' | execute "silent! unmap q"' +let b:undo_ftplugin .= ' | execute "silent! nunmap "' +let b:undo_ftplugin .= ' | delfunction! ALEInfoOpenHelp' diff --git a/sources_non_forked/ale/ftplugin/ale-preview-selection.vim b/sources_non_forked/ale/ftplugin/ale-preview-selection.vim index 7ec84068..1ddd0abf 100644 --- a/sources_non_forked/ale/ftplugin/ale-preview-selection.vim +++ b/sources_non_forked/ale/ftplugin/ale-preview-selection.vim @@ -14,3 +14,18 @@ noremap O " Keybinds for opening selection items. noremap :call ale#preview#OpenSelection() noremap t :call ale#preview#OpenSelectionInTab() + +let b:undo_ftplugin = get(b:, 'undo_ftplugin', 'execute') +let b:undo_ftplugin .= ' | execute "silent! unmap q"' +let b:undo_ftplugin .= ' | execute "silent! unmap v"' +let b:undo_ftplugin .= ' | execute "silent! unmap i"' +let b:undo_ftplugin .= ' | execute "silent! unmap I"' +let b:undo_ftplugin .= ' | execute "silent! unmap "' +let b:undo_ftplugin .= ' | execute "silent! unmap "' +let b:undo_ftplugin .= ' | execute "silent! unmap "' +let b:undo_ftplugin .= ' | execute "silent! unmap a"' +let b:undo_ftplugin .= ' | execute "silent! unmap A"' +let b:undo_ftplugin .= ' | execute "silent! unmap o"' +let b:undo_ftplugin .= ' | execute "silent! unmap O"' +let b:undo_ftplugin .= ' | execute "silent! unmap "' +let b:undo_ftplugin .= ' | execute "silent! unmap t"' diff --git a/sources_non_forked/ale/ftplugin/ale-preview.vim b/sources_non_forked/ale/ftplugin/ale-preview.vim index ffbffbd5..75f3bb50 100644 --- a/sources_non_forked/ale/ftplugin/ale-preview.vim +++ b/sources_non_forked/ale/ftplugin/ale-preview.vim @@ -1,2 +1,5 @@ " Close the ALEPreviewWindow window with the q key. noremap q :q! + +let b:undo_ftplugin = get(b:, 'undo_ftplugin', 'execute') +let b:undo_ftplugin .= ' | execute "silent! unmap q"' diff --git a/sources_non_forked/ale/lspconfig.vim b/sources_non_forked/ale/lspconfig.vim new file mode 100644 index 00000000..0e25fdc2 --- /dev/null +++ b/sources_non_forked/ale/lspconfig.vim @@ -0,0 +1,3 @@ +if get(g:, 'lspconfig', 0) + " lspconfig is installed. +endif diff --git a/sources_non_forked/ale/lua/ale/diagnostics.lua b/sources_non_forked/ale/lua/ale/diagnostics.lua new file mode 100644 index 00000000..21f81e2a --- /dev/null +++ b/sources_non_forked/ale/lua/ale/diagnostics.lua @@ -0,0 +1,82 @@ +local module = {} + +local ale_type_to_diagnostic_severity = { + E = vim.diagnostic.severity.ERROR, + W = vim.diagnostic.severity.WARN, + I = vim.diagnostic.severity.INFO +} + +-- Equivalent to ale#Var, only we can't error on missing global keys. +module.aleVar = function(buffer, key) + key = "ale_" .. key + local exists, value = pcall(vim.api.nvim_buf_get_var, buffer, key) + + if exists then + return value + end + + return vim.g[key] +end + +module.sendAleResultsToDiagnostics = function(buffer, loclist) + local diagnostics = {} + + -- Convert all the ALE loclist items to the shape that Neovim's diagnostic + -- API is expecting. + for _, location in ipairs(loclist) do + if location.bufnr == buffer then + table.insert( + diagnostics, + -- All line numbers from ALE are 1-indexed, but all line numbers + -- in the diagnostics API are 0-indexed, so we have to subtract 1 + -- to make this work. + { + lnum = location.lnum - 1, + -- Ending line number, or if we don't have one, just make it the same + -- as the starting line number + end_lnum = (location.end_lnum or location.lnum) - 1, + -- Which column does the error start on? + col = math.max((location.col or 1) - 1, 0), + -- end_col does *not* appear to need 1 subtracted, so we don't. + end_col = location.end_col, + -- Which severity: error, warning, or info? + severity = ale_type_to_diagnostic_severity[location.type] or "E", + -- An error code + code = location.code, + -- The error message + message = location.text, + -- e.g. "rubocop" + source = location.linter_name, + } + ) + end + end + + local virtualtext_enabled_set = { + ['all'] = true, + ['2'] = true, + [2] = true, + ['current'] = true, + ['1'] = true, + [1] = true, + } + + local signs = module.aleVar(buffer, 'set_signs') == 1 + + if signs then + -- If signs are enabled, set the priority for them. + signs = {priority = vim.g.ale_sign_priority } + end + + vim.diagnostic.set( + vim.api.nvim_create_namespace('ale'), + buffer, + diagnostics, + { + virtual_text = virtualtext_enabled_set[vim.g.ale_virtualtext_cursor] ~= nil, + signs = signs, + } + ) +end + +return module diff --git a/sources_non_forked/ale/lua/ale/util.lua b/sources_non_forked/ale/lua/ale/util.lua new file mode 100644 index 00000000..98b3bbd9 --- /dev/null +++ b/sources_non_forked/ale/lua/ale/util.lua @@ -0,0 +1,14 @@ +local M = {} + +function M.configured_lspconfig_servers() + local configs = require 'lspconfig.configs' + local keys = {} + + for key, _ in pairs(configs) do + table.insert(keys, key) + end + + return keys +end + +return M diff --git a/sources_non_forked/ale/lua/diagnostics.lua b/sources_non_forked/ale/lua/diagnostics.lua deleted file mode 100644 index 9a3e1e4e..00000000 --- a/sources_non_forked/ale/lua/diagnostics.lua +++ /dev/null @@ -1,49 +0,0 @@ -local module = {} - -local ale_type_to_diagnostic_severity = { - E = vim.diagnostic.severity.ERROR, - W = vim.diagnostic.severity.WARN, - I = vim.diagnostic.severity.INFO -} - -module.sendAleResultsToDiagnostics = function(buffer, loclist) - local diagnostics = {} - - -- Convert all the ALE loclist items to the shape that Neovim's diagnostic - -- API is expecting. - for _, location in ipairs(loclist) do - table.insert( - diagnostics, - -- All line numbers from ALE are 1-indexed, but all line numbers - -- in the diagnostics API are 0-indexed, so we have to subtract 1 - -- to make this work. - { - lnum = location.lnum - 1, - -- Ending line number, or if we don't have one, just make it the same - -- as the starting line number - end_lnum = (location.end_lnum or location.lnum) - 1, - -- Which column does the error start on? - col = math.max((location.col or 1) - 1, 0), - -- end_col does *not* appear to need 1 subtracted, so we don't. - end_col = location.end_col, - -- Which severity: error, warning, or info? - severity = ale_type_to_diagnostic_severity[location.type] or "E", - -- The error message - message = location.text, - -- e.g. "rubocop" - source = location.linter_name, - } - ) - end - - local virtualtext_enabled_set = {['all'] = true, ['2'] = true, [2] = true, ['current'] = true, ['1'] = true, [1] = true} - - vim.diagnostic.set( - vim.api.nvim_create_namespace('ale'), - buffer, - diagnostics, - { virtual_text = virtualtext_enabled_set[vim.g.ale_virtualtext_cursor] ~= nil} - ) -end - -return module diff --git a/sources_non_forked/ale/plugin/ale.vim b/sources_non_forked/ale/plugin/ale.vim index f9b6cab8..47934fa0 100644 --- a/sources_non_forked/ale/plugin/ale.vim +++ b/sources_non_forked/ale/plugin/ale.vim @@ -14,6 +14,7 @@ let g:loaded_ale_dont_use_this_in_other_plugins_please = 1 " A flag for detecting if the required features are set. if has('nvim') + " We check for NeoVim 0.2.0+, but we only officially support NeoVim 0.6.0 let s:has_features = has('timers') && has('nvim-0.2.0') else " Check if Job and Channel functions are available, instead of the @@ -25,7 +26,7 @@ if !s:has_features " Only output a warning if editing some special files. if index(['', 'gitcommit'], &filetype) == -1 " no-custom-checks - echoerr 'ALE requires NeoVim >= 0.2.0 or Vim 8 with +timers +job +channel' + echoerr 'ALE requires NeoVim >= 0.6.0 or Vim 8 with +timers +job +channel' " no-custom-checks echoerr 'Please update your editor appropriately.' endif @@ -59,6 +60,10 @@ let g:ale_filetype_blacklist = [ let g:ale_linters = get(g:, 'ale_linters', {}) " This option can be changed to only enable explicitly selected linters. let g:ale_linters_explicit = get(g:, 'ale_linters_explicit', 0) +" Ignoring linters, for disabling some, or ignoring LSP diagnostics. +let g:ale_linters_ignore = get(g:, 'ale_linters_ignore', {}) +" Disabling all language server functionality. +let g:ale_disable_lsp = get(g:, 'ale_disable_lsp', 'auto') " This Dictionary configures which functions will be used for fixing problems. let g:ale_fixers = get(g:, 'ale_fixers', {}) @@ -191,9 +196,12 @@ let g:ale_deno_executable = get(g:, 'ale_deno_executable', 'deno') " If 1, enable a popup menu for commands. let g:ale_popup_menu_enabled = get(g:, 'ale_popup_menu_enabled', has('gui_running')) +" If 0, save hidden files when code actions are applied. +let g:ale_save_hidden = get(g:, 'ale_save_hidden', 0) + " If 1, disables ALE's built in error display. Instead, all errors are piped " to the diagnostics API. -let g:ale_use_neovim_diagnostics_api = get(g:, 'ale_use_neovim_diagnostics_api', 0) +let g:ale_use_neovim_diagnostics_api = get(g:, 'ale_use_neovim_diagnostics_api', has('nvim-0.6')) if g:ale_use_neovim_diagnostics_api && !has('nvim-0.6') " no-custom-checks @@ -238,6 +246,8 @@ command! -bar ALEDisableBuffer :call ale#toggle#DisableBuffer(bufnr('')) command! -bar ALEResetBuffer :call ale#toggle#ResetBuffer(bufnr('')) " A command to stop all LSP-like clients, including tsserver. command! -bar ALEStopAllLSPs :call ale#lsp#reset#StopAllLSPs() +" A command to stop a specific language server, or tsseserver. +command! -bar -bang -nargs=1 -complete=customlist,ale#lsp#reset#Complete ALEStopLSP :call ale#lsp#reset#StopLSP(, '') " A command for linting manually. command! -bar ALELint :call ale#Queue(0, 'lint_file') @@ -249,9 +259,9 @@ command! -bar ALEPopulateQuickfix :call ale#list#ForcePopulateErrorList(1) command! -bar ALEPopulateLocList :call ale#list#ForcePopulateErrorList(0) " Define a command to get information about current filetype. -command! -bar ALEInfo :call ale#debugging#Info() -" The same, but copy output to your clipboard. -command! -bar ALEInfoToClipboard :call ale#debugging#InfoToClipboard() +command! -bar -nargs=* ALEInfo :call ale#debugging#InfoCommand() +" Deprecated and scheduled for removal in 4.0.0. +command! -bar ALEInfoToClipboard :call ale#debugging#InfoToClipboardDeprecatedCommand() " Copy ALE information to a file. command! -bar -nargs=1 ALEInfoToFile :call ale#debugging#InfoToFile() @@ -349,6 +359,10 @@ nnoremap (ale_rename) :ALERename nnoremap (ale_filerename) :ALEFileRename nnoremap (ale_code_action) :ALECodeAction nnoremap (ale_repeat_selection) :ALERepeatSelection +nnoremap (ale_info) :ALEInfo +nnoremap (ale_info_echo) :ALEInfo -echo +nnoremap (ale_info_clipboard) :ALEInfo -clipboard +nnoremap (ale_info_preview) :ALEInfo -preview " Set up autocmd groups now. call ale#events#Init() diff --git a/sources_non_forked/ale/supported-tools.md b/sources_non_forked/ale/supported-tools.md index 72b45671..6431cfe6 100644 --- a/sources_non_forked/ale/supported-tools.md +++ b/sources_non_forked/ale/supported-tools.md @@ -76,6 +76,7 @@ formatting. * [ccls](https://github.com/MaskRay/ccls) * [clang](http://clang.llvm.org/) * [clang-format](https://clang.llvm.org/docs/ClangFormat.html) + * [clangcheck](http://clang.llvm.org/docs/ClangCheck.html) :floppy_disk: * [clangd](https://clang.llvm.org/extra/clangd.html) * [clangtidy](http://clang.llvm.org/extra/clang-tidy/) :floppy_disk: * [cppcheck](http://cppcheck.sourceforge.net) @@ -110,6 +111,7 @@ formatting. * [gcc](https://gcc.gnu.org/) * [uncrustify](https://github.com/uncrustify/uncrustify) * Cairo + * [scarb](https://docs.swmansion.com/scarb/) :floppy_disk: * [starknet](https://starknet.io/docs) * Chef * [cookstyle](https://docs.chef.io/cookstyle.html) @@ -177,6 +179,7 @@ formatting. * [dialyxir](https://github.com/jeremyjh/dialyxir) * [dogma](https://github.com/lpil/dogma) :floppy_disk: * [elixir-ls](https://github.com/elixir-lsp/elixir-ls) :warning: + * [lexical](https://github.com/lexical-lsp/lexical) :warning: * [mix](https://hexdocs.pm/mix/Mix.html) :warning: :floppy_disk: * Elm * [elm-format](https://github.com/avh4/elm-format) @@ -389,6 +392,8 @@ formatting. * [mmc](http://mercurylang.org) :floppy_disk: * NASM * [nasm](https://www.nasm.us/) :floppy_disk: +* Nickel + * [nickel_format](https://github.com/tweag/nickel#formatting) * Nim * [nim check](https://nim-lang.org/docs/nimc.html) :floppy_disk: * [nimlsp](https://github.com/PMunch/nimlsp) @@ -513,6 +518,7 @@ formatting. * [refurb](https://github.com/dosisod/refurb) :floppy_disk: * [reorder-python-imports](https://github.com/asottile/reorder_python_imports) * [ruff](https://github.com/charliermarsh/ruff) + * [ruff-format](https://docs.astral.sh/ruff/formatter/) * [unimport](https://github.com/hakancelik96/unimport) * [vulture](https://github.com/jendrikseipp/vulture) :warning: :floppy_disk: * [yapf](https://github.com/google/yapf) @@ -555,6 +561,7 @@ formatting. * [brakeman](http://brakemanscanner.org/) :floppy_disk: * [cspell](https://github.com/streetsidesoftware/cspell/tree/main/packages/cspell) * [debride](https://github.com/seattlerb/debride) + * [packwerk](https://github.com/Shopify/packwerk) :floppy_disk: * [prettier](https://github.com/prettier/plugin-ruby) * [rails_best_practices](https://github.com/flyerhzm/rails_best_practices) :floppy_disk: * [reek](https://github.com/troessner/reek) @@ -595,6 +602,7 @@ formatting. * SML * [smlnj](http://www.smlnj.org/) * Solidity + * [forge](https://github.com/foundry-rs/forge) * [solc](https://solidity.readthedocs.io/) * [solhint](https://github.com/protofire/solhint) * [solium](https://github.com/duaraghav8/Solium) diff --git a/sources_non_forked/ale/syntax/ale-fix-suggest.vim b/sources_non_forked/ale/syntax/ale-fix-suggest.vim index b112f5b5..19734f4c 100644 --- a/sources_non_forked/ale/syntax/ale-fix-suggest.vim +++ b/sources_non_forked/ale/syntax/ale-fix-suggest.vim @@ -3,7 +3,7 @@ if exists('b:current_syntax') endif syn match aleFixerComment /^.*$/ -syn match aleFixerName /\(^\|, \)'[^']*'/ +syn match aleFixerName /\(^ *\|, \)'[^']*'/ syn match aleFixerHelp /^See :help ale-fix-configuration/ hi def link aleFixerComment Comment diff --git a/sources_non_forked/ale/syntax/ale-info.vim b/sources_non_forked/ale/syntax/ale-info.vim new file mode 100644 index 00000000..d47b58b8 --- /dev/null +++ b/sources_non_forked/ale/syntax/ale-info.vim @@ -0,0 +1,30 @@ +if exists('b:current_syntax') + finish +endif + +" Exhaustively list different ALE Info directives to match here. +" This should hopefully avoid matching too eagerly. +syn match aleInfoDirective /^ *Current Filetype:/ +syn match aleInfoDirective /^ *Available Linters:/ +syn match aleInfoDirective /^ *Enabled Linters:/ +syn match aleInfoDirective /^ *Ignored Linters:/ +syn match aleInfoDirective /^ *Suggested Fixers:/ +syn match aleInfoDirective /^ *Command History:/ + +syn match aleCommandNoOutput /^<<>>$/ + +hi def link aleInfoDirective Title +hi def link aleInfoDirective Title +hi def link aleCommandNoOutput Comment + +" Use Vim syntax highlighting for Vim options. +unlet! b:current_syntax +syntax include @srcVim syntax/vim.vim +syntax region aleInfoVimRegionLinter matchgroup=aleInfoDirective start="^ *Linter Variables:$" end="^ $" contains=@srcVim +syntax region aleInfoVimRegionGlobal matchgroup=aleInfoDirective start="^ *Global Variables:$" end="^ $" contains=@srcVim + +unlet! b:current_syntax +syntax include @srcAleFixSuggest syntax/ale-fix-suggest.vim +syntax region aleInfoFixSuggestRegion matchgroup=aleInfoDirective start="^ *Suggested Fixers:$" end="^ $" contains=@srcAleFixSuggest + +let b:current_syntax = 'ale-info' diff --git a/sources_non_forked/dracula/INSTALL.md b/sources_non_forked/dracula/INSTALL.md index 7fc0247d..52143b47 100644 --- a/sources_non_forked/dracula/INSTALL.md +++ b/sources_non_forked/dracula/INSTALL.md @@ -2,14 +2,13 @@ #### Install -These are the default instructions using Vim 8's `|packages|` feature. See -sections below, if you use other plugin managers. +These are the default instructions using Vim 8's `|packages|` feature. See sections below, if you use other plugin managers. 1. Create theme folder (in case you don't have it yet): +- `\*nix`: -- \*nix: -``` +```bash # vim 8.2+ mkdir -p ~/.vim/pack/themes/start # vim 8.0 @@ -21,9 +20,9 @@ mkdir -p ~/.vim/pack/themes/opt 2. Navigate to the folder above: +- `\*nix`: -- \*nix: -``` +```bash # vim 8.2+ cd ~/.vim/pack/themes/start # vim 8.0 @@ -34,9 +33,10 @@ cd ~/.vim/pack/themes/opt 3. Clone the repository using the "dracula" name: -``` +```bash git clone https://github.com/dracula/vim.git dracula ``` + (Or use your favorite GUI client, or download the ZIP) 4. Edit your `vimrc` file with the following content: @@ -50,16 +50,19 @@ colorscheme dracula ``` The location of the `vimrc` varies between platforms: -- \*nix: `~/.vim/vimrc` or `~/.vimrc` + +- `\*nix`: `~/.vim/vimrc` or `~/.vimrc` - Windows: `$HOME\vimfiles\vimrc` or `$HOME\_vimrc` #### Install using other plugin managers - If you [use vim + pathogen + submodules](http://vimcasts.org/episodes/synchronizing-plugins-with-git-submodules-and-pathogen/): -Navigate to your vim directory (\*nix: `~/.vim`; Windows: `$HOME\vimfiles`) +Navigate to your vim directory (`\*nix`: `~/.vim`; Windows: `$HOME\vimfiles`) - git submodule add git@github.com:dracula/vim.git bundle/dracula +```bash +git submodule add git@github.com:dracula/vim.git bundle/dracula +``` Place `colorscheme dracula` after `execute pathogen#infect()`. @@ -73,7 +76,7 @@ Plugin 'dracula/vim', { 'name': 'dracula' } Place `colorscheme dracula` after `call vundle#end()`. - If you [use vim-plug](https://github.com/junegunn/vim-plug) (\`as\` will install -the plugin in a directory called 'dracula' instead of just 'vim'): + the plugin in a directory called 'dracula' instead of just 'vim'): ```vim Plug 'dracula/vim', { 'as': 'dracula' } @@ -83,7 +86,7 @@ Plug 'dracula/vim', { 'as': 'dracula' } Place `colorscheme dracula` after `call plug#end()`. - If you [use spacevim](https://spacevim.org), put the -following in `~/.SpaceVim.d/init.toml`: + following in `~/.SpaceVim.d/init.toml`: ```toml [options] diff --git a/sources_non_forked/dracula/README.md b/sources_non_forked/dracula/README.md index d84d6db8..9d6ea3f7 100644 --- a/sources_non_forked/dracula/README.md +++ b/sources_non_forked/dracula/README.md @@ -4,8 +4,7 @@ ![Screenshot](./screenshot.png) -Screenshot taken with the [pangloss/vim-javascript](https://github.com/pangloss/vim-javascript) -syntax plugin for javascript. +Screenshot taken with the [pangloss/vim-javascript](https://github.com/pangloss/vim-javascript) syntax plugin for javascript. ## Install @@ -26,6 +25,10 @@ This theme is maintained by the following person(s) and a bunch of - [GitHub](https://github.com/dracula/dracula-theme/discussions) - Best for asking questions and discussing issues. - [Discord](https://draculatheme.com/discord-invite) - Best for hanging out with the community. +## Dracula PRO + +[![Dracula PRO](./dracula-pro.png)](https://draculatheme.com/pro) + ## License [MIT License](./LICENSE) diff --git a/sources_non_forked/dracula/colors/dracula.vim b/sources_non_forked/dracula/colors/dracula.vim index 9ec78c53..1725352f 100644 --- a/sources_non_forked/dracula/colors/dracula.vim +++ b/sources_non_forked/dracula/colors/dracula.vim @@ -210,6 +210,7 @@ else endif call s:h('DraculaDiffText', s:bg, s:orange) +call s:h('DraculaInlayHint', s:comment, s:bgdark) " }}}2 @@ -283,6 +284,7 @@ if has('nvim') hi! link LspDiagnosticsUnderlineHint DiagnosticUnderlineHint hi! link LspDiagnosticsUnderlineInformation DiagnosticUnderlineInfo hi! link LspDiagnosticsUnderlineWarning DiagnosticUnderlineWarn + hi! link LspInlayHint DraculaInlayHint hi! link DiagnosticInfo DraculaCyan hi! link DiagnosticHint DraculaCyan @@ -294,6 +296,24 @@ if has('nvim') hi! link DiagnosticUnderlineWarn DraculaWarnLine hi! link WinSeparator DraculaWinSeparator + + if has('nvim-0.9') + hi! link @lsp.type.class DraculaCyan + hi! link @lsp.type.decorator DraculaGreen + hi! link @lsp.type.enum DraculaCyan + hi! link @lsp.type.enumMember DraculaPurple + hi! link @lsp.type.function DraculaGreen + hi! link @lsp.type.interface DraculaCyan + hi! link @lsp.type.macro DraculaCyan + hi! link @lsp.type.method DraculaGreen + hi! link @lsp.type.namespace DraculaCyan + hi! link @lsp.type.parameter DraculaOrangeItalic + hi! link @lsp.type.property DraculaOrange + hi! link @lsp.type.struct DraculaCyan + hi! link @lsp.type.type DraculaCyanItalic + hi! link @lsp.type.typeParameter DraculaPink + hi! link @lsp.type.variable DraculaFg + endif else hi! link SpecialKey DraculaPink endif diff --git a/sources_non_forked/dracula/dracula-pro.png b/sources_non_forked/dracula/dracula-pro.png new file mode 100644 index 0000000000000000000000000000000000000000..559212a785685357e5399b4216d8e82666fb7d4c GIT binary patch literal 339197 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%0D|6Zq16NaUo2IeigM zHAa19dG8W0{Cd{TiqD7;w|nB5bx6%^5?WDm`dT<9wE0a3j-oeJ$d!7tcvA1tY5e+E8g;ph_nMI zX?_3!3R%Q0L~D9~q%J5H&%J4iv6tlg%c~zjy|{{}0az*TqAJ#!e88wb2d(Yd3pv%UxtQRH{jH zgMU~6oM*0%tNMd7?OVVv2)#G=SW6NRT$@SamPmH|W?c(j<=|VT8z4R>i(pl`Z z4A7v_PVq#q{F#yniq)AJ0*9hP_pNgM)kfgQC%TZ2`GWwn@e){B#te7=?t>noAs@}Z1 z?8F4ABMaueox3Ys@{R6F9a8<(Rp({1(ulyZ$ zACylo=wjIPwUCHeGs?gP$5h53p2#r`aEo(8cLGn z7$chw6N0w^P9S(l=l!=Tlgp4`R1~KWXBN1=9HW zFRYjSols7=E{+JN|E^xS2Y#`v@aJ@>tq~Nv>0R%2to>Y%+tMp*)tK0C;BC;8n3N8CH z*|+C>`YA0g?rnOS%EHH?*!dZZLlesBPp&zD-5bJ2b98WJ*+eAF>mhLL(LdD4PVA1` zyj2_fJe5Wh$Q}g7J*-y~H#i8M+W!J2$uN`2sHMd ztYa8!Hpr2muCE%HQvg@h!BHX~0(!80C-?f)+)gk^AncLqFTrl42T%D=D?t4KM9c=1 zFSI^@c1I#ZWMldwE9Z7QQ4mH(RMAIHnH2XL|Mv%b#8Za$ki$nJorYY;mQ0{dT-`JC z_@ku4S4Wy0O)VPBveG$W6zH-Jr%x2e$7ijq)x=$ugsb|_7ww4l>0HIRJCKF*zN19? z*QDE^?9p6wYI%h1;+J=f=Arql`DF`nhP~S^c6DG{O5OEQSS+1Mj8ml^$`y-GB0kwdKV<@oo8^#&-2zmT1(OnBM4#S!iITm1D^}rkfDqDui|As@22?@hL zSoK!2^uCirV?-_!_F0MUC*}=wvw`IEJ4RfWPg!TY>G<7#f1R6S5iQ=?J9zDq2VT>T z*U^&2&bfpiLggw(WiNu(t-)omaS^u*Lf?vuY1oDzI~K7gpQ-4JU8fL6@q$sG(bXEB zlr7QzcRt~2A~Z;($tU=#E%>hnw|Zg|))AT_IUh9PTX|-54PaV4!f3!!Zi%_^+JD8D z#_bNUBj!wWb29H0-IPeHEi^-(-YeiIEqbkByDoSxtF179W8wlV4DpgL`G^l(wG3nW z&ccF_P+&5-aFo9e`)q-WEv=shY#FMHqc_hqW}!GXY$ed2-%9}1{#yEyqgJSjka8~T zu?whNC@7(#Xa4(`fNCmp@=$2^FaKw7-hC<_{r1W6zw>=B9Qv)`GPYisXZ=k04Noku zSX!9;MR`BN%n;Ho%1nWTR!>sv4Y(G}i@;xwiN}&ECi=SL>BO~1fy!}R^gPM^6Sv-y z6DB_MPOlPtT)%wwlf5QV_j2*MK?=OWz#oBHKJr{&IJV-mhALICY_2>>dhhj-G2bed zlqIzB%q~*4_fsIXz94YSI4KLd(>0T#|*7r^R8`<7bp z)ILcz88hS0{nd*C<56?h=N=OPj%Y|!pp<6w;&y8_y(kOG?}-lA4SP-SE(o$6&F(hO z7de{3g)Zg7=&m(7%d#1r;@zkDf=N-Jh2qy>s9iLb1D<>g;ID1c#c3kH!q!k!ZBvw% zsSo!jCNNVvgf`IVhgU;qdilD-0LcG@3h z1lD0Wsn7ZEKd$^F4iUk+N1GggrB=0P5o7b)*Ut!E3P}W>A>4+)dQWj$f6R7Z0ow@u zp(0B~ac4l9#0tG9QFtmM5mzHnQV8!Lk!9w+{#}RFdxq6l7QU z&a!POfkBH3`0wbipEl735UK8V{AX!Cu{x0aBA@YVRPTT->s0=}wf&W+i~|-~k*=F~ z&gCQZd0^@ITN=8zV7_AU$3MtzQhy}UCNfhNpzlRHjyBq2_R?rl{KiG^5O`tgg<4h_ zWbcSw@EDHr(0W;s$??O= zVBt<4_47w;Xe)Ge&ZDuR>`nFw*3F|}m38pTIW;wR4XC>I=iKgvPK`(&by8V{Xum>@ z_W={#YMjk{TfI``0ug&Ifeu|>g?LMhLVDcG-#*1sr!wh9!dNV)7E8;d!Qxg_oW z{l`a^)E_|`U`6<{jBnG9e@_U6r$2at2w{qljvOU;PGa&Mqhp>FWJnjFccjo`*nK(9 zKolkNMb}{^ieM{ zOWza}T@M#}|9sXqJJrCtuFTw-Dmj^GN6F)lFgoWuAtWFve338;cm`~I3*hyRdqv-EA>HxsQmXY z9&2xrgN>`4peUXJg?@B52KAMW`gM#798JRl(|ActXmobULzOj32Vm|<-IBPG}h1llBuRewpPy%U)>2Mqkk$fzeSO!98`pQ|la=B9wtUUM7me!7~CvrAx z0aF6U$uOC);zyqhH^HuK(&v;F?lO<3F>@Mxvy zck&S&-mkG%mRWFov0x{b(MaOKU9TfnEdeQ@Y8h|@g$EegX~S#tA8SRM4QwqO+9i}% z8Z=Bg!>N?b-mBY6O~%i1wP((l#nU1;pvSd>v$*mE=;O%iug7SG`s>^SsB3zS`_DHN zGZ^Nl<@Ae1ZmW&W4|R^(|Cnj+Z3-&=ETLcai@IEydGcDG#3FIJk$CFrZ>E6KIUi7u z{+J(&W@X0V7bF4@c0ijyt-DYxiNo(w-?8h*w)%qde@&3d;Wed@^^87}CrgUd;oP90 zM~E-CERh*+0h3Yra=g1CXR*>7Qk+WiFpd7X7;|ij_!oPqkA{f}UkL8|I%U;@$zWSR zL$C0GQ1j=s-S@8{TR%?)1xozo!F}?Qg{||a+Isy_F`OjHv=b+2OP6Y{289i4%`1e> zs)A=A^h^i%T$U&?l4clMx(1K%c$JdgAz2w(W!dl7-G8(ry`_NfZn)(eo^YW_(s^<8bwdg&R%J&JzX3$nL{ZoafLmnKzBy z>zuSI%KVM4*OoD!pTgup_PxH~7QG@#-^=K7Mpwf29K+qv8#%O&_1y5>t55T%0-fkM zYw<`rz62l_8H)DnY7u;e3+H~!{@IWA5Y9=<(3iR-dw4^y>wH92aJBOvz_V}f&sP?RmT_H7PbN^6R`)>hqt++te zxl})4(6w#i1$5HsK$ldT^U{~2V*c7gMc!4T|LkUm^&9TK=C=N2XY;o^YsJH;0$ArD z%V~~#b+^xwG<9cJYduBVWwo&<9gQu#oEnvpA~^g;5DP}A10f#mqB$IHv&zEL2O`2R z9!N`kl(8*Qp^qjK!ro4DM}E$p3Y*1BgJHf8Shhk?K>87w#S3lfYQU-GM<54k;m}V} z1a%2gQTdz4N;n`^xSEVI*A&e^KCt%b2rB@Fw z1h*cO9HR2SYeT#Gzu6<3ys*ms$jhRG$&W|#}E6ni=Sfur$827XV#UO#M)A{(CYLZ z!`(Oa3AU3FQM9di;?z-~M##Ot3 z-i5(g4%itjnP9KrO`rl>G!=i~BNdX?tkZqh(C4a5dCgFDlzrnG>z)r-$fJPNVeH7L zzbw(m6oKGl0JpAr6krwj$=_tE97scX`ircjdg4`SWJSm0Ya)h@+J$2Ten>|->+%Hj zBkDsrYx^V7OK&_>*_}biTv%PI%)&d53Nm5E?*) zW-X}0^YbPn&hQH%ceU#)pe+-}ZFs4vWXEjau&iwOGp%!|H z7t5F4=eiikT$bTXK=WPCt{j?=p>`NqjiWk=Q>@&zR59vo8GdR+6j9yRuQj z`ZtU~-KGrw0@EjZa0n@t7WJ#TN|IvwKpEd>@|5h(1y0wHX0{kFGw4&Cjgr{Jgs*^ zK>^W%n;o2JmC)0FFo3p-Z+dGgW`DQ<(Uu?|wn_F{gBB2N0zdxQx6$f}dTTpWH{19W z{A-9@S_Sog?~1_Y(#1zJU2`36c@Kj+8RM&=d8-49?89SYCE4f&0`0f|@v;2*phQ%u zWcp87^+BLwY0s~b6l#GIyguknWK??d-c;AGSZqu7R}}j$r7I5L9YWUz@DKh>pT) z@{jpbP_GBFYGvS_&FFu@AbWm~@~ASrrfpmKpV%E=iYF5eJW|NYRw!G|NP3}X+-Uhb zB1CNO>0vK(((|IOl!zSHl8UXiV%A^j3~EVilVo;FXE%G;{jDm@xc0*d%OgwD*VvwV zErk^DzwH4kUvAuOxRJ8<98XT!X|(`zjM|VOc}eS9vY@xD?+a|vl7L=8H!thoLcrCzBo_tu z64DHLW5n#^iHWB3dQT);#utI1$f(KEci6~}wMI?wQ*z}yI5Jh=sM>&Vc*!6szV{vX zVH#`B*I*l(?Tno^W8!1-(#u5!yfBHVa-~qWRO}{?E6Gf^1UVW0iJ-Ci2C!FW_{I(d zy~*L(rc+C2+`%7s{$4F1;r@1+{#(S)k@U$`ur--yuL$KU72-|CDl58|4)9F`y42ux z>^E4ci0fo`5&hws?FyO)*X|gppA>sN3~1$LAyCFMJh;DmC7Y$IK!Gb}#*A+t-}>vu zO48PzAokq%(d9_B=Mz%TB{b_D^^PFuOw8M==YErA5ctxru=_hpc947dT4qbe>dd9G zCv1VH?0o*z%N6z>sdMgW5pgdWD*2Qmcx_J@c(Wye#k~}f`zC%i_y$DSZ3P@oiV}f5 zIds7uIJ%1Ja}`lL63rI*W-huC6M#xQzjM=9fQ<36j?-x8$Xa zwLK^H4}r(`?jW%cGc4@NNI`+KjLyojF*0oCDzrPWFEuV~D8g2}tF+(@Dc<#Y{=ggV z@0hW}K+w(#T~Js$(Iv(55-%y#M0%yiHvqU!D%ZSeKUnyzv>!idf>$l*kL8};zL2Jp zw0d+0@KQrz$qou+r~~bG0qbrWPRO8jpIb+g}qp^dUY0o)T#R{Z{X>N$_%z4ol#%GWYeB|{$pU2*nkkm9db z)AFxkN7=zP^yuEdQH*3e^VfgKq(DGViq8PxTg){F98SCh2R1I%Akv?4HI)T**acg# zkCdB$eWn9Dyq10D|9Cp{a47rlkALo&vF}^k~_4_L{%*=Jo=X}n2pL5=?CRHWZH^B5W zhA|Cd`~l-?+KNjjv|1mA1!opuXHKgwgOf?o?>@DSp)cTHr0iyM%@C7oXb8c~9v;o$ zR9m0Mab7@U1)~uGWzAHzCt-;N4{0l_c!XS=Jy>KEK)J6X~0k zJQ~joW#L}1IJAu3?yGv#8=%T*vs z3fk)(L9&QpZu927?PXVy;5QT=Nu25w&u5xMey1+E z;ofNwtN5zYAbZL$2;LrsS?h(EynqTk7tw?CXu{7737GXe*PlkZQIa=ucv9?0I5mXZ z#6?HV)I?8y0^Su=S?IKjVQm+kBK4ie_qr@a>;&k9Fk2crzGLZx&=a`wEMI2FoAcU> zORPG9;8?_bf3aQlPIYK^OXf(_)GlrlC5bB5(Edr;GZ#_Y#YGQ{KFjXB81E8K(a3!h9p zwf@5!9NB&WF#M5S6=RhMAT|H>zy=A>~taBQr(;6g$Aw zU-=sf-eX_Kg8+!Fw45y2@F!^gA}w2Cuv*>=3Ae@*PL9d>E7|I+-4=&#s79P${6oD4 zL76W_h??TA0|YE?jT5E#t=;Sd#$%-6QCLoq=hB`(O!`>frN#bww9R|~wp;K$(mA1$ zP@1yMag-J!d&n{<-VzjvF=h~LJumHM_94{?sIoX+KAOlK2 zV@gcogV*xH?fIm_)VQZ>jAbixdJcPnNmm9I6BJ+vo%+!HJ#p0C3yRQ#75I5y)G(YA z;1ZC({sQ~Egh4P|=^6d4eP)qrfl>Yu@(}Ffm}k|8nEy~HRP1;8L|7%*F@cQw1LkaH z!loHCNo@7Iy&G16_;cNYb4SPtBgpd>{b_jRHVw(__#q9Os6%c%D!B^2vkgO@5Gb32 zR2d6fmZrG8KJ1TWOM{k3CGD4rp$9I4zILtu^1*Its7*y!-Q zQ|Atk+1E}HmHaoIc;V$I$ld_1!>PSpc4;n{t~y=Dd$~s50egAeM|@-Q!_FlufRR~o zw>i0so+5sD!3{pJ4@9--!U_nJPw?}Z5R-e_E=ah`Ni!2viKdSrmF7CheAFGOd-D>`XHEk&#s$eUc3b#d^Lv5-a*7s!}z)kYJ|dzr(-zz zlr4gxBMnGqJh9y3vFEqJ3wj|Mn38(xsUga{zv0+;^)2$~j75KwQwaK(tc(fo*LY#C zdh?n&IdJwfc#}C8!L~FZ+X_Up?%s?4v|*M01FdUfj6rDkUH7Ypg1E)n4WUGU%qBDz z(ksTkEKp=u96nJF+SVTf%D`hl7WO5XVU$mJDbzm%_s6MeM-7OD9?J{e^ewB9NICKJ z9(1T3-sv8UV;{k-B#YghPKyM)K7$rw`~_mmvvT;k6hn$Xi2gg8*G36`wQLlCg_;j& zeVC<=Xj0~nV{rldL8P@~eGu?JNXk7QJL~iQ@tc-z z&6btaiXgFj#S*so|Hy*+UsBJ>uaUj%%hi_#1G1gEDzN>efg42@Qf3n{{2m1iVd97g zbn_}Ebb_K}1-bqq{PLmLoU3W5K+aBtTp<*T4&4M*{Y&K-au2-^bnZuz%9ir#b|_3u zoPW=BOvWylny)1vK#>zquA`M?6KdwR$zEOtx;|QY@p2%#D%WI(ZVAy977c!?z*!K- z(h}!!%Pu~tku$iNaxHk-a*S$)eKi3xKGNWJ>_8P_(F9OWI4tXo`5+& zL9q+sbeV3EwkWg`*``KbZs|;j*Elb_Eqzq(?i7W=Eb{?>ro}W2@Pll0Ix~qXEBkvm zZk-CkC_C`6}`1U-x~nL z#y?XfW5Zuc#FcjWC17I*Svbmb+8spc2f>lDd!69NGx}Y1iIgv7?7X-VKxs<(<7vA^ z)^c1Dkr_2&j$bcWr%3b$DLSr=4ONr_fl!I>F=# zv058fD8VN^R$2wxp-iB=1*-W4 z&7UyAxhCmMhMSNrg*c1(j~kQ5$w@teYP(oA6Xd-4-2-E;~gg}EkMcVt%yGt zbxl1`PQ`K`PVG?TI*-230T%(;m`r|*Q7?tBeugZ}d_m~PpUBK&jdL!@-zeY3(_Zgd zCJ4Mtu|EVqLLBPojaMjW5gfSiWq@Ay8>~*(u`Je_JL37 zLj}~h5LKa7yX2vEh@l4zmqKuaWU+M>g6e8IeG!c7qep%!0EH-~t-v1lIhcn+w8$FKI z7N%CHNwrV(oC)`>Ff~JwCBf4Di6b>q=yJBu3=n;UZza!&%00I-X&Ny$8OZ+L!xG*~ z?4MmaM^%OO%#~_QDnsa3onWAY9yVk(dffj*EA)=4q24sYYqBJKuvzGDTQ%3t>R*^s z%|YYBa+j%)lH$YqtRE_9lL{Rh@LKen3+A2+BW|vC_whnUjnOHTd(uBh8@>k9vHXUw zgyY!JFj0>m)OPL>NexcO!NbU@$9}t@d^?65Mk|)=4thC(`{2R=;vIh80XREU%;KCg zGb8o@T*VY|J()|lSTkp|E4IUcsn(vShVJ5`GLkc$xih zyEt6LA6CzrGg@;R=*V6d1J~0_LL@Ta6Tp7;Hv%DIm~Q%Wwzzi?k1l}VWN!CE434iLYMU1K$U7ldzm;My}Tmw1SnW;QAAh+i$r{%ToVGPGt#_YvE$ z(tyo6KdozKtCiP(@r4vr=3=-n`O*(`@X4xnM=k{Zi1$d9XEVRxe|ky#VodIC#;!Df ziI343Bk8TkseFb9_OWGlesn$Q7@$%9=1Q?_x&vnA76y_&CC!i#ljg{^K@}&Zi5`dq zyBRB@`~iHLrtU_;7j-kHg#FH_LQj^+;?$5NLHWdG6*%OSsiQE*d&OH3wJr;uuGH87L$}>jdaKfoU1Bc?lP; z1Ld;D>R{W8vCjk>b2G{yU>Jf!GY%i)7Tyd&oR4%>@dx*2n$^Th)QFD{<5ugo5GLha zHKDJ`$FgYWKN0{c0t^vpIl*&N!-zPpP49V19u^k$!(11UI5|Kn68kuCoG_w7DT|mx zs*kPTH;=LnQ0&Nk3!Jw%`S=+u@fJ9QxIaon^E%Y^IXN_prNk-rq9jld4q>xg-^ZC8 zHSo(IwTTB| z_rwk1)(5;svi?ZYy7>(wR>#GNsplZ?1a$I7+{fq`K$G*lA26n8<(eb7h8=B379Z3d zKPNl%T#ANj&T%zSppNj3tU{`ui&sd`RfMzW=Q= zQ@_OS_7|NOv|0~M*NA-nczEE&YgL}c-6{t}ivGwWmHoaX3-dakfRT(zP|R^yL{>Kl zSa^U=;-~8p56Oy*S`L71|A^rir7_aW1clk}i!2MUO%hJVMYJ-dOwnpTYjGHfR3?Ur ztX+l3?D|z~aGB7+8`OJIY=ydM|NU}VM-H>S_MP%#`%n5yX_0n``LrJXlk4l?ADbbA zK`Th(+bb2~Tfcbt;Sq|uN_=)V;ft7Kab6eVC@nr6E052`oa9n&-$KU1lBDEce34L; zLf6(d&71TYy=4YurDw*i67hfWks=8`E(`2AMlG8O=sso@#qKatss?J@PuzmP9$3pu z+xP)iK)+OotUhnA^zd$GhC$Fk0OSM2qSkK;0KWRcI$_uT)(?Ki{wV4o<<39!fOc3 zL5=I^+fi!IbrHd1E3U>}sXekW{hbx3fd3JA&ohdsXRS4_qljL6?_0;?d&um?Hy0-k z`HP6<+#VkNh8k~%*`z$06S5Idn#j+yZGlhGX~<`a9Sjtp@LNkX8iHbyD*2rB4{-eKBXPmi5>B84sT@Hk>w=byRL`~R^sG2sL-v-kcBJWHBE`gi z5#cwot_8CHPC+*FRit^ljT~V&VWQQgYNtK&Fy#1^YXt6NoA12AU7en>-(@6n zbEEv$J-jl7GXv=Ur8^M%#5NOw-goE9ff zcX<<3Is45)NhHNO^UdMA0tmY$xSWsGX#3G zvCGJ~kN>}3eEUY7bH2>8yj!1iWJJYP;Ss^skCgL#8jOtX1D5g;D^H4Rmjum6g`t5) zpgXRCw(9>oMfWBTP&-%T_Lio7*Bt7Ggy|{^<)^e4xwHmHb-&NP)?e;!B)n-+8BtFL zByp%8fhcP5F4YjWwIGzdt`s5hmc3lR%h5cu;-ey0)yzyfv41Qej!80=Xg=yiaXNv~ zS$Da@_~Gf9;+-2*dp1>H1iv}BuZbJ-@0})}SeOf4<`;xc6jPru7oJ~~Tgx;RaW^C- zXqpSMu2!s-BG^Q(Q3o+2RVqJJjd&VD+jq3&b#qh=v#~(FHj^oY`f%rbv^LOUe-VY2Ydd==_Y}y*X_Z~Y z>>QBG&-gV?7o=zqckxcF0%?$%KIj&tz2X!E0})xdZHpAF2s&W4Gpz+l{X``~RxdPZ z9}R%Y1ih2z_X*6#h_|e}2#Y96`A85-M8qZPq2=CH^bfR{mK)sj)i6!n($-rG&cLV&g z(TL&xhTTd@oN!<2TWPa-!!8@*tLoTbGYv?|!k?iJ#=L9VkNz?u(NR2IyARQwkmURv zX|7!;h-O!3#6i8GTbH@sy$ModOUF55^tw+}LBY6W=)7RF1h4F3ytHKgYpi^{&N_#* z4(#b&n1j(2udZ4Bj^1jsE>1|x4SMqm$wd@OW$&)bPT^fVpJs=YNZ})Qk3cC;#zJtM zO%7(GA&Hjau6o21mR#|ZnxJ8&tcvn2lW+bV=&w9soaFPJ;d2Z)N*iCsE32Z%zMQ7P zsU@UW9feQnCMXKx3OXih5A74^R4ewUiGoE}2E|sTRd8dJkdy_ICMj8OAPYVzh`*~{ z=h%n+K;`M0k}caM;iKTAp!p-+OdOAme{oHetxHV!g*=UnGvFg)fCg)UkZ3qwh#HU@0AXu$)&Q4PVCbZ@l8TUwu;CngmCjTua+Fpm9TFzB8Sevx0VH zMUJa?o@xYDQ-03z(%Q`LUK%d_Y?CYwVkf%!iVPt>32M~p}_fRu6t`6*cz8=bSD|=FbG**#;ETU%`QOD_ z^t#Sxo13?DU6Y4XC9UKfUCOG%JbK6O`TZ9*dc#791r^dL5{WlUCBPFMiU;1kMYF@W zsdd)eHh0<)muZKEBcr03EmGl=%qjGYdi>xDgO4|&FzO&@0mYfVtwetz#mma=u94O< z=5;_G?TA-W2PszSC8=716g#Vu;?=YG&@EWqv;33?VL@3KiQ+B@P-~USgSC9!E5joJ zD8$>tsW$3#{VO|qUX65MUJa(BcpbAf_-x%mpm~3t3$u(u52@xT{r9@~ALZ`Y+OI5s z`apt9E=hWpA7WRBg)oGVTrNh`qWbS^Z@N-`NWR^X`klnf*=E=WMRa+Nnruq;*zFW_zdAWj zLJl}UhodP8t9P>x%@Dd}Xs40Zbzsf>Ol@(QUw6v5OJ7`*ss4CoV32&tOIhr8GsTie z5BVLeqV>}7rhdZsBf1FDLgWEEB+?gbzA+z?ibOo11q(6`_lJmLJmwwZzl-#(qHIyd z=OSybiqN_VZVIC(z-#-%6n0^F}JExCxvwzZ)h8mMzL?JRHE7^L#P zMqGq1ipctpA!B%0GV&2$bwA*!Z&7a1gDk!f4)X2{ibvZNT3}^M15e{aQ)DpK_u|{^ z_VSs!cb5n#63+UtMJt*R6rqvKo3;CjKFUI^WCP;55uVt%&NKkj+Q$z>X(8H_yviPP2+Eh!QSAceBT4`Xe$k! zi;VDRRIXU8BjPERiBhx_is6b=q?W=c-W^sLQ@=+UE{h?j2Of$?cYyronlpi9b`|AE zC^Q?4L+;4JL!JlqQVMW?E11W&Hld$0BgKbt)fnSbAbmFoZw_AEfF+~zP<2L}8*fJT zfv~2-qKe{VbFvD>u`@j3`sUa}4a^hKHLCS_L@_&;yR_6}*iP-fS8eC=|NbbO9hdxv z@LS~KhaI^HjANhoKIof*F43bQI&dwZ>D&?bURM{)0!kR8Yg3uDtO*w**P1U|TM`G)e@ zjGzg*=D5|ul!hL;^hl|>=on|<$;i)%RJA`I0*#<&cF7&2g#DyWk&4r;v+Abx0A9>jv=t9Dcp=GMT;6i5J9f%mAQM2?jGn7BR-(nkA-1^M| zM))+xcSI{Zy0=Sw<2CuitNJ)O4t;ZS)#Ay1I`R26l0FwDE`QC{2Dp17XbAZcdP1%y zd|D=D+@R$A?78>7tVAzkB?6hC+I}DPOHEor0~H$7G#dAxt^NH=wsHS7gBGTNY9mU# ze9@L+frJ6E8QtTTQ)_8Qasr5_xJ+3yno`i3T6(P+FJ?U%N0&wBWH8;A!sywr#UHr$ zti_9A+}P$FAIWe#zoAu@gh%9`H|c@_%Nq@r8pjd!S}V=$Wy zh)RNP0H;KSpELoO_cMgu-I&p5$m&60DuS~xly}8K&-w^ISGm@H084+e2A{#AaV}f< z4p*>@t1)Ic|HJu=kb!t&VyobQ9#OO}trBw8MEnhbD9=ZYTzy{t#nYqfRoCVG$$EvZ z!jQWuMca}$A!3QWRD00*gQx&hv5q+2lu)ErsCtf9`E0G+|3Z*m0_Nj%)y`OhA z#qatZWYf?}==Rw;{hZeA!UjU0klnh_=HMf&qEIp4OxE?2EKK05qj}N4+e@}#%Ubhp zLkx9ufa3V9g*r=yVT}kWZs5}e@=Vmq?}Cz=S@iS6eWPvM=xmhQguay4|8W85j>akP#X+EzwPYE$#i7T zMZA?X&!`!qd|uH(RW;jYL52;R&?vG#R~N+A6iA}BI;zf~nMnKCfLLxEb@Kk5c8bqx znW|CY_!~2d4ZH+9ozEgtYZXys$7d`*GJBU<+)rirg`kA?rJXVW>c=*N-JK&WKb8ot zWY?9rxPjx|kfNwXZ6Ijl#chQIx0X=Po(64T^)W8()BERh6Nv(UTQPUZ0O$DmsOuFx z?_YtgR!x_6qPGt&@M`FU+B$!iqgVr>*M!%EL zQbU_J+$+~V;Sx*G1~Do%oYCEbr8(u+GlC)&_;tD9IXjeR!Wc-BC-H6gP=RnharKhc;Ca z38vN3x)|2)|5bUyw5Fxej?HK{|4CgCyJYYOeL4@XSND-iCu~ZG(D>&QtiHW=yZyo` z56g$r+iH-XMzmg!{n`L|boPBXdYJ2$zE?jK9F_YpM~apaW;torY|QKNZyVsV>W}Uz z$-B7_(In>6m{>3Ov?Btc)a^rTIdyty=GbNv zu{^m;{E)-PXqI<^u-^Kx?VvEv;RxQE7uB=OBBjYr4U1NJzz2kegOz>y1uI6K^0|bA z$>5g=oJe2%a|HRP*lj3Ho~!+jXv;3v*lx<>T~I`?PV=IZ8C;du25wex)9&y)%mlvv zE#w=}zP>PbP`+YxErxy^(bvSTdAh2_9LF9((b~$Jo}UGt%gL33m!c)7i19(jcznE! ztk}OS?X@jGkc94Bzi&ojkj!^%zU~akj#V(Z{kiA`8Bkk&m4XqozAB1oTqIcyU&ML@ z(qAoCuA#rU#*0!pBCaS4Q@BQjg5zS0{+XNI3cFVbg|`JJ@~-WIWjRkM|1k8-5cWKS z@|O4Ho1?i5!RCZHk|=@YW&VR<%EgRf?w5WTD290AaKdHMWUV6t>9SJ~B~s zv<3I^+?h>e4GonFzP<^(0d4*Nid*cw)%u*Bo#1J?ESM|iSvMifL@x?oIh!)P39XL8 z&~j_n^XIaKs~%&)R&aYnRHBJ+N@9|wKhPUA8;L`KxBCWgPtQDfoQs7~EPU>8{FVKo zR?o!?@A=Vsw+9s)}WcXN*r2y!DA!;@uh-Wi0(WMUh5D)*AnK9IVkU^H@SRYYG@{OOrjZXJ>hbaEB>np#{9Qos_I)BUguD;ETV~U*P zCfIA*VT6qq<^@`7KU{V!C^=NW^zXXR(W0NN$@0RSr0s$x5@@k)PQK8{MufgkWcKrH zMKEu^?<=zQ-ny+%8&i@-y@-MLs!v@4m6vK}C^mdD%(5 ztrG5iUPe6JyIQxs70k9XO&JunA2zw9eX@?-K*=A$7H5$$dJj1#XI! z5i4!md~XrC-7?suo|21{1F>!Bj@*jI$Np6pGBd}T--|J=xJfspc!TC~|5ZM!I;czL zD9;PcSymTjMQC;3IFh1KfM#tkYws};I(sz1=wJG`klN3)?gyTc&WQW35ywY4Zv$66 zt-x84&`Xr6v5uSh@qv7^s$3Ft-b&c*%yttw-%mXrI8X}|xe*o&H84fojnh&K-5)GE zTH@Y=X}P;Vd7_Cqxf!p@@&4r?vr*79c~k>pz>Iq)8c@~({b@Qe1k}& z{tn;V1l+*(_3*xZWhhPIDuGr7oATZ_5_Yva1h5*i~)g$VUksG z>?#L%0OY&65v$K%vG#KBhORHrYYPM|!_00$!J|(|O29&;Ccpc@FKm_N1UT|Yw@me$0$KBvbYs9a z26DI(DMnSXavtrj6VCOQHE!!2ClouD13$o?9W+YAiFPLQ_`&r|W|D6W+Srlaw(&GD zmiXi?SNGX^lUDELOA+hKrz?xz=N#OZz2UFo&$w!9sqzcJweg=!4{Wu;z6&{B4-y_e zzawudhc<8$cD_VgGaY7P%5yeo^Y)-@t@N+2&r)epPph6RXUxUcyS&y7YP3~ey?5(u z?E0a1Et0Z~#vut5M88wFBZN@U&v&VKE>s?Wlo?_)g!p>!rRX z4}EU*j*ZU7teSa762ab%#vYIu?Z)tm0M8Lek2c+jdPrU!w8y098|_^oP+ks{3b-#b ztYg3}{s^8ZGV5;NVL3z3uMoS?P`;)>{FgobB=*9u=xvymdxr1Yd z*Pa0Qo4CGs+xU}6&wA1H&GQcDfweI)n27I(e?fhskb;7sYL&bc3X_Z-F&t^u!|boa zy>XG}SbEEKa1#wfn7SY0wV|~P%YF8}`B3eb#A-?L z>zB5^n7Z^O|80+o&4M@0$)nHpqN>_A`tkiE1#dK?tfqEN5WnpLW*@9 zUii2CB>^e#@X-*YKep>F)( zyI7Z8iQ%ObZ6NmSl26=BZO{_LIA3N-E}0rHp@DWLfw2Bp!b=H6VdT z4&Ho1NyLzpuwvo-H4@029uU)&t<*g`#aJS(=m>*?^=rQGN_bBay8Y$3+;iii)rAr) zjHW}E%Sun50LAp#z&CN5%Mo{%XO}J10dM$mLCbob1llXmG@g1TujTh^Jkc72euuY> z=)7~^#EZ`M0Ts*oxy)3=xkTc?=L)9xwKsf1r)xiD_q?VpQ^l8*eXWr~>q0vIRuFDr zJw~Z~SyhG5QrI*qTSP<)J8LeBYjMMvygnl~>|f-y*=sl$wW7VyR6=Mcl~p^~}p zj1=*ffcLIs+1&YRpzc+iW4uu!y;l%zPl$YJdkj4B1x<%1%_kh^d**iSWf#AyLRWTH zql5#|_w9Xsgi{vjo5$0*mf)Vk0;TQ5(kh5pLGc}PNPxE|VBgu+9+<6CmtMOQ$tSVX zF1o&>D+v@8N5e3V;(b0Q;w@zO@Eb15he}nV-JR%pK{z1e@zfCBog~Gu`BDp?l^4bl zRD9J0d*7<KJ@)_PU-f>x`z1?O^^QIB%Q=m*}Jo) zDsBJ46UAngP#I(Gy#(~Td$(UtpD>5j#npbWwg_5ZFf!&TIOyX;N-&ocIzafgSlq)a z3jmg?WMg!#{t0ONx%MmH=^JWt5|<20d8(x)4#g2%qv^DarMz6aLq5XUPI=~yI+YHh zUeOQO`WSj15k%+8FkV4-SAmV}bKbNkFjhehPi+#xmtNMofmL=@0;fdR_Yo8ze}lJ( znG#o7@qtd5IBLc4d(kKvThw?T=J8LrvSjx+`UNkPGBVmIN%O1%v3=iJt;Cq9)1>DZ zX@%F#_Sm`{v1xq~dgR5v8eP3XziUSga_x#VLPm4`qDxzzUt%r3ucM|;gpNMP{a)Cv zCR+Ha*eFS&hb~hE%ha4F2d?@T+bB9xsm` z?^m-TDHKloyNa`u#VSc_(c(0$0rb81GZLx>#e8;0Dj8{rZYj*Z;+HMR(FXPlDxCIf z$jKhj;}OHuzAq!pT@M9f_<%PMam`-U{t?2mj5j?>$;`dxv^sGAgHYLx?vw`t@8Y^J zQnWT-b~PR?tIuY(-9gEt!LeD(mI+_i%zGA~NqcG^b=n3Th*inv4OsSEVc+l*NW{em z9$({#r(GxvKxf_;Ji zg~Y=yNfw`>(B&n>NEi)2Y;{58vm>`Jvwq8%>7EU?Rh5CXfV>@~J>QI)%L3xs6{XUf z&0j3dj`R=+=8FPDMb5Exi|^m;HC7P>zvnO617$JzjAUOONf9}4ihQRxWV{q!Uxo>l z$t8c1lK!OytwW4*p&KeQHBIO>@Dd6#UQZ@A&ya~_f;TyZR`e zIQ-h9$UixeiORLY#l_c%%!?RZk(3B^oZb-hjCxW2`JF=MKbO94*y<^P#$$c2cDXC7F__T zQHCpWuU5ecg)-#h>NvEtNyRqWmT$w}8+aXz$$yrKB<0zHGF-su-0A3$qtIA&z&VYt z%l0%4uekCDLwuzHOYpqj#-Jo9OopMNZ(EOyVrR^}aco0XLK# zay2uJTC{prxU1$at7mi6Z0y$agQTq03J^IM?DCv*x4lf-jq#TuzlDPk|JD$5!KV!_ zi{Q!M=0MBXfd(E*!5fM@QvrDt?s3{UpR= zw$!q6A%$y_7J-xl>e8+zgzQlx{|dz0;1FjpEcOIbqi2O6iK*X3-(gLoF}SY`K&*1y z=8YwGfk@~sa*3WOWTMDF7{fXZ`18^=#aE3^e*jaF!7cKB(poE+mW+kDsf|Z2&o=*S z3ctGS8myJ#F=<;O`f3BM?>7K2*kf;dm~wwd0?-fx74`I`>16hhYP0Q0+WEch0x=^* zFw35a{4{Ny!=iO2m1v$ZbFRbdWXpckQEu(M31;Hl*!TRN+ zflg!1D>>Ywl-bpd&eOz#`>)qL5Qi=QL@#Z(o@>+DNw1bY5Nmo$D~J)^e0)taAB9oW z{vI+`ATOx+yQ%i;kT|79h*Mm}(n0pXyBqj)h}gRo_@5}*N_+W{7Q7z78{&3WFeG$M`Q9xCd0Z5=F&=+Eu4+r3iKf%sBX> zdo$9%)9ANX=pvp-^2h2FvGqle%oZ&ojd)P3ehj&~KyaFmJ_feS(QayhASt+kH@9S_ z5o+(Y-1ZyLj(+$6H&0{m#*FKm(Gf}i?*)T@kp=fAZ6Xxk9Ziy^>57WX4VAwv0pp{l z%d1~^nb$FoTak;~zJ{G&PacHA#zGmfE(4+u%5K3?8`(-Z1i!=@%YdN=<;m}<$L$7c zZe}~(R6pMv_g#{MHaq(NWabl_+~l2=>PgksgQ6;@>uD*mic;&*KETm(_>~O4Ycb>6 zqXQmTF|Nl>P7Ew->p*__`eoUaLxmqpu#^KH<0 zF!=ek_&k`6k^<=57TZC@3W+wnj;Oc>GPht9Tfvq zdrW=w(K+|86RyOmHhE;vBGn$(eH%(wS0F3E5@*I#0VDO}Kw22`d6r72f0{*dw%|FF z<#3(4@hw@2bvxa$qdhGrwot^{ru)C{fF`6`b%CbF8!h_IiIHvG6u+Sjr8U$82@YEj zpH&ti4|G>-4kWlL@;>=JIrb@%@saZ8o0^Cg{(;SfmL%-C)AsT0{IOD48x`mdo#*@R ztS#RB^!^HZx4GvW@p5KSOEQBFVf`Js{PvcsD{hjtfoKQL_2@ou@y5boZ|c5^wx(8j zQ@5bMztMI=OGpT@EK0GiyWv9g`|RC{&K_&tpOH$@Xjt4@n2jdJx=*=AJw-KVAT|3v zIDFybSIpMH>CVN=Z_2Tc$sd05tuCF&=B>UhGkbbtqtYvcH;-*eGs74D(}a6`IMl4b z3C&v_ibVBujvl>opP${@@`Cz`{%v{eSjrPq@vl;g4~JM0U$?Iw&bxHy&CXN0{K!%C z(`ExTeU%shXs(UVHzXF+oO}pP;g>_a4OS;bjivD4tJe@+kHS%7{wvIhwXXx5&O9Ah z_iZKQsTWEF&w2~JYiezgaDE~~P!XV*p3eGuBqXW;$sc7ZYsSv)NYxBlpG(rj6drN_ zip#-8ipH)We*F@2*baWSZr;6tFRKm;pHY8gfx%9}f-dSLZ)8vfA2ArdF&ZLfklH7A z|7oW~?jH;`v1LR7+QhyW0e=-Gzoo2Jk`IFKTv>7PhOSN#>M|)>dMF2?IpJ^hza(PY%65DAik|330dF6rtIz~<+vfcKV{6gXyQKN@hXVArhxXMs(9QRQ2C_Q zPp0(%`C%8g$(RC!8O#w9Cb68`6rE@modya0X?_Vp3kXJ$XModmhI_y z2<&{GvbKuBe^x4)dZ^wy68yMrju`n-wWqk-VTWfoiU%`=*AzomtJlaQlPv^X1d6 zT5ax%Z;oxvnR8fB@v6>9;T+nNMEIR_HcYB};iN&f>qzBo+nsyAuy7OdZEpB|$>PIv z2V!NS`p;N_u|%(ym&IMI9Oo3>3zvsRP;sff?vHHy!S9TB{G+$23wKqPhFR@_XP?l& zrOvZ%Yc(*<75e#ZJNY4P&Rsq`4?eH({S>h#*Svn~=@fF`Wj-n&oC!itTF_guRcdO5 zwguU|C8sz!i9mcIb#Jn@{!e<~`C=vX5f!+m@tp^4JT897#@+u?f$ZaXiIW4CS-8B^ zdKT`W(9NK1IZqlsAdl_=SLPBr?JrZ!B^~QY?oEi(1VyzsFpqWY2rW&fWL++1YFOhU zc3X$I4)G^)pqGllHELk4pT~r_;k=itW$iwXf;CVXz5*%=V!@13(D2b1H@qr`U zyV#NOc_nKVwl5*!q*mmlIdB>xxogpv0C=HN*yR|HE!*;q>EbrKXGJDp_VpK)M zf6kG;M@fJ439Iq1kjb}_FBk3%FjED3{|*!%sO=HxeH>;MZuE*1T(yrql#1C_x@v%0mmD$?t(#4eM^4K3EIL2p*lsE0sb?O~6(Cd66^ zc~?YeT_jn8@}F6KkZTV?N$`&z`%pir4hvhx0)~C;V@u4dk7#@x3)F%;Fg;2%=S&6H$ueyv>xqI~BGop+h#Fv@M_hn`x9i8AiB!5Vp_EWj9 zNNoPC_$DJ_DPJ`TMFQQOB!pwgEdWI(P7rhn)XSSj-|SScHcysGWM6~LaT zONcnTLu8dozl%9{vm|u#UrN)k%dWU(@T?mW!6?0%J36Y*#3T326OcPJ5t^tKn4 zm?W9h^T*SPSh?LbqY0}lL(5Z!9@fu=&l5$I;-kCIzJFi4d*gJ)A>+Xcm4m}^JI^t9 zW8ssT(}n$3W2GY1r)Ryj9&xS4SZDn|o%u3c?vlr}dVMr}F7{lYzDiH#bn}^P=dfwb zvF69WodSSP30+C=_)PPJpeH2H_=txZW>}` z31r_l?e`Z89BaOB9a6E_OV(4kdShr5SI}ZYd8xupnbpbNPw}@$&YYge@IuUV#L27R zRETCv{MZ-w7$3NYQ=bZ?q>{dKlmwN4xskO(qP;P?a)+ft6PH!oQH28p-aAHmI1ZhAiUzY ziW8#_t6tHg)qbL@%Nyq~`)+_MBCtK7l6R*FF~Nym=%eEU2T7LOPn+TcLB9XRc>ncq z5*CFK+=W4K4gJ34a<_?pdwPDcc6kE)OcJ$@T58t7#+bm}w_ba?&O*|vj1q9&i-y`H zRIM)Y5fe|gPKf_u2nY2bwy$QEehOx4y)n+epZK*d{c0zqO(H8q{6xt>&1F$AiLapO z^2U--ga>LESMBDsHFZiyP9(jvc;*HrwR;?QnC1M?K5xnk8=F4Z@0;gOe;A? z+AT3~;9krvxp{}g=)%9Vku`)_o}qn=kE39<33qGb1b$X#-EV3#-91pIZ|RI(t^7)n zwo~($0}^_ld#R?%zZ2u;VeKu_xvy{OYA70?*f*}ej29skFw2mep_z7$lxH>Yp7CJm zfD3v*MJ?>+-|IX}xPBqRN7LYX*(tG=q9J2DY`77>@U7}J-0 zf1kT;GP3VQ;iEy3k#w&VD&@8$D%Yr#9SwzZWTrxUse92-l$F(RuTfM))2dvNojoph zoZs<%JbwT6sC#dh$9ccsulH*_pY-LT_mK{3LEe~x<)-DJLzMl_aX!*$zVQ)!t<{zA zN*6yS2i6|;@AkzJ9^ujtq38KtyR6V#^RCCxJL;mc!J~i?3_=1~+I+9o-@0bk7&7AX zB-f-0Tt;@N(@u~mK+J+TtxOI@_M$bUg$|axnmEq+8O_!u|6$SH*RBgkQWH9NU9r4??+DAdVcq zp+af;+aNn7D*qRnqu-wvV@YBpw1{;IdE9r#6WnUD|HVeUwaXyx=sH@Pz=*}@!Hrpi z+Q@{SqkRFSDv)6m8TyvqwQnnm1eXPs@w@#Z;3L8kiyJI}N&@_le*C=)CXx@);}*y_m)BBl6@T4%`-oZ0-U%DxbR= z=Y*TM$7Y>6qCVl(BUPet-25^?Tg({H^?z&HZ$3TgIad#)W$Bgrd$YJnGPZg(SB6n$4e#(zikdzsG)a-4~cdQKrJ0&ywfEs5A1|emJKa26#S{U|&Rq12m34pbQpe+F`r7ISWS7d$$E)4nYf{d8 zC$9d!i#^Ws-Q_YnPjiAa|l1DPogcD35cDal$(NJ1&%Y zh;Z@4ycQYRE~Y0ZOUMH!xeZ!Ceo<9gHfUW+)5dSv#lXLU0=2OUpU*gqNJsY)c%|r> zA7^F8d}}a9J*|MgbTxCL4o@*aig6#zUA}!4(N$**+QBztq;90C)-LAVK6IJ{KFg<9 z5qWLs&h-z)#b+2+K;2KbRRhyVzK~Wta6}306a*LhBhGX_uQ>>;R~mgNNK#lBtD1~TxBL{h~{OHH{|4u4dB^bm(^ZRjg#^#P@PgghVT-G6#x9sL$&14w+KoP>xQxG$kt1M7v z2bjpm8s=32BthJQYp)>H6xg!;@$;{D>p!2F4{7-D6DV?{4 z#d)l6R(%_$&T%u%fq=o;_7uAL9n-^#L)NqcWLno35nEjsajAslJnOu$b&Mw(;7F7)~_23|T(TNjeH z@Qiwg8!HEaBWxRJy$m)$4gz=gCYU1*sIxD4<;stZy2`GSF392@=Y1v7%EXV9IBr*D zv2c6Qm>vit3J7-Hko8vjC33nua+2o6*b__GsmO^(kKRQ!y`}1784s<4Hbp9g)SmYAOe+qr>HFZ`Kia5;hj7$uk zik?OimeW|z8*|WE!=C>d=~??=*JYTedvEY4E!AQNstWj3lT0BW9w@$_;ikb4yy<;$OfAdg0ta@Di zpUL+aht(U$F7Sulpso$9YMUQL=;aXJIs1zaX%4KtN^=e<$Dx39tvAV8o| zjyV111a8>ciJ{yftPnUkg~zDbqO(QG&A=bZ77f<&Wx@#{;)-8H^LM$@q=zp&?21{-ug(UnHVU4zUXJ3;OQo{Ze`IUX{V zQ*;AlOkyBT4V+ZZpWj*#ZyR`fblJ?Zr6zwcL=?sWd(HhRO7p{=rXhzZ%uQMJw&Cuf z?(;GG<@$>!hsKdxML@dy1+)b4uDIcIdeGu5FjD{+R_Z)Y__I1c0HS4aKkkQ&g|0r( z0nA_VI7HYM%6aet@0TKqa0Q5^hRs+{Cn>V+3fWb$7lFDEZdyyoXnkA=Oho?z0z6g4Z(a=0 zlq8I=*|B-JBS+#64^F>evWJ}@cxC@`6I3FYt0&# zK;h7XF*=50KY&w_Ef3BGw%fM-EI!6~MrvLQO&KDo)rw}GXllM3_%0sLWazj5Eh$~A zU9Tol!#Qh17HB>M9o^5u2vbHR#WR!WRue7G9;}#zwN$g?AN`tQb39`@89)IV{6cJ2 z@f2@Tf!wv1k|Jqp8)F1 zFgq#V5e!p8YakUUCzY=4|KLw$m3^#gX;*%812lhX#P%l{<2|kU55GY8I}b! z<9#G??!tw?Fdy>;*g#aG4PV|Re(c{%wE`-Szo{Xs%jVKP%OhoIRCn5t2rnj?%uhzQ>;g~Fq5cwN$x7Z)G{{@n@)NAzF*>pe z;m30)n!KR;VRUwv5x`Vq&%t)l%|?J_ThFJbMDGwgm7%?D!gueBJ~rkS-F{~??cDK4 z!A@g1^YLiRExmI|$5PphE_cUY9~F{MUJshM#Z9a489w!W*s5tzLEr27eJ66_>VVP0 z)_{(&)_~}nC$JPt*1J`FE}d;aoAE>61d;Dd(jM$TZ|`_LORZ*1VfShh{qysYtmG(B ze5Pi!QVr5fSG={bo8EI`nMB`nbU=DU-ZH8^afoiGq+7&2N-4m{>ZE||9BOnS{LYQ!qQE&AXaD=o4W4?EZJhdV4R&!MptUdGxzdHZBrdbu1oXc z|BPaCqibmDAC-a{Fs#CaV%x|kDH|`TreTJIXBfwtdo~j-wrAM7hjm1kcBPFmv4ZSx zO~vz#bRCkYvkbRf$_P=G7}YAZzQ$N>MiE_X4ZM5(>FEQz1~J=K`i1BncxM{oVSt3o zr5l1_SzZkyy=bjg7~>J1HfANj)5aFLb;*CZ?=yh9;K+L4Rf4Pe>*Ag($=TRV;zYP@Ue;~@RLOmi!+?l9GX$Ww_Jz{;GDlzh>) zFq!=EVU$E!Bzp~?uh z?0{D+uHe z2wnPcQS-er^9<;`qUm29BhIzG*1$%5r;$?V8#+zJUu=Jzojj5eTobmyk^Q@ELs_|U1xFOgpE;q($fIFnR3M?%b722 z9p$#X7tsee1h2Cx7xF@l8E zcc+@7ew#rV&%A;~J!o_zCR(QR8! z>}`Mv7XONK>zr(%Z$nOYO2}@3ax5$>6*&k(_rP`9%3z;(1)kR}&36IsWz-Llb8663 z3g9TuB<-`~d)rSN&B0M`2K#XRHfYbh@dW&X!E48?%V}*QEsX;18zBp2%uS3|K zB27pShYI+0b8s4-Cy!sZ9obT4D)_sKc?=AM0$WlM32&&$aRezT{e9Y?X@>Oc3*pO3lC2t9)H;ZuOl$Ej;K_Et+n>y9scIDXyfLUk zbV&%1{4LRAEV%_dRCs%}>hIw^w1JH9wa;u{53EFFT8ig{ha_;`Yc$?XXhgU2J_hPC zOOITgHs4rrWb#>?=wU8HvhTQZo~R(&tN)U6fTsvpbbuW6a2Gfb)n#(evAj!i{d zU|O4M6NNdZuj2SN?!+m%Hs+EKYJWUzarx^nzS(d#XHwnF-BjCTW!&;|zL{|L@6q*R zRT|$hn}ODUFB0R`D}X?eCklSle!ic*Ic=jTJA2YN9JdY^*I)G@AsZ{>ZrR9t0oB$H zavkEi$`g*F5UI>gIc6_gN?dx%Io%oxd_*@paqjW^u2Ql4Sb!2Jn{yozk|7<;vy+9> z8s7f}6??)~p#SMlV1TvIGRTsBH-V;NYXf)Z;{II85a$MXrqa>02T8mgZ;8mKWlnlIJG+{&njK30 zmTF(T@&MRAMm^LKjS;0~5tq;OKmLoV@)dBJuXWSq0Mj z@r(}V9iFd^IBrS<&9h`}1!OOJX&>IdmitTOc^O7}(10xx?#Qo^kKrGPtaFtQc1Z@z zFHSYBkUT9v)dBA(x)--RYAY_%PY;|dGTx5 z@sylf_hGp{vnLq(OlaP72UvG;w+`aBde|a3aq-I7{YfwI0(0~O2MH9~M%=~9O2nmT zevs(G{qW@?r(R(l3zR>DYfFVnZ6e=S^b@3wgJ#HHoKKahFD`|L?hjvH#*1!uv~{zZ ze0BV*?$M5jeNBB2p9k0ky5@qW$+}}C*m{GRf?aKN^sQCc(f{F9*d3XkcRE*liifAP zKP0&-Hw5i^u}4M21Oo2Qd)nK9V{#xcJxw~{DjhzBgsk+eCT!?UW)r#Y87cer&7@E ziRMTgF7hwC7c_T6?t<|C&cqk9zJK7a-_eqa@{qNP98Elv3}qhx|5$7O5(L_~B01z8 zaJ#LH1WBGvvz>4^28x}hzOJZ@ka}T3W0`%B;(W)wyacOc>@-1_$Z*b^OV<1+I?&ts zrtbv2{w_BM%A4%_%;XG~iMwaz(lCSP0Ga`@YNLZd`>Y$Uc*7OHcXsU>=_5Jvu@M~SpB+_e|s z9z^3r{L&T@tw@qAhfU-}AG(gj%P@*i^G_pQ8CT>HrC{&@6WG8e0?dBr5Q`&%E%jcd z-{~JA1{qxSf0Z91R@QSRgGGWCCw5o~Y+@aH(H_xMP%j+cTZ~4|{;md-FEk5w*K^Rm z=o#2VQaH`MHo98Ce&yCsAPO%7M{pQ+$EsM8UrT`Xj1ssXr%xsGjn>54Je0x)TP9Lk z>t+qp#qb74NK{RKwFWsXh~Dsf)@4ZrP=0pygCy-3zPS{|@>UyytK}#oU&Fr^1#io} z-F;)szURG5TK#ODzl;mPVyhNgGA8N+Vx_%8zwZi@XzX(o-)tCLVP6`ccyQ zbzN7|D*1h9LC7xkE8cZ}Li>#Zr&1Iv7krQWCM9|yANq3AxPhe$&fa@*BKG-zv@kr2 z*SY=Wzs^!iG#KH>K$TlCeP_lQLh(2#XQoqxlC8`)nSeCp*o&H+eAx|swV1YVC%z}vj0sd&O+tcx-j zQB{+2-_rrwH;PQN^@a39M9@lPr_eGd{Lgwqd6`fg*A4$wNSc~*xiI0gQSA~zy##KRT1 zV_QbJBg*1K@ERKZ={`>wlKD1(p6pH=1cm)Ze>#%|tA@lIf3u^SmPBv*j7Wz|w?1X~ z&SHg*2nve??HLARDd?14k=VB#ebX!X^?5HJ!GBgWJEN$WZ5Ue_L^kWZy9urHVIK^i zgS!dFs){mLhHZKO38Y*Jk(ayGYU(Ey^>)UK*$$+S1LlX;!O0A+2C!CV-Ib%P!_n(7 z7x@a_`N%Vu!a=zV$J$W_37HH@6N;zcm~D$^qq;}6Nb$=ZdEH>*&FdffHHa|OZJn+` z%dgq0ne_6hFTL3Z9Je>o>dG9=C>|aqouLoJujo$?hWG_Qr4vVjt~~7KjFzy|Gy`Q% zC~00&-*1dtJ9D`E)Eftlqa7`1bglG5uh)*6%Xlp}%$CrLRrr#W%Hj5nlF_Da%J~Oc zzKZ{(IaKtv&~ko)W%8%(2N&CUzRh6n8Xd*vWXXRPG;F43$?sTuv1hOqSc2d&1Xj_v`e5`2g4=3wB=;KfGCETE#XCp2`{m7I>b|#mjWc0 zjTr^9{}L|}LWQU`kL&zOjcJ7>OMP34r&(B{?VBxtSr$75J~n--1w${b#b5JB))TPI z&u ze_ak|rmgr&>YWm*FU_+C)vPk7fJlr@aobqFd#f4~@!s1hYf2XHatY4m09(Su}go-pOC&9i`R=|LrEUE4W& z(?9fprV?v*>qRoN=PtV8rW?g%Ki0O&`vyx9FhH}#62(hk;2oFY0WSXKIy{rCr?7Mt zWb|ir4|KN}Wqp(HB(N7 zxPnPN?K2)A@k>?aZiThYR9&#n#~cl&A@R|BQ=)aH)Hf>Vo3VVxt!6~BT=qCy8H zF@e(Bs;`Z4;;c$z3`Sm^EKVcRsf2zXHYNcXrc1OJPd&Di1uKTQ|HW6jicWp=U@Vv1 z{zu0yXOHr5OPVZNhy$I$^LO_T+bX3c#Hi$D^|?J%<_wVWFGoFNPZ|VRBfqWO`X5pE ziT*Wnx=ipLa&^+Y@34E%g)NLJmkYb`D`iLsVSdLcBn_|loUY^S6gIc(pTpzUY^;6NQgiSu%x^@6 z1L*B%;I$HGLmN18c)DrPoZNkJe#2QSRN}i*M={hB{-Q!F6<){B%$+%`#akXgWVwJB zZTSJAjG}4w9um%c^H~s1^l!xIu6r$-y%MLnJ2P(7Ks7Qi>0}NyIxI5ElHaZLbHofSRxNjg7!Qp%%w8jn1 zvQ(jAc4Z}JZ=_t65kz2S-~`_hT-Xv${BiVQ6nP7A|F{umbXiJE#aX-4)F!_C&OdN7 z3^C4@XC5Wje_cU;k7hrkm(B*b#gNGlRFNzVR@UDq(C&8VT`~xDSRpi z_$AL*zC8_3+`k77YYyBC@h%CRqkSk42doKG`p0f+NOxM>pC;pSk81Yq?5M%N*+YE&2V4GK|HW#?&z3rp>iuMPukh{tdL(UgbCb5>xc&P#Yvgai zXJdZH2PUOEEK%5frNoEdIqE0WBMZ&{aA%E+XO}tPzR9M4Bd(Xlh<;Pm_abUSYAbCD zayr%UKo^V95Jne{a}t~=&e#6c>t-@i7GHj6_49tv)tj8c+ufS9UY&1P zGJjQ%_Yz0;>w&QoQ&B6X^N6(;$Kek6aoroK{MVun?%)}=r{uvwg`9mTX3m5Z$TWjR ztoujDO&EWhwSc1odc}n9H|^AcrprON<@4r&XeznD_$jn`8MuJM&c5CKR&Q3u65AD- z*LNU^nc|KH`ZM(FAABjqImU-S%uuDo2n5!wN0iYz&OUmorDWYuzBO))hM8Li>yFM) z&7os;&P1B-BElLQ#R3k4K+-lvVRx!DrEv6q2k3q3B_K={ zH*;~H=3UPq@YN@wH~;*`fz6*_Q4ZoJ)lbI1Ge+~J(8^0VKRL)+hUY%-^p40}&Iq2e zn}#!p8~|PL_(ToINw1b>ZHlg}89A|>%GsC&4(yZ5*(3S8wvERaqA>U4q$x}t%2Ybl zbf=n+0H8Zdl;YN+80R1sq#y)9DxPpCf;HnMx^HXQP` z<&hRHG&8LmIz`1PM= zg=L~dJS!6W0!h*-aNZwk;Ct0%y*r%`QMEY1Ahf&-%dd3&RElTc!^>NLa-{BlR?7N9R zA<5;SK$&-5Qu<3E%tQB!(yS=Stv9@KrDdO(GXm!iMf3e%(x2fY3K2ss8ea_wwaVTe zl+!wur0aapQL+}_>Nqg`>b_i&zG3!(XwOfqv+;|lslUhG83=HNCO^%~371FKC7YYb zy&YXP5hf-2EdA`Eo}2dKJJT`RFVWM_fmGY%YD!kvdLsj)!^TQSWH-F{;HYtv*-Df? z%Lw?;d<)d7DjL=-krm$kql#GSBSn&bWNhR%vqN%t%Pa=i?xmQmL{gK;EG@|86F00~ zUgk_=P`ke3ORVKv5(pHNj+?PEfSo09-iZ0Tu~d&k;{@#S3%fYc1G{Gxq}N`=N(h(% zb=e{jR4n%GYRZBhEam*?39Y4QIv*3?In3b8|00^TYbdTd3qQc{IGD-Xp_KR{%z+UX zhQk?(@U@g?2GX#mdC^L+6yq7=rk9L1C2(`69MoVvEb^c_5e8GlYz2bKc>X4^o6I;- zr9fKJ2(nEuIwieRH0cIv$(XweY=XvUh%JOO_&p@kFp)+31vt!PZX$O|_Kq_- z7E9eR02P*1%4m2YPOBjpU)@GOg!3;!PG);eVGW8A9i~>o=zBBlRg`)H@lh7{qBk;k zYlB#tBJDm_hO1X+DC|S8%W-q&zGh=L46ptx>$u4{KMH!KmsDS7Cy!W0|L~pblLyCL zHukUoHGfr|7oR6K&)@gQOLwQ}$C!WcTo$pKO z`e1f7Cto6aIl{VM4(dioc6d2U{(05hH@))b&B+QiN*l!oCPLyAPWz0g?C=DB_xy$- z$DPc-&0hocd9SZ34D(W@ zs-m^?O^LWqM4qJx^Lh_Uf@|342%pdP0YPBWul^2y3}V1IS7|hi-uaG3cu1Z0aF^H$ zqHletU{y;i4Ki!jYG9$u*rg=UHDtWnyaFAGtiy4>!x*mq)N*syrStP87q_7vj;ef< zT>P~X2y;9^AM;H;$Fht>SA24k{rWU#y-j2-_pDqjZuZ%>&Oo&rhO`~ zp!p}a^BjK9POV9R4wqv$aYY&U&3qGE*aF}?%dqVVuj|ZFnJt;fnAJT6l?TX^uwnTV z@1zv7xE3UtiNPosgGS$#heZ=<437{Z)4-XR$7t7jVT~-!l+3G@1r1 zl*k;ZS?^38nfg1w?dV$?ExXe?hYZ3xGcbVsGTJ2*$MlBlpB4$YLZqy89YMhRLb!aXLo%()ipNnT*A*sd(X`V3C|a zfn5wSl(CMg8|)BKS@N`(H6RSYTQyWNPHxA{CEg$+x)B)5HwWCGX-DVMIW;8k9zjCp zt;_=@ceC{n(K^lyT=wgxBCoV}k^l40Eyxk{zzEl%NGzE5NNjHMf%riZleQ73Eh|`B zHU!FFFXcI(?6hTgSE(^-2${16`M5>ml@c@ik`POp-KsFFQ48f1&z_Tv=Al=n^7rCM z{cjRTKg45nU84VwA`=KJOb*88p$&ui6?ij@0y2zlGZg&A`epe0&~Aw%fPjk@aF$Sm zgqLMFn?I$^TM4nz#~WRM8H-GLWFK#(5}9{#@=rE+rHCDVhevH|nxjq>fqAkTZG8d% z83}9J+T?@u?WgziaBB>~lj&Ubn>;Mp&lrR> z{&JrO3Wx4*S+Ed&cmx#iARMUokA6<7l*aIeysdpP8%jEA9G{;8kOw5OYXmh@5j1 zT7Bqs-Hg5z^f7oby(c>t6U`hz<$H|xwQWjS{H@*+wxU5sImOcUWcWT`VoI9|DbBlYk5#B0G zEdR^)M9-TeazyLJ7{X=LyBjvGi!OY8I5^$=?W1244yrf$lq21u9NS*Z=iLBorjA*c zVG{9pu~u%a+~a1RhYuOEtT48~eX-H#XBtN*@AN%@4eRhCEHlYx+D|qu~%6C%u?vJ4-)1p^`BtEaNwHa{o4pw(5e$neG+n zF4q_t$QcyD#ox}D($(bA%4m(58A2%ubT9hXU(w|PEH94OZTV^} z%_reHPtP1$fO;-4$rofibuDO3CH++I8V{LUF^)V)Cb$M3X$V*_@HA|{r+*i|f;IO% z4Bb#VeIyP98IS#~^FkKT4;@=Ef!>VXbN}`HZSB&HfC%;p^*fWl1G-6&_!kNLo`cN9y zQT!3Z@W~@ZYUKK~WQy^1IB~+2Ow>`(Zng&%{iZ!d;V4eFejl*8KX;@APA1a&(P0~H zeCXxa;dXirz94`0s~Sejcsb2YPm$n`KwRjL4>60xu1)`}UpX!qGnbPorVc z=bYe^X{{Hdm~XlSCt~(ZpSc`tzu0Z6dDnp)GeWr*Emxs(^r%s?6J^JiZtDD#*~@jB zqxcn1H+&=aPD&jC-%Ryh=D*h+AL$C71LY4Fy*}4l_ zC*@AaJlXhRu;`FjXHLT&^;LY>UH zyHs+%wJr}FMMozxvDrDo&nj9p*ZKS3ApfIYskfUZk{zmP67X*wJs8C4y$PoqXfvDq|n|<&gsuP z*+7E1etU2Ur;RnS6*tl!Ie=UXLr%zC+80Z3a(%lJ#}CyoHmk=GeaOh;MNBOqPa*a@E}3JpGaDG{=Y2? zKl+xfv8drn6#Q)6)xeU;=o}SN&Yd)A*tZ)aLPkWNJfpF&jxYqTdEWDN1WX7rp&WEe zb9uGX0FCAQkE)^z9*bPt?{JGdZP@Z)`=bp}n&+b{KA##@Qsz7u17EtTuBJuf7e1q| zQXs2xe1WNpIY)SNdt(x7MGtcD7T4f)Dy{C(Dl;LdRfhOeZnh0D7IG_YM2)?XQ;vmB+s{iY(r4%a+gX}Snt@fZHE4c=v% z8bWA3iXNcjX;%8u97p^u11!jxEHcE}OHRA+f+QWaQk;EQhdn>$Z+pC!w7WOV&0oPQ zZeus!22nLwJ=F8qQqJi93&fv`i!YTbFLNd&>{B}~x6>)SJI)!`UeDfK+T2#%*fF3R z`E)AzUX*hrVa0EZV)5qpO^v>i^MyOJ)pNCDGxx5m8=O^mGb46a?QjT5^g<7I{y12w zUhBKbKoli)=_*G~&8JIOV-Pj8LrKLXiipQ%MW^pgbi`L7Z`r3#( zJdxpd^~7L)=s#wuU_{zEf9W~6F6GSYxwPmR6qBXZ=^evU?BuW{v<~OjOh~37vf|jN z!t^|SKvq3O*tw%ra@x50Xt1BV_=#ZDq@^N&^YtgTIB^q4R-?;tik#Q<58_jI8uWNN z(6*I=mUn*OVv96y06izi`vsi_n6YP_Ax|3|tfDqMA~*C!jik;uH#=aen0*CxO_?m% zUWS&-HocAyG}uwgX;T`VRqc&t2*t}NDL;L)z3kc0D!1wstp+8=9_dF#Tz9UtCe zTAW3}zvi{}S4=3ii>S!Mw@LiQt)sl(ztM9F&!Y%lkrULnfYWj?{(mk;Nk6@-I}KIF ztkf$pfn0Vb4?5lb$962c<#+s58HH-{-sd%SRMhBoj6^QyW*;k{d)3*0m$r^F^4~B# zpxz@bSTOk8#d3JzC1K-1n5?7tIfA);<2}pP|4&^N_mNt?pl9@mRNEdBrG$lydVxVv zQU}-08eocR!glS>galvP1sBIyPj{zt*#!2)zBj6r+Pe~_oV8jXyYN{??9-R6an_>I zdu6b~LhQ(awXs!N|BGrrBB2}J0G!=75n)if>`eLXGgX*!K+uA39c zoK$C;xK!UBef_`Cv*DXmj>@90-{(_#6~+13&nH$|Uny}akLX%qZB{(&EP4CB_5+Mr zy(XG>VT{v&F-#GuLgs<{r-v&dz}TAINow}RtK=5G2`0e%EiJAX*frLkyO`fSghEs= zRG~a#e8sK12aB>|qW^mTkG~z&r)vCHX8`@^8ijxU8dk;rKl15547ywWd4=$HAKQ+M zz0cu~b-9F$3H(f!>vo)5_{+2KJlZ~Vvy&?w{&lNcLrC6wY3%2+#q^g)$|oe>BTn<; z;T>e$jc-AfnZn|s$ZrJ3^Uv{C@KX$AV z=;y?lE8cYcG03H-O6U9oK_!OimV}Leey)Z_q$Zq_0EWy}*3xh9;*HPp71R8)l0EmCZF&2w z%17teZoLUHmv&cU`Cfg$nscF)H=!7mPgM-*kRsxO`pa|+Rw4FN9A&gBRf~jO<;dS9 zx9ySQiBZZ~_=j-VpoXY8?+b20SVzjXI$S~Z!4gS`Ng*(t-^1&C^in)(Io-vmdrfkl zO49Nz0N4J-6a;f~8{ebbJ`f5V5W@fh#ht*&2>9a_C%*KYsL~em4&S^V+94LX?j}OhsKeE zUN-`l*H%Lp76Es=kwd`3F&5lb=InTzFQfQlG0ny6S%1DpA(v)_)+;F<4ie?o^>YxJ zXj@rplMDbYn#+=66r;kYn78{*8nIcsSPE%J)0nO7qQ4j_B2isad*>wTVaLyDigF(GKgk^y^D$Pn#O;g$*Z)}TzOcD2`aiZT?h5^g z{NVLScaJE_LM+Swf%&(zZvIX@^}9lL;neMX9>iAL+5!@rhutV2oPghM&QTGb1PcKD&9#T0liy+i!>kh)YjC?h{0(5Pobe7mtbu*9 zMzDAqt_jGOXn*2PgbUZ7mzwg9p2juFBc0Q6Z0gxjor$3m;|Mp6cCWD#Or` ze$cni68;ZsHv60Qtp8L4I5ae>DzX^OPl1Pl_|^ z`HBi$)`v73JoZq_DM>HKv667cy6J4^)as3ABP3`HcG6X6$W!*qa+V4}r8`4y%oK(# z2k5gJr@?Gwu24mIqVwj>*^{q_Hbg5Ps=^oE(oG3E^YcSiyMo=_--Vc64*pH^6fc4Btfy2W#dyR7iTQgEevOYLN*a)&dR^R`b(QY)o6{GdYI^YT6VstSq|dEbQ#whhkz z`LX>t2V%IrgTI|HnXeFZ>J~#R87avMKOr_aB7^SI2K!E;JDl8PIR?jY#q!H%e(^98 zSR^*I3pNsIY0~_)_I|>f9C}Pp1_hzZ^E$v-DArMFlgs^~QsD9_>@QoI92m;;8U#7) zbC}HI{M^zzb4EANt6$`pUW-a$2*3N_B?nqw<~+TD%nAlCr(5aww_|ogY^!LFyjAiA$2U0FMjdSENI0gX zBa&1(QF~#*j`KTa=oGVImUAmDbGJHgez5O7UEwz-ajIV-PgJQ{oGfkT}9 z{utEcXJs_mvV{x&R)bGj5N2a1cAg&jpC9A?*F(PdW+<=lA0*{R9v#w0-J>+XlAbA6}_?-}ltgp{A|+RNPjPkeKwNHZ0Cy-BNK z`xtM;_kVlB+>xfG@<;>-wLAfCIrDChip-v!-WvbYsRadPl6h|C{^ZPCqtzdt99UTL zW37w1Hw~6>Zd2&caL9} ziuh2sBviJ}3y*=V$B3LXErbNUp2+7{yc-s`>M(aFa9pTn%D+S24+wo zD=cqqgq?bXG8*UZ%aSHEwbLDN+lVX^Nw_}<<-&le{&>-tr5QMfQzK5 zcKs8td@D`Oy?yrJR^uf7eH}3p+m^B(hgHcM|FqSg-j&$*T-a~S9d$;-q7ReAO&vH550L30i5inFZ~uAOz5 zC#US>PAtD$GGEv05s)M$#`N_*aj|ai7@Ufw$AFG02okmRa<^`*3@1l4nt{)fO-nfn z()}8wh}EU2PJ%+SQXDdDh^#y=)n5VcgIas54?dBueF1wClP6IFZAe?)SiuHhialxh z9(f=QUA*-MYZbVX%v*gPU%pog|Db>yufVdD=zSbds)lH3%nY_)P2AOPY7~RhBTkrR zcjk^KBAeDK@}7Z%LuigSFZm~3S2h`{3iF%vis+E6J^M_jEdQ`I;{a4QZI1x4&Salt zD3HQD(sV(SAx&IT3#%!mry>UNs?C1+5wy_VNzlYkc$3n&Y670GfnynA{y2-LNsA1z zsq>s;tB{(pMo-gftB^N9jKA;{&zkA^PhYZiPTl0mH22``BQ*OPXx$9li`gd>sznXQ zio&=8wcROSZ%m;R6>yOv56fYV&5B=PP}l1B2}uj-tqk}t&c*dUf;p`gZW^gnJGq7J z0=ooYi&=hsd6W)z`B1@}nklMNd{OS=h4(ZxtZJ@)kNQRBt)7@2eL zSF92DN%6AnM!Z+zC8PJ*{S5Cc^4lotk1tSln|c0*3bUhDlgmCTY>4@T*8PMl-|x9M z@W%{(o0EI;c|pM5kvz9P&UWcv-w~jvcMktPmL{d0oJxy*FK8ufzHjbGi`2e6yh>oz zZ|8j4@n4+Zy70rj848r)ai?{Y;z)X4NlVNRkEZrLOD~3bwY)r;*LrE?h_J$eSY#*5 zSv(nM)@+M^{(V`b;J_;dCE$AQUXcHFB=x&Y>UUt<0qO=5JcEBL3>|5zdicyPy^WdJ zkhpp((72{rbf_R^Mmwta#w%X&S#Nq1z`6qrwdpgvtf$`{{XdevJRYk5`~P+Cj4>FD zHCq|7OQbAqW-OJRtVN;HVkufEg}Fkgcaf!}#Z>m4(8`SRe%mUtM3hn1NcMG>`@5g- z?~mc}n7PIn^E&4|pXYg=M=V@!weo7~uWJeleWbD;Bu&#N_Cz^1^C;VS%x5t#7)Qo~ z>^x;m&~QL(qs(DK)F&G#disg*OFbB5CY4V4`0VZkcH2X$Fy?n)X_d^&*^|zS%35l*1_Q->;;URK%dBf;^AKlND<4OsG z>vBh4aJu&B51mp41}dWaA zmYc|gADii(5ey9bn!;iN*Xi+RWEf>#UD3A7`gaB5Trfauk%uX?^Gd_jkRsvcV6B)8 z8x6EbmGZ(|97<1ue<;v&pg2)RrUGd80v3DKvq`<1gE(H=(KGjqBl7Yl@)&hi9zRrb z7oL4}Dh{%nI+*4^&ZE}7PLfY=dA-HWtt3?8v|Mz`CW4BEozeXfjs)C- z-j1aZp_J@hYsu~LMGBOI_=2Z&BWT_GOn-T>ozU#*0e3uKv=e>i2&dQrw}k^Y(1Sa{ zPvafD`$;i6fr15h{SmK~mkztiE*Z=@xx&pk2#N3T8dRb5*TcDmkd_Or3g>qLiRJy0 zJS>!$gjiP*GaJluVMYcNCUNqbfNKsAR7Oxzay)!~vaFeq3THxa(Gd;awH+L5PCnf?KLFX@Jy9mza0V7}_r#T5V zxmZA=JxJD!Zw>w*iKp}v{}oc7@W%^jv_DG+YNB5eX49I?1bn$GQNlv32K4(Wi)H0l zdfK>eIpj74hOb5DD}U{6|1fugiet-5TQ$_`y*-B33;ryN5`W*4R(=uoBi8E8TxU~` z(~c%9T_Hr8eWOPF3e$kbp@`trC~8T0c0y^JXYA>f2JCXpm2XkU1L?mSr-n{FeD}9Z zNN`iM0`~l|r{P|j^0Pdzs4tI!|mtZ*VnC_|Mvq)aJl@$PfPvtw2!p1$At}pyZ^>4 zy%_fkJihzY;r&3#Y*A7$Fl_Ag)&494vIJ?X!=cI%V*zKbDqPI zQdZvYYvF7>cEDwq@x4VK_;o9}X5-k)nlz90h}HH`BZmk>Iosjy#$9yJ7le*da7f$l zbkL0wM2EgfZRKU){z5uw!d;T~89#(w5wny!nk3wAcqFofFj3<+yD|{-Q6* z9WOI>VVe!;3LmFDK%QixyXwg|8jWpPBr8Go2PuI$0ZNdxq1$&`cZ!?PO8OD-t2vnRqGlqaJxFG z`)Z4aV!Tb8^}O>ml&-hWf6wepCUh;r{gz&V?Cj31*mwa{0<`1|L1Ub+nWxCN;mK_i z$>_btIAsZN>^Q{2o7={I4vjg6j+>!j&?Nqs&O>cXjP9bi;zz@CaLOzEYD8# zJOK$5Z~jSU?c67jQVmZG`IO=w;S(Eb z=DkEI?gFM7y=VkM7l`o}jB;7UnW(>&S;r(86#sC*}J&g^{Jez@Za>O)K!r}pM; zHBiCrubyQ-+D)qeA$~xNNn#$Riuasx$@$A!2CqEy`yT9iXqAD|$+gUQ|%c!S@y-!kLMZ``Z2_wtkG{G%|CVZBr}cSSxg= zNB0}p^H%v!u;`t-d8z+pXRUooD~}WGb**TM{`9 zH43Q$tWRI%t?5ffVv{>lUMlRVL6z+9gh&Y^SO}6_S+fdbD8W}Y`(INf^rt9g-6c6( z8LCh4GwVhB&P9?+I)2yg_|QlS$y7lmJUNFq{f*R@he0T+coOWpa{e{fHnR> z9P*XSimA`|QinQzrSMD$#Cz(7GzZR0Lo49t@xuuQ>J`~ZaqIgCye(H;)deSPsE_&j z*oUwXoeMJ>N){uK))p@H;!{rHUgbOy4*%3Undh@o@MA~hC%GX{CsBrLk6_>-zgr~L z^en=Awa5xb$1!j1Pe89`&(y1pD=CJP6%gyy1DU>>=bEw_9ZG*Nu{qEM&A*o&5 zYUb^G2e<0Sgc%+4jW{d6s4E+L=9BejXSzw?6U)bEIQe1 zHdyYWM%(5AO008edjG`K75O{Im=RFj{+$u)$>|vP2)^1F`tAOPcQ&d9-6=4wK=9Wt zX39NIkS(}GhyMo1(6V5LMKjmkkY>l%ms_s62c#D@r$cOlp}z5CJ@Bvk^d5Cic}_D| zS7Ehx<%9qYUcCR$60&Ps1x*K5Ro`RaB7~i)Hq3UaJ&*SqKOs_~|M+3o=MCzHh&7tr z0_Yw^0_iVbv^LU>3;CNzQ7z#7a9vXcQ!pa0&SkE?Y$s%n8PZ!f8T9z@lS|;FZhDrU z(sIIbSRtA&#;w$&9EgW&i_wQ2)3E&_Ew$2f}=bvzStWxqs79HT-~@Cyn_80mlYlbKaQQeSaEW$ zRjnf#$CoOv*MNT;KxESkOUkvN@&6aq!2*hs-sZuIvwt*{c1B7&@`eM1E**U_)y2Jb zA{9Nk55j))<@Z<`KXx|k<;V-4zIOzXhrJ9pIat#>cJ$vkFzft-y-94j{6|z8_$hV5 z4*T=ZzFK)wZax-b(R|L2R{C-qA*lE*_7lz;TrF|nDWFqNH`+i8!qKF#iQfsoj`AJ2 z%pA0A-ytYH%CiXX-!$3HcGrQ=TBy+0`Fd+|2?D#~{;*pV-b33jV51cTH5Yo_URJ6! z&ejZ(Bx;q-eN4hPyFR6_zdp1xW%_q`OIno87}MNo)d`{dmk8~EqNQeg+c%siGQ`#= zr!5wr8Ce>9SI}KUpz+TIo4ZT&0xW6V|23(v|&WUZzx z*A?!X-*H+W^%gddX^6U2Yhe|X)A`=tw?NTLOEcE8zQxrmb~aS7bI=I@J}FKrwyzp_$%Q-^X;q(sL7=#`2xJQ@w7@vFH}YN)0rdTA37!#56P zSL3BcIh8WtG*o>Sobi;G!<3p1#arFb{(KvjECD^QrcNSa@lwn{})bhiSB%PYd8Gj{A zd%QaCW=Mf}W51byIlX$|;(DBNJbG6RaS=E~8c_o8x>?L;E>OW&*p}jZmTc|4zn%Gj ztaZFYKL!o>xg?H@SXb6*psUnET6pum@P6u3YkpD*qLd*{D|z%=K?0xX1^f+>Rw!lW zBzPi)58%`7)$ng5DKigvsDcV3hkIg;{?6CB6jF*|$sdOztM%`uZ%VLhy5PP7& z9cWacx4kHSL!|3zXWuvAoGPVxY0T?ySLmXD2T^y^3#&4#qE26xCmzcTE#7;$+_1hL z@xOG}_oiB^?A0HsP;Q^ou_)f2kM?CTr4Ue`4~t-Q*LFZh>A^uAwq1N+|G!0Y5+4HX1z(ZL_P1I$=zk4C2 zu=w{jX<)*>B5425*_gJk%dASz=tpGDZwlp*y)-y>jO_SiRsGS`;T=b=eR8PSL6`sY zc6bw3KRmSfcgQO&Q;7}#4})W{o>=yF*+VN~^N^S5Q|UoL;#d`m2%3Dl~EYK%3c71sbt6!xF5`I&cq#c6hJf8NudXv(%Hm zJMhhIHJwF}l%I0Q*^}!bww&HhwB`tM6JAeRq-#%SH^Ut)Iy{!9O&74?=~it-=6RH8ka)&l%}`(+SExVjy-_Jq`AW9%k`E*C$)b4h;U zOZ~zwp=fU_+eqD`0e%#*#a5Qb!%f$WUVWzg@GKF}E844zJB3AhtKy#%wLz zDEha|oziaU$f5w1X-;{Nzc^)_ir)))B}T`7IOnp-rM!fVq)OQ*+670onXT+C_V zc-91kjiBYK>WK7ef*v#%hF>4HVFn*_W>H;m&W!BCQnTIEZ%(zk1u6`OS>^M0ew1J1 zsfUL2-A@PqPN$amRtd-{0(*1B`=lN1j0bS`2b+azS-AsLT<_mEB4t0qHXM05b*{e7 z?$NE}1M8PD82^n>vF{<*Q#kJkqW%m*IH-g?MVH{la&pIS^{JL&eV1eiqUtT^tqTOu z@0rU#cFso?*fvBOE*%)btT2kTTHXG(Z<5ARS7cFn zEL~`IJa2>qO7Mv-u$w@EAT+6Kua4LFcn|czj1i#L#TVMib<%=OQ|{lBRM3jYA16B% zgTq*{PFXm_>8Nfk9g% zgr8UeUGY%vd!X=#eT`{7>WgJoO`g6b{UYIeu>R_23jQ-N{YLmRfIT>sJX5!H?`^}y z^@hutQGOSK744pmuW(VvI)RtptCQQX_3W3|hem{Kp%gNR*-fn9o^lA3_&k~QO$aJ~ zE#UYha_`(T3>uuP8{PUBRR+D2vGs%U&@ZPaR~~x3e zA^9X?U0_b3a*5%l1oi$Mwz7N#vHbZSdBP7wPxf6KuY1<1zuY=gH|(P|LTDJ9ztmJ@ z>3h*7Zsp&p*{Aoh!dRR3${(sw@H<&#VD=_wFZwCF9#^HPI`_&7a_(X=`!1)FfN@mF z{8Zg>_KRx`qccW)vu{C9ZeS-~OBQJpfH3UrcUq@oKyHIk)St>Np(zpyVf+U=6)Si2 zMU>I6qq=KrhTku@n>4N!CY{BubZ%aHACs`@{yVhEXHCNX&e@-51s!tKoVmPjZ9^pEo0G_hab6q6Ky|-%|Xg7Gp##5T_SUqz%#|ijr#|+_c9NAA%y(P6RYA z#oV)*blM?gEeu=E`qpkqhiYTUSZ)8pLV)JPjZbEG;E@dQky(yJ7V@253OFC5AGa}z zQTfdYF_|+-gZ61F52fzkP21F|60%gSz)G|o2$82n>DKT+_cd+$;yQHIYckruf?}1& zMPxU+$f=u$E{Q1$Pwu~FUW|LY&vx3^pQ7PnvoY7!$yKUixbo@I+0nPzh(4QV%66GL z|ElTAw9xtKC)i!>?0L~wKeO~dj26FqS@U>eM!)nJSllFw@6hH+Vuhy=s}0p(W&hrmYURsu3p_3M7TqLE9O^vGTP}d z#6L-z6f&d*5m-#zzVM6yb=mHY_Wrf41pe z-iW+i!EVc&u$vj_^7LMCdFFQVxBjS}#}%BS-F}SMIs)Kk#&aArdTrE;^*gEf7&@4+ zc9r%UIs zz9)45usIG_ey({AJ-*D}Xtp}UbU}USE1#Jk^rNGN>z9YpDyo*G3}@RN?84}h9ZiS9 z`+;O#AXQF31Ea4mT|mwWINKmQ6cI_%L|YC0I+&FaK~g0sZosXRnQZ~%hw&ZCUGw0$ z0P<(tX&z|FAb}#yihP#Y7wXSg7^jbb%m~ufz0E6CoSbmp4@b%VTht!Zi{86ava7yqzhX{ zb{_sIwW`tgKu4Gxbp3JZEds(HlU_8+Uv;a-%X*474(%LpCG-|;o@L)3f%-}a2Fu)m z2Rc_GCucTiATx{ej0RzUlXOOTL*z>CdkW5)E_IV(uIU~Bk)571Z0dwW{bxg5z@(o^z|e8O~)`(q{#a5keh`y$o+|oAU#Xb zhfv(UNws(Tmh1Bqy5)05T1Q^X|NOgRbmD}0EGgsphq+0sup@gYjZu) zk$c^l$J|_Fdni-khkxnfy11~ z0Z>f9O~LQ>m4SF(Kpf3MgcD?w8XeG@oXZ!$uUn2@l)!^0>zZn;z^eqBjRu$$wxOt@ zxiV{}dLShjH$f3(^zGk>1j5C6Ep%%q-ieOv6anup&%`LSZ(LalYMb>)z_Z2*gJd4i zpAiZI?*Y|mUm;X?!~L9~#p-Or+So2ujtt|1gbvub7y>OHsax61n?Wzna0Qj9;gaDq z?_6E5Ry!|InDt%hd(Fzvn?66{ zJ9x9$f5+=Y=va)1#+}kAxA4O%FXv8FeT}L?AngRlbY}C3h|oS6KMLTUKLt5IgpP|K zog~DSAExSe#E~bS{s_1avJV;zoq1Tu+%wl6Bo94Yj5_8m5OeO2ZAqo-DK5-QY)B zvn6KH;|S1F@5!EMiN)YV%7E+7MjKpYzBr8CFJs*B`73L((7NsCN<_H6smD=p zP2cQ(X>5}Y8D%93<|>i!$`3R6wIU04696c?UH z@X+`y=4T!qo`;Q5?FrMnXi=b&vzpYq8-9qXSzlIVel{exCC1CWJ82xZM}*Pn`;fy+ z`b`z%xK8noJezmg^*QSgY@|J_Z?oPM4vwdWv~a5RKrZU-?jS&^!54I)J348iORg=z z^%vcEAC!WP%jp<4H{roC$XOBckD#a8#k>G`8-@ft>SjdCcSrggmB%5n8QqJotm6Ug zB$A~-;C|#QsX`^ruDa0laB1!SmC^%2H_FzGPD~$(g**I@@7?>uQAD&`og=)B{9w;W zwddfLa+48)T;6)vrw{B-FY#t=s)tKl(4|Dbf*UJ8`}h7EPOhz1i+Tg!l>*zd<8s{1iKg68bab(j{5Ljp>ojOaqTOHMI#$kVF8}VPw=R^A;%2K+1s8~D zK@;K^$N$zr!sWqqIyCxT^TnAqV3LS+#ho^Pi& zL`tRa+(TaD-?|{`m$Qo2_|p&0H7%FFUjNMOqoX8-*_Jh~(KRGcV2Hz6iI(E0Qk#5s zLatJ~u@S*b>Ock@`uJc94L?7G9^~$s>$}y#{+?9;TSQ*N6}tWod!8&O)kUjP{gsKgxNJH>JjVz6EV znjh34em^!lZBBf23>tE;(8onx)IhQX82#8o#1WoE8D1_`ZMuFhs|fmWZ1Knkr2_Gr z*N)z@`HQ=p7*CvMyzlFp`4%A7-)avHo(9>&ms+VJO zxz8`&;byA+sBcN*r%nBO?TkY-9acE3nuiu=hj#8*O;#TF3ai*|9~F~7vZaQpEwEZS ztd^9$w@jxQ?sfb-_c+fPZbbS=9l)Io{P&i@=H3LD)Z_L_UB0kPyZjr>#>TQ$qhq;}zlO^`04bxUiV( zN*6>KsiG;{PD8}&+OGGAno4-N-t}XOwEQ98vv9NDKH$EVFMuy{k9i8sVx5%7he5v< z*fm@F@*vpZGWlb2Bxh&T1t)>do`Lm&-46)5KQHAZzst3M*qh@|ziY4D$u{R03;f8U zMf{zzIz_9So_V_Olu_o?CU1h#K9RBf5F~jxK>{+7%&yCLA|atJ55W@&S}9IKW5p`s zba;8mnfeGqloLvU-0W0s+P!BL2LbaGWc?mhNL6L*Q{z2spl=ie&qzRN*3)T$Z|9fo z3|Cj;CURKD5#Ha+5_m~Ptni%x>#%Et(Z@2hz%#DJ20ZJW&vb$&zwOr}FNuP0xWqgV zjB_4E-Q@iC)d1;(WWT#r(8N>vV=d77oz1*9ewIFmE+;GR7TPZL)=COdAQhC$V~xUI z>OFe?9qex2r|BGFS{sh$0baQKDXc#n7}~%zUD}{}q+Z1xzEL1qkyyL$S5^)n`$gY8 zM<7GdZgLcXbSc+EUa;_!KQrwTY4iws+F^c3Gu}A}TCfWBBdvZrapT{;J2%8~R=E|{YwZ!O zM&`1l^A{+u#nbRDa}{S)nin!ICakWh9MsGl)(uTyT^5u`RQ7M%h;KhOK74T-Be|U8 z2+yYV=zG|2YFtK4N1Un&jCJNnmc8(mBP!%j*5BPc((G>DBa*py!b#ODj;dWNxlPMY zOW&n(IFcu0HY*EGRLXrkVT2?pv5dj_U?YJmD;p#0?kk%djHXq|bVcu0A^zeVEpD&@ z@p~%VRiDN@VHQFwYJKG@iLet{sDR*nkeD+HObg9pjJ_EoNl5TfVS!5pO2BSzdEuh* zJ=D$v$?{q0jp4G*Rgfw}n$zlKq6LMp=6DZYwYownBIJPjT}zj%E+`_7m|rb&e7)S7 zmqDZ1oyAWWY%#DLgEFt9s(Mm1PvRwUZlwb94R#hmjE~+UY(LcF#uu5``s_UfI*tUWTs+WWKR^14%#H=CGc zE#o~i$$Z|gYv#!P?a0WBq-7fB;l(#ngvm9Xp^N)-GBgp{KqHWgfczi*d`}Q~7TCo# z(YNKQQ#=H=kZb6-$fM)OdOx?*x1c|mmw$>IY_Gi446O6`b2ZngxN9M3f75bEcRW@} zJ!pCCGRe##5>F9ZsBN%w`*eSV;*nRg3Csx&b@9EfsuV>GO;dz5zC@5_(~cl&x(ul` z>d!UJ50K`f-jmrAc8Kt*x?j1zIRPKIr0gM3{b1SkCq1S`wj;@i=0V8hqD2Y}o(m3j z%cWfdv_{7QD)9c12b|DBBV_Ytxz^? z+1q&`HA<%Y1rNU%G&JZ@ySm3ra|?83K)>u*d|a_MSXYxo3Ka>BIoaBZ>;HE90{UC= z=@S-+sfY51C~m!lw1EiXC`)8BZ#RP)8QL6QvHWQ`_%1yZ#9(R%;!m)YV^`JgGLM<| zrh|936zk+KYN+VhowicQ^CG+p5xLSIQbLmM4MUlh0(|-F{9qeVL>CQww%mTsd*S|m zf?8UX5~aX_SLnR95^=dEnS|AG*5T#XMSiuf=6w7f}I73At)i)W!{8n{jN003^6 z_xQ1Z<^7$t9b227mZqjQMb}h0m7&GYoT)~-0P~R0R=2SFW=2Xyoy$VqwnGZ7Bff2r zmOK|VrBuYlphf-y9l=0d{(EoB7DUFfjva0@n5?f3O5TN_xR{G zNsx)}_yd|b%Kr%?yX%)L`HEpb-z)o_oXX#!jvSFUeS8Q&J3z@sNg;kY@f|{1CwighK#>c#Sc>O@W^n}(AhL+feBp= zVYSc@O!st5BE<$DzolamD+mA5`g44X)?JC96m}L8Z=|q|)Ok`nK@tqw_%cQaW^Z=^ z?zBV?DbgZ+{|%PH(ntopy8UqqeDbx1!Sk1(AOgr{&DxpK-=j_rXqT)!-1po|P&E}; z2f|B9W-@RALC~cZWDrwkOxn<$5M!m!L^{-()0vS~+u^37dHM50mxZaovwl`i@0Z2{ zB+R0(9uKL~?A}cT(*FB%>_6WA8gG<4=peQuJ#XgeAcIl7A+dF@^rpUlq~BU4CMC%p zmOA8A;}ppiMpnmpEBxjy&|T7cadT7hC~vaSCu33R0%lOa#_ z)bXrd784#hDC!rRz&Enpg?T;$qYM(c6kL@;yhO3Ye)EQKL#Occl4lkuN;L$9(9KNg zl!wsA2E;o-1)ny{HB#HcbDjY zB2v3it&{U1FwaGU7QLygettoDcg3bNWwuG^RmxD46KJ+Y4);rvGZ(<${*_P3Jl=Lm zKiw~|f%+sGCk)&n;b*J^#)z8{D=vnV$=Hs4JgJp<`w2e1M|Mb42HE##`hWvC^w*bE zK&D;#?Aj0B9kiIF?swz{JV52LR@*Y@rh*_uN;l@wdbtNQ#&hr=%6@>C`%(hl?D9Kt zbD!UHf5F6<`r3a*VxrDQd{D4KE<$Q4Gop6kNF263hHoK+^_^zKgetPh5Uz8l@ak}U z6lw}OE)(Msa{*cl|LBgT{0)Mu##InmD#~FaO9)CLRdA$-*a`3W@y|M$yIK}@-ZlotWF8t{eCF(!8! zKh#1Ue4`}=yx}A9AKj@c64AplsG!m>#Q-iWGof6 z)2dRvxBY?3%JatK9a;z3Qn?ir3*qOBH*l@X9ojAoa9yXn44kgL;>=Vw8j%94Cy5b)>Y6ViyAD^XL}m5W-w#Jfur=LlTZf{~<0f6lKKFp}RP_krM)lFh9T>DZ-~f)O&x%r4^A&pL_Drxq9N-W+H4)XiP<~C=b8} ztEc_wTF~0Ip=2S*M#6yd4Z2iC^AujqBqzp-3KTTu#E_Pc+WbvcL(jphbE>&KW4#q| zrPxLG@3bBeo?Vrk#|zK45L?ul$GUQijS@prUlD)hn9FvxATy5_z@Tb~{33xZE4}HE zM_M|!_%OJDqrLg#>t*bH$3?23m+!1+t7A_JhCgfxmdfBowkQ|2ZVFd6E8&Q*OJy`OB8O#%rFVXiH9g zS`p1%lzcZFY@EHnYo34NH@#L9ulvCp{9_pXys>`Ym3i+Q0nv824?2g6bP;8z=G?8T z%_S5AhiV%{>5IyhC21LC@BrJkQ1wVG;jln+{_5SGqdrmeFo$onY7MJKwf>wc>%uU% z4BW%~vRGzb_R3bSgzRZEy|$GMXJ*mZ@B32RpexiJy^u?sr%r=ajZWO5(POh5-3G*F zoqCP#CF6Hw4(3!FAK<-P7|{Qilg|M69UiITKk z`dGn6V_w)wtD(6+4c@rM?E&UiFg_Ctn`*~tRRm13#^D!ISj%{tYYRSQlw0!V z;0llPUe-?)R@j(*KbDu}<$>hDl;o)#Hv4HHtoQmSt42Ge+(Y22+7R}3&tGDj{%+5@ z2&ekd@T+<{UzjgKX_|K5ppixTfdDMqgH~Zb56Sf0{m7MheTU`kMQq=>)wJHWn+}W@ z>(o!O73Pkdc7}GnEpQeF5&h+-2yr=!%rr8Mz_qJ_85eyc+eq)88wvg6A{DKqaVTW! zw`bn(yDfJZ$lr>zEx5fDCmg@1MkUoo$X&0)KtOc=*(~VU4n{zrQ->~R@`mu9p8Gyd z0U9i|1ABuT-Y+iA_AW0>Z69B%FcTemnaDCb@+ChGx=~fGT&$UO_jRhv<`fIwOx31w zvp7A6FqPB0wbUSXdAxK0q6oZhETVB*2LCeJ)xmDPO z-t?DGiJ@l>GqOWYzN(0DkC#tw*jX zZ++L+D{!)Hg}OTAr2MOnPk0{*ujl6C@%){E{Qq4L%^9G_o1neah7dZZTzRriQ|-U; zr|H?of@on5=G#9x;=9|}9V+V8z#@#RK(hnz+ROO0rmy42l%rfgydgCgV2AF0!k^+q zWDpa*p-?;Eg15d65f?W&_tSUv^|rrk!#Q6B{ko8`WUrgElN8>cfaCy1K2Lh}e!IFX zkeJtuiRhVf!bSNO;0OV1OpeBq@8I$}jnoB^mNh{c23y}6JQWVjSkOj%VUG2(a-u9` zE8$mx&pCvv*o(mY?#h`<3etU_XUcVP_{0q@Xq+moctdv`zfv80b?0>vdrV;K>rTwv z4%vG^2_yll2cR>Ks;-t28=17Dq6jO8Fa;B1lLW3no7G43Yte}@gL$H`d};fP-| zhqQQXJa>2t5aMc%S9E93qf^I_yOm<(VvtIRaqQx6mR#)Wq0bK+Dt?s0wg3}FyU^5w z5Z0&ppH-9oHru)9HPR2FZV@W)Hi#$}wXBzl^+Q^I{kDZYX?tgMC>zF~*VL*+gt_|p zbk`4-59Se^%MzXs2zU0#>S;sFbE<+nME1AYze~w}{+7%VoVi8{|GP>$QZu~0;$l;2 zq&mkW`q$Rg)~Mu$%KP-?r};i?ZtGs?JNxc6#7=KhvTc zY7IxOo@oY&=2St>1s_mG_@|-n8BweAE2xuUk(Pgxkk5JmqnFg>nQFZI%NgO|_nSw2 zUk!w*Ksux?8H3#HW*tif%|kl_sWw_|LY0&6eH`pBH0$x&*_W-ksDP^!*+w z^PRtTP5&l&BBbPuJUCYII!FNN=@Rj9N(;HBGSDTh`}%9#ZAB4@?t(F__Z&d0Y$jfec4w+lgR14t!L2!|dJ`W|2{#KI51xH21fgTvszm@$vK z`D7C~?xrN|lR%0Zzq65UVZ(Q7BQkQ)bT-qv54vePiIoEI)$OcI9|<`r+$%8yJt8?a z;)F4)p!(DEZZupbrV#k5l2e^&Jp=}4-6U+==!}}QvlH4Y4cw$?@5;Rh-xoWmdRiSH zTu~KhIVzxvnyv-9XQ{VI&QmC1G>Pg0UUlZsX<2+tD2A7+$Lh`Dt=FrKUrs8ddudTl zicnxEj8!g$JFkeGRx|{`57bhSckwF^&u)iDW|^lR7Si9KzK>@`+@aAm6Fhix6ZIA3 z%&&#}`Iaxc4nTokCus2Olvh9V)-d?IY<{!%XdW}K zPSbrCJBjP7VUymjoaZo7sC4}vm$yGp4fQaLxnpmG<~7pO_8djUMran?)t)kGu)BP9 z%g7I#;ntl}DHs1!Ih|}i^w0Zy@q1@m+o*2~P;*|FASx=-l`ZKSxo6FZ%PTVSb0>pc zKc7eE>kYH5j>iI7|kw5`czovw=d8hJwZ>>q%C zh$$Z+*Xt;zygw+crU#OYfCJ~&fT$}rL&xaD>%@IzOT&kLe}xSyy=~F*d0v&;nr9NC z=haWG#oh~F4PvY5YI%VhPFBW{g++B7>JlAO`du}9^+h4QFsV=*fDq zf3?3L_yDWsMnj8O%wu`P;lsetNK)_H^$>osxS9G($XXsemI999RHpLMq==E?Pon+wwa!%o-r zprzO#QRK9!ZQCa?ByCzyb3o7|@B9}lmQ-?`7RDrCv28-r5Ow|pSU#xOJn;8xPrgX7 zV5LY=_VBbcfi6ziR2STZwpH9e3x*5%D7Kn;Wxq{m`B{lf{h~>5_I)-UatVt${)~N4 zoq?^#Q6B#;Q6*+Dlb?orBTN(EU6^M|<0sB_!}zWd{z#a<5cfkMV1MnxTCU}`oTwTI zBtVi3zq_BGVTmP`mhMxy$0-_^Yn& z;PF-?Q1Mum@(HHdaNTtgD`HB|^{d#nJ%=`M1{+kVeWz{-h8Jr8tXRDV1>B=@6u+VAv*FM{NdbB)-SZvUaX2^lf=BU?2n2U20f5k z6FSV)IS~@L6JP4)@~rFz$A(gVvRbscYQ;!Z%h_qZ+_fP(vx4ZY?YewVOlxx%C{*+! zPUc<;iXA&B-ZM$F{nXLfE%`$Wg!_i=wp!blIDgCev%Yz{?{%%Fm5UeyDyu>odpgl> zG5Gif>j7YIimkkB_w#)``!bJOK&Nw!cCMCJ=s2tf32&pIj)^n7)GlmDXS;8Irl+Xz zTIP%Uy|6;n4tvmzxtU@NYZ#)gGfK}O3EBSvfueq?v*j`9GYhh`LoG6WwB)RXK#ISh zRs<+gXQhZz5^(=jp=UP=Kpr=}x9Z?%#gNruFjxD}S>R$YB&)Z9Q8I>?4%0ICrAl zVw;Jc1NX!CE$J7wlV!$+%A$UF@_*3VKMeVESf7?-XM*D%y%oAJs5Qbn-+YmkwbGs~XLj*T2h4*r~cI{zEY@hOd+% zYG8gO2**DU{2YY{r2lF>5KQrmC~M=c8^<928z~wBq{ARH{S;fZU{H@d^Mn;|zF zW+ZCeWcP$SMe!9THrCS}#>#aCnhj{GB9zb@JB(<1e%yc0Pg!B-zvHd;VYyS1uSvbv zj4gK-pxE+PBxW(id-Lm9vS}>&Rm(F&0PkB)wuGXdX*j!+Fdd$ak>3<+5My5UR8D8; z;Ns(ag?L?)V7DlI>Ekr0Ps0ne`Z0USa394RXFq~StUf>SU{8S}5^dSc-DgRw-7bKf z6D?@zL`%v*M=GlKei$3xF)TQcgLtfYZm#3+XNCO!Nf(PKhdw^HVV=Nq2{ZH?@t_Ez zhijo9a< zl?K$$JI;en_4T}#YKx*AcU6T!MgGw+OYrC0>tu&(CkzzS)5g4B31_@FE|9LZ+{u)& zeXUN670|kRG3BDh(}OJ}uF6Q02S8luUNw-ojRF*%G_cTcRBf z2@oY2pKLdS?np$7oh!h2wJ!)_wea0Dlnmmadm`B47Vqi76bZ$7Z?dW`YA=K#&Zr+G;Sf06U;gf?V zx7N_>qe}{*^hZb>#kr0j@CgKOE2r<8ZI{>J8+Ir^#pLv(Jv=$?+bi@#L88`?ybtSP z@nn_@oh@(S7nNvwAb}r|Npvm(HH-9pe5ZaW__YMn1TgpxPIL)(=2`H`B(NKit$U zbd9!g@75nPY}v)rOF?hW(!|gYo1%|NG=Iegk8Ge`2C>4Z!ncbE^hh0sc%WkpqO^PH zjXCUJ5Qe;|%j?CxrS|Wn4YI#9)L;7CA(@hqh*(z(G(z;eQ=n+QeGBS2^W`k)?5BC+ zCJoVQS)j1$E&mi8vUAuIBKdnP?>ll;nCy9S=5}Y+my01)s@-;{{CdtY%Oa+~xKV@e z8q#-`I1tV|ydNl))C!Yv%kxmy8L>Q5LA44}Xim=%&#R3!vNRgX`pF4w7~4ujf-X-x zSuDOXVJei(7uC7fwkPZUE8|EAj&-RZMuZUHYf6sH*MmJMV^hT30oy+1Yd>yeRVg2I zj|!@qG22m1_3P9PwqYCX^J>X)vva*X#C-iml6$`(RC#ejaHeiyTdb5t!rt zTP_|~l*WIiAa^E{zd;IVe_|PeBRgP44taFL(?)j_A&8a+?U$k5*8{F6JTJh0K7GVr zJcGV}?#ORTSNeMW%3pG?}I2p^iwW5|8PqJ3L!WVXZP>6)N;KZOf_<$@Is z|JET_%Gukns6HIs1-pAmBCTCW!o5=?#Q>TIe(< z^j47`V{;ftMHNfo6LIgT7|Y3e;sOdX5K~2(CtP5TV59VPw{K8ruO$t}TV$a~pR=ID z5F)1NtMQ-wUFhv)+*_X+HlXFsC#SA8A)C^`D_Lg&?p!^d`#47-1zI-W{A$C>D?{_4 zVl|}L1WFmCyUlFK!Q(Wdqt~`wnN-$Ni+ML~k_vQ=QM8FW-ZLHqLMcZ`CsKrst?=G>2x{f<(j922Yi)<2ylT1*kL|%l z`)0CJ2r`#Kt{PEloCNsW3@|FkBUx`f=;VGYV$j_NvzI(ZX7dPiB^V7L0baF{abs%2o>TEW?BO{fEH0f4WgFVB_8dWEB#2jdfAt%-J4Gw|a1y#^ z`SH}ing6wch)lDKV)d6N4$S7h-4q-Dz^PRfQrA(YIr8%7LBSAH0p`2=V{`sb=>z_q zj90f4&@U0d&A@L|)dD>De>A;$JXHVt|NlH^W*ECHMPR$?aSum%gO71+UZ0cA3-?@b2>Sb}D`4RRGp4C~2HT0g7mnPl zvRJ6xtVF=&I5FhOJ>|Qukxv~b47Z??x?tnNs>@N`Cu<%LJs?awPWq?>{8v$o$Z&iM zbUM~gfm^krqm|VnD2%WejT#4rQ}urL&p(RaP=Cv6%j^)5dQRXTbL#ZRrhns=6Yo0e zN{F1HtS3onM_Cj{1izy!a7$R;@sr*5-ZiB5)z}^hi>|gIs8$|QYhnT(CwPb0=$cl* z+gZW!e6$Xu{dnD%0a$k6yn=E8Y3CgFRCU=W_M9+O4 z$3&X^LP{N==8~v(_uEhOzi<(vt^2&jK~gZ+f}3FCdwAV*pl2eg|8z&sNG?K?Ip8O6 zDd7J8@0$Ukh}X#`mtv)VesjXR9LC($;@Y#jO^h846C{jsYfRy)(&J@@N4I#}vD*#{ zCz>4|OAAN771l&5mg&I&`&+n}u6O4zqChsnk6OH#aLc=$~d=H0UMN&@N?4 zgPud6V4#@eJ))$egB>e6NL;w)L24F5Hg3HP7m!!c5qP5^)=2~gUe9G(5{U+qWygC~ zfZ7aIF8!L*xz)T@Qf=_i+4)FVMMP1a*e>|MA?PlWp-AAxy~@5wvn6n@1AWTNP;5`0(WEN1fhnEs@}q0sf=$K@0YV;+ z=I_!wbqA};&gP{Na45e%H0RI-hHuicjRCama{`WcfzfAA^B4j+uSos!Y!nEskSu%0 z7V@XT$Z&l9m{N;3Pf-@^-2zS((?Y2dgw_FGy;C?Z=qcU#i?2119=?)fP3>YYyJanA z9Uoh*A?W8^!8{_JBZ!V9MtC-eZaheMco72O2R;j9N9rf&9RdR@fiuR)m1V&jQWCfv zeGPpYSoTALemfDrgfg_U-}>|DxjBHN0Y`RLnypkA%u72Qi# zCeSz?&1J{_(5h%Rw+Y?NIaIk4rW%@qyb6zW;RA`}m{WI?eq0%C-IPURUXSI2Z84w)cml)vZxVJocM=*kxN=bI$CLX~<{&9|SC*$>5$$Sbr^7m%cX=*iH@Li(0ndZ&p3~|;rV-(`0bM2;3pu3a zb$$(JQcyt(d}~iE0TpO~jT;fTqAtf!E%2&rlU%x7=^?*fN>ji?5oaJZ@HE0+Du zC+vh##tm6;_%#@)vN}5ji7Lt3j1Gd4%0}aoXSyQPUV2!m>niz0SsPf!`vH_K*N}9<} z#I0VTSRR=9vkeOx@f={)ljH&(UBmK$!q5PSHU zEYNt1i4$BjdG)~p4fgb}LRA-$?IWlZF4w=xcicynirXBqE14 zK$->XGEgOM{I@9aw1_ggsI(;y4Va=a>hWdYPUedR?&A%~PvNFpB-M8AL^DiXs#}sD z@@&3^>6&wzY{?n9$V>xsE*ZNHZ$Fo4Y73<|O{kUeQpz1CE9iE~KLGobPULD~fwbS(j*@8L}aN6 zBnHeGuc|BC#3L^!JXHxTELwT>YUOXf8>m*ULNm>gn8`uLGM+m?OO(YLxj%O~T1m$}dPoNrdt?RK0^!qm}!mO!ERnL<=ms9b^#H7=#9FrTO zO{@0F#^_C7d75Xe8W=&94v#&&0=SJ`yKvOhrF_&gZAzEzdE`^2r?y}8#?+XPis3JR zwR7Pvh3B>vu`c=lS?@_4qJ&TOIf}TkpNQ8|09;fuS2bH0>H8ULqO7nXYcAm9$e0!= zx-SWI*!t?1F(WYfKocKd7wq6!@pqH@8fpRh{94x&rw$bMnpP>84|TUH_IJ5y@-D0a z`ICPyCLGaTZ}SF|t*H<~WVT|~Q#6t~?snUqo#wf$MB6qch?~tW%rl(sX!2}KIy7CO zaxy0o-(@ExdGi))aa0asX*uRFlDYaRHCnUd7y&bHU#!Yk4En3KiV^*`YTPB$OQZ^a&Td`Myp!Ndz z4q(|nU_dMqTa@EKEt<9+$a7K_SbC|$V6+j>wdf!s*G*WDDpyQJXwG8m68b1HvPin3 zKu#V&uN(m3FDLR^Xa~ipnRsYP@v&=I0#DzMVAL(4jfCYPEGq=(cx>+U844U{9BqjG zhJO}D5+^)`1zY`4Umc`c7I;qkng64xkV7&*2F=C1K>aQ!@%pR;z=2A6h@D| zr9X*PSi8{v>|A3pPA3yvYndL?PAZJ{UNPo;ak+ghGr1)(nw_jVZ!z3xv7c*GG=|W za&&%`H}&>Jsf-i#u&(4_%F&R~kpgVHUUxxw-<;_j1Iw|+)mZ& z)**5GZ&4pjDh;kO(EtsL>cz5*uGQ2)0&Ar>k2xJ5(e8;il%Al|(gk=b^cl@LjP%o@ zM;wy{JwCvretY@m#S|B?z&Y7L^BKAnG{KqclM9;n`S7=B%+F02ySg(~dL+=Al;mjg&!ibck78d7NBe6 zU4WAp_Ky*+TT^$6rlN#hn35pR0_7nU$wWlF z!8t-*iRJbX3Cl!Sh692*-q`sm2k2KxrLIuCu^DW%QjT1-Q0vB5s{4-WMnU{tEBFBMc>aKlHbCG3QBEGp{fr->ojDN zN%|n(V&!1<eAHFTJ=dqC2;8TA*@o<)=K{0AbJ z5>;!Pl^yjnFE*`tyL!zb-M6b-j|tI^hPpx2$K%jo0oJXRODPAy!nUL_r0wUeoU#0C zT`CQF7YFY@rq^uuwLP`{MVUfGz;gqX;Vh{|#;OIMtSq=O@v1aT+iV$@vHS2UyjSU{ zU%;v@s#&ScVYrrZ(Z18L6b)12Nm2MAI(><$YKSDkMra=i*%&OA)*534yzb^Li&UzE zmG?!lad&VsNCeDrezn~_^!puWv^<3F2)xv(R{MxMwd?Vt*4)0B20;FuQADvKVH$X5 zx0&b`w+gh4LRl0TsMg-6dw^pAhngB7PaZC?D%`8S@HD^gYj2m5j6B$cNdC_1|McLC zyL~~$PmOmobi3)qKNe2}_P!*@L~GZTr?DUR@#y#Z8cPQMs@2o>S@YBS@L%yoGKxmGDZY;VLoXF$l7ai0Y6#^#}=6< zNp*SF*uxC*fac(sNlscFqA4!8Qx?1IdX~V*#vgAX4j)7=3@asa-L^8B$0s>!R+R$p z{UTVAfLaFjLjZe4(86geuc504c@Jg+STonQS4P+iEXJ$i66H^olXTI=tDc&O^+_pg z1=wj#d%ZjAa8F~Os_vfw*T{?aF%v6)AJd$ev6jE?*B^mhI!b>o6JOo&EL|tZT{t@; zwm(W)1v%7mwU6Ube&TT&_6m>FAlN2#pE*;i=rbnd9 zbh<#<>2+Vwg{i}__=nzabc+T51F4I|ebc4rAZPPhrW}e1<2#0|%NGmCU|Y2Vi>5bP zA`npOLdZFU^sYpzf?VLrXD*Cl$CfkwP;YWI3Y zf-5k6l}p`MdU>*N+H~k1^(!v95(C;mW)0Od&~&tB>0ZI!TMItNF5V^drGnJxjfVgG z8Iy>6FKj}M>h2NnX4ka2ri(;g=fkK+hQftaoJ4rh)|fJNK;?QaT@~deL5SN4TtkGF zAwC@VxQh_L_1tH(oUDeT5D zIJlE8mZ-)V>Q)ipDJXC>+2M}+favP%1t$`t$Kg9@u#Sw7U$}zuayDi*2CakP?)Mk-&w{%%@A2o47L;tbxoj#& zPSf4y0`a+t{A7xxU=pr`MCdH`-KvlDo^rU(J6PQA=`2bvr0svmGd=qpY-(% zE*xhC+}{wj-e4`Q%xphbVJ*y4LvUa^Sw#jaXj)L@67 z<+i&?`f36QJBmLG8&POCDyb+27wy2PdEJp%+DD36?}PtSl=$>|#6YVi8O6{6`IV}*`VVy2=NfPfzifx z8~{4kcAZ`F6e+!Q7I9R^?|=^B(92^JmJK`_d+-_M`W}ghm_i(Zku|@d=I@!y&So_-hMSae$~sgI zX)Y(R7j!k*3orT99jn*o+6v6+FSLuY_BUupjF+Uz-TSlzoV%BsWWWbT<$uw=OQ=ks z^Io3+6b`)zv*K78D;Vt9cOp&UOjA_ZP&<7cf~OKw6K(+Eg%}y_I0H$v+{%))(f2vB zp500tSd4}HksGL0`mCB`1Z8zR9a$(9Bdk>?Ah1Z-n1w_XuXdc~=w1c=Fz)hBp;*P9 zLh{;8MBro$8m2BC1O6|&`-YYekR($r!QrPQ78Uhso>;LJQ9zU^yhL@PbWKJ(Gf|eZXY*`!J|evsahN`(yIi2| ze^kT z*FR1QZMjd~>Dy8Ww`@y1wa>+L!a-1v>HIAyU=;x#>ct{jUBpm&+s|!AoSzaV5o7w} zw4E-$J~X+DP%Kd|+Eb8|a!4U^Y=~|u{J8-o&S??nw>;-H0o68*ixlnpFVttY!oq?0hU*w zym)JLASL4$Tp_e6Cuv>wMHaMZM=an4`{=yZf`JoBIe+D&NbX@tpfuamQ71f5Ekq79 zuoCk+w^F!vr`!8IUlguwH2e@noZdXFAAVyk<`f}ttCnasH+;o3Lfe|quO!Aw9C9$0=&Vr?0W zC7_ABF}vXdvv@wBN6!5>xn;}s?7Iw$niLnL>}D%2vdk3kGg&xWtiss$_?o}@)Y-EB zimr@$3Srn}STme^efr{Vma^aBUNJtW_PStlT@vlN=w!=kLR>cO7kl#~li8JF6Lq># zKyoKm5hu(3N@!yF_;aHmjcxS4%5pA z&+Qfu2+;3DZ!oBxE1UD%h?mhxt_+E~dC*~w+v>>bbz##rxUud)v25ZfA0H|0q+Eh@ zT>rz|MdH;jBKCQGePPcNkoqL%h8W%h*Ak6((xIIsFIOn44kYHODzU75fnz-;H*E76 z`S(UtY$=h&)ajpgYX#<4SA#~};MC8;98hd+UBm4tY$ctWc<#xOOd3JfBtfN3Qr z>9CM!#k3WD&rpiSgK#PB`t(O3rFDPK6Aou*@bb3Q6ljrKEO|4lE0Zn84C_bN9s0n~ zS?#SGsk0;d0`a@kUdiZUm8WAeBdte5@144PYR7?ZE+nzs-TNdCJx@90cw3YEA2A}> zgzo3&RnjHN`g!@pRH3f&NY*3rMTZwEnN5!K*!}$mlo3I9k2NmoTaoz%jYHph(^HPifGwh$AG%FwSJcH)v zC)weBQ72C*hK0(6g-S2XX~-!ZjIJ)FW$JEb|Iy@Ww%X`Q2?cBt1_CpsHdFYaeFXxe z|DjZE@KcgyaQGT1&Y)H4d^izQc-NNmwsIocM{Eb%@7ViTQx#XXE%l4MVAE>E(3Hp= zW2JH7a7&%E+;7cFkXp(ngby0wLoY$tYeoer_)0<~Z5&^OLN2OcI$SwOXc<%1;$6*fiP zhd?YAR?dh*?zUm4p$F*$W?z;N)#ShX*m3Lq4Ap6gi!1r{DPP6ITG3ToE`%kB*GD@|MVBu zZQT4?HsV!;qN4f2*!v+^WhQEY_ZA6Df(a9z^f?&K3<+Ph)Kw09>TNLIgJstu_I}& zh~rhvA%QTq9)T)`v8H`vAid`*pRW!dgr;-Y#Fnj#Ol5-KQ=WsmaK>^40k{3(DZL%L z*Gj~i+NI7=O9%{@iMh(!P|@FG&&v^(>lly^bcJls`>UxR1mZ>(4edF)Z-?{=yjx+9 zRAhj>`r3_&yQP}hin=IN6;u0K=5CHq&i+x`ULqz$y#}DhpjGSwZjwH}C(otkL~2E8 zoy>B@Pvei5Xdwku>pkYAnjNpC81@O08mf^_YR@xU|GbdLLPK7thzqz3PF%WgruAm= zQ+%GPSD%kw1{D`hT%HyR--Ryc3y4sMh^%xt2Xg8be{-xcCnU$2X1GElK?>*fufl6Y zP`2{?d(FOJy>4;Jf+Ugk;M?Cx&K1unc*T>>ao!*1Ym(u^hdrW85qwvjVtJP^+0;AL zR^p{MVQZr%g_MIF~?{!nbKnWsDIo@;l;ZSwg8)4!JY zc>c{f>){!QsWL@&(S&dDw#Zaz*HtD;c0Ai?al!ZF&3=5T5^vmYa)#(dFSJ3GyKl)5 z$()$;>!_tGK^E-qm*~iYt_mp8ySyW_X#GK860YPnUM7EG+(@R%S8FNIamFyv-^_g% z%>W9~$d5KHw9YP@giv(d{gW_?-fT)Xesq;F==lyJTqsafyv*)|5`ygDI`&B`63Y@$ zB2YF&g$lN>zFK7ndAS1Ci^d4=UAL%A)Xjpr*HM)1K^!|-?1CayyU-gQ@JUi;Sp{+2 zp{P@$7nhR>v?}tvVF`A1cy8DS)SPMMn=lu2LHhc7FzAs6yTcIJ!y#n;(2pbFGiUaW zDBY2E!e>si!XD1kiv-_K;Z;x6F(*RCevlP|Z&IchnF=mP1e%8Z>zl7_NVyWg?$wZM zF5C8YUYv>k{W}ytMA--Y)_U-1=96``K8aS8WZso6ZHC#9ideK8^|&%NB##umwh>=~ zI?R&MSqGFSSLUF>fvjY%+2{+Qnr{vQAnz7v8jqQs4Gb7)-ZweMy9ywhrhYwm*9uGV zm?gt^@Sp}v_Gh!MED?Rd)hvqFvgkzoPL z@2kSpWbU&`%8N~`wF^U66hw2<+iNWzOvPs5#R`lsWXz2wbZ@`S0AAuJy%AzuZiN0I z(9Hf_Q9~I8S9wpk>(2?~$k$Sg+Z?L*yqL@XlYnotsVP()>vCF0-S31nE7B~d{7<1p z$EB!O@vk-b^J9WVueF)IWUut$l=_P_TVcrhdU(u>V80aWJxSj@n=;7Lnk?M2AHBL8 zr!;~aGcKWPZ~5fqNbe6cGIMx5x(B{3`=#G)LM0x-dzN{o4s~wozY``bRCP!*lfsiwV9vcTG-n-I)9Jcl8-e}l&!vv?U#=TID@9kC#;^Am zzSS$5G~I{>(9ZWgJDWaX=qUXAiEDQiy{FE#1Y*DuUj z`cy8iiPNx?CsqjeswG7kizlS;+xM{GPKqLtxd-bir2~Fxj*l!Xuld8YEI>Y8aU;k{ ztF@^XAW8S3J+sNH^H|ISM865Tjwy_g?Sr+2>uVwYNm2vbx%7V%&;9fQ76|BO0 zO_^`A|IEx#kU1AEh9XfeZwh~e^0qGG1H0_FB2HvRL~Ig)t!oEP+j$)VUK9N|Z1|8)5vRDRl*xx|ENng~4WbL`{b(@jdV!2$RHMWYWA+g8!oNJN6he6t5l%ma5^7sw}{p9b>f}nMG@dW(o^0 z>2IOK!r!%v+MewZ8X~`A*d7~3}2u0glx1h z=?qgYLH4c2b9^p(RJ35a6q~zrhC*nvm`0b!C8~+-6N`6<93`0HLSVC&=&b+m`D%eZ z;?+bqkIT`@$Rj_o|8Z8sW>Ypc8;UhqJnlB^pol=zlncJnp<^-hgbZGK59X5|5lO>G ztDgNpjrOrS#m@eiIN;0n{DK6uu_!k2OFm-Kv_=N1{1=A{ggr<{dlIVp2X6Jbirz*3 zuqchSHF_Dm4sk{+ax!T*cE=Vtis-@y2hFwOq&V^Q4K~&J4A{RS#~RNSWNx^*j&MRJy;<55?KkV0#-fFHU5=o=Su$a&e)_7^;<$zE%*C`r0*7|*kDgiF z1Y(Et%wM1{cjl8@cN2Ye6d(5K&&?)MnQ^MK5^aHci(wrjN05Noh<$h6+}5jH`ZbhE zP&@NMmaiN-94E2-Z<_QhlYCe&9(f+C^}lu& z4S-srZF*OB8~YaBoQSpjA|L(KP;8L1Qn59rCS@;g;^f82(+5&3ko2(U27ljiX2f#D zy!N|jU0yqS>0>*CZMWk+_n+wNUvD1Ul?6`6UC}fZ-&J{W*=Iv9$`S(QQw}Alhb`GF zX?ao}oF;pX;;|RfREF+E`uh{xSEHJys9Lsy9Hj7;BU(5ojys zD5_B@tk@F_i`z*}Nyf)oTF^fR_4U~<5N9w5B>QQ+ogrEb%9l3umloS$A5p88cHm3w zD{!k$%F#A)In5FfPUOcSxsf!UT>S5*?KM^_u=U944tkOBdp1ox8s8dFEH?Q(qOSa% z)je#ba*iQ^{gBC$k6QN#OpZp>1;0}rXu5LUtB8g`R&fkLg7VpU#_(;lM3@Nw>vb`n zk&s<{_1DJ;0e*ZkC=J_}Lx2~&?EfMYKhjLHUO`T}E`$V|@t?~{&L-}I;U{0zTPZ?b z+=82cEEfI!6|Q+uu!&8tA{}1D-F9=%qfc z5xp=jx$p%fb}0qzwq2lvHm>5|>mj^Y9ulCn7kc|sAo+Q%*#c`FRIfvq20oOX?`cxz zs_)VWdsGWeW#;{-H?>hNES!M9HwlGj-nwqqN27hGGP`G4G3m%(7z_eN@6*X7K=|ZB zpwi=Nl!6wl4p2g&ZNoP!^Yk_merT!IoGW`08O(n=J^c4B$dcycr}sKrefQ3x z7DmC&Ws9&aLP8gp_+d|rKD3qp{RL$l>9^uVXM?jB%mfufoWP8;|D#Bl=1WWS4x}?7 zM;%7$kCUu$iD-Yr{(|cH>GmL@aprv5CtmH|W=vq<42M6(A&D z*eDc&+h>1=qm!Yh_cEReJD$P!?t*u&{5I@7ODP$z6ksyb#i;Rw{V(qmi1Djgs$^gz zhUX8vMv97q_w#?8BTO4>t9^g;B}$QRj3Akgtn>`=xEbD>&8T-kQ~Pyd^BD$hM;e?{{(MG#`O@kG@{*U6L;CiL zwVlyMBJ|YhUV8hd{H^;^tcW{L?G#|!$IE_Qz3)dF@hcHd)%iHO0B>KB=cE5T zwH*;!u^7X$0~{cG84_6*IWhS;4<)7dT$DV%W8d`~fcf+C!Z$jv@>hF$+K+X0f=7|z z%>;HwV82$C*_0!o=Xd}?nC{2N#+Fe%6VUI$~oxwjORDsI27=wVaOz8R8WbtN~YUa z{7&gVv&jAD&am^}Q^PXLWZ!y;pIaJO#dePkYcGQ>0%MrH>q8`@xzbY-dv%VG2oMIM zvm06G$k>I56*{{hi%IX?-vWVv%|giYr>j|7OhBRuUpTjRq^?e>sh3z|E?nJq;=n=P zmawCJ>-dJo(L3}x<{b8dK0AdOB>jKl&J7$*&Yx&}d}$tkUn;)+eQiimEQB9zM&kUl zi3`(hFl^Q0b(7mB$5!m?T4h}>ANW*!@>ekko2;d?d7%<;$7_g9iy{ONIp+m13PQmb zDVOb=$G8t69*K+{?D<>xgLrI$7IFPKas7D`wf+88o>~g$<3ZHfNlW>QAbD4v(qSPj zZO~E-)E1c)bo-TcUa;LizPt*qk*wut>fiy=;DJQkF_PmAtjZ^0w)Bi>bEL%yWUmyy zM;)ck;(rtItwjcx0$x}^5FVkfy=mW0paB$(Cq>OdCc7qwYyID?6RZ&vlrR(Ni}=0K z8JK;NfqZ9Cc!DM8dKN)PCtTSSNV=8AZe8PF3)2$mZ`?%92okK`-%O?hR%$TMj%}4S#xO{>$53XMYvcOBq?#l7M&{0ro(BJ0Cya9nyGs zJxk9$X7Gbjaf;_n!$+@p-Z1vA1>DHRsFB@}bUpW{|F%G4}nrE=7 zRtChbg~=HVC4Zqw#I-JCZos=sp9%sRKQDI#dgnp+6hgNB<472SPadTWT8;P6#NKi? z8o~GTU^QXpCCVB(kq~|bdrq7gJ>rd|uDBWr4XL1S3qMkJFei}hz=JmCa}<76#%cL0 z*KxQ4#*g%9=o2Bpt^W4Owb}VPw4Aw-C};|y*zbSM^#m8Dj?Nio!_UZv|6mOj&Uk&{rVfBov)@8QZ+J>}jdN}g*dEM#MRdQP09W)XYJoUY0R!u7@$%D?o z*@&F`u0}UYglAiX!+!r3Gz}Srbmm*(-+yk)`7nm4tTQ==GBirMo;>o5Lg#Y?=W-m4 zipDgaL}&#i!bLz;)QhBZSPHyFB{dGB`*YEvP!hEpg(9i*->BtlP^<_PDc7psm=amv z@s%F^lp;vDE4wg4aHxIojafcyQhu2dOZ&Tv938AUQ<||K*}ZcsLt8>wl|Y~ur-*sXJ{N`XxU3l(J#J|zYet9F z?Hzgo^RE-2ZpKwr(V_`YNrC@Xg15p{dwd_uld%oavY<(jxI%IMlid8BSav%S!D}62 zPiI?*+`aoPLr*!KLsJpJ&9@5hdX8!>taB9I{pJ=mu&s|=IRA@?nW}9D_EXvw2f}VK zBa#n-W0K->i>C*g^%|=UbmZ(;tGV^RDedqrvyqnh0wi2^V{A zOY+DUw-LFc1_}7)Isc2Q$6V@cC^TY5^Df%=@nLP3c08k@7P4{V&G~ z9x>i<-d>{+CNcy~&u}~2w~)QhcfMLzcTOv^P5Ndxs_QJ1myCL5q8-oFN@V$VChjYY`8gac7W4l1n)2*AZ~tos<;{{q zGB0~!X+H(OKG#nh_(8pf>~@-hbbU!4PtknV(@*_2COVgEO;smg$qk08fmoVw)L-EP zZb*$#)!*6h&3j$l1xFfQKgt`(KZ8Zs{Y!78yH~Z>t+n0TDOaa$XeIvoMiuGWFtte+ z7z+;Hw-jA+7amTD3^$uC%xL9&Xga)!h05cF_PGD=dbe~q1vev3uA)##PnggJ^@Yca^SQjzCkYNYss^s+cf`h{CKP!8Jc*dc z8fkD8Wi!hr;_qdDT>sIFv|4?)q8D5wPzA2=c78^)`lB8+J4eNI( z=mOzY?I>)`IuwIrP_hdy!2acV5$d&52$XlErX`&LyF{o*MUq4sB?nVe@V}mmbGz(j zD&g(koOtw{;?qYuT*G=iUWz5RI+X}`nP)&>*fjm<#}jl^(}0}*fkmsOujr*cAa;Br zfFZcm6|sIL_RXJXFi^D*)?|(iO_naHJ6iDat3*j*%&OzcM>o?59z+I33XXhMYopa} zc{r7pho8JL$@2BRz@+&PU9C4|aw&1s+s->GQS>Fa(odo~Q0y-XXT`3B)Mrt+#-~}V zrZ`q97SPN(-3Vyr4+?QX#A%Z5BsQ#>4DJIhr$0CnFG97OtKOHeHcpfGEFpyYinRA* z8vFmZs=Py#OHV$5zaQxP#ipyz#_A~33q(KddxP=F#Bs^QBIr5k=b$j^C;iAzdQ>#+ z$NW|wIb?FufNe}*SMCT{%%o%QV(vjFr)k^M_?n73Yqk{3YGk)Z zd^&_3LPjG3UK}x6*tkwbV0lP6;CK{60-E5>^`0*T!{^J`kumAs#t>qqt@L zx7V9`EXd)(K~j1|eB*fR+gzHNn5)Bso|LoLWXds=%_qM2 z*DN;uud1kPb`5|fR-v?~F}8E$^}i_6?BRG2fh5p)^^K-Slx*a*{XPC#2P6WX)?sAtNd#_|{_Jp00=*i$C2uTmvy?k~HO--0Egsg6 zE^{2(AE#Y&{tcqd^_a)4)vPPm*)WZOMZ%)DFx?k>>>G7IcZcWkhwcD&@tWD2;TThb zKM}p`F()K9N*6Tkf@aY2Mpw?l21M9nX*ArjnE5(LmT!s6Z#A2R0@(5qEfw-xX$PHh zB%tdK-vdip1uN)jvbtFT3PrJ3LP4BE>1~=)-0(^XaU~03*jU;%RILo2Ta=|oPeCJ| z`y|ejnTVAODLDf6k4*?E1!IxU*&P={gS^sXW@c+&HB|xrk>q~%l^acquI2HEK-X&i zlbJEhX4P+leecq#_KIC*r4uvn20FG0wC*A+C*rqDz{Syn)d83^AcVg%%cbwf%Uuae z4->lu0w^A(Lk4%Ar!v<*@>4LYT$OCZ_r(j%^yWqO%5Pt3)M+yRlMa&{X>A-fcGLX5 zr+DzRJL-tv{8)6;*k-oWVE-?a>jpqM+bzNVr*Gf@-DtR-U~6g;?a_9x$2%iFz_mI!0yfk_f2{)}#lP5PT>bgY?X>9r=KKVagk37O1?`r<|Hf_)xdw1qwf>J5wEYO< zB*^ImH&0;Zo_7W7{=B&jbwBN6KMJwQtq=DK&$^O0rlVQ^i39e-{BgLVn`WD{^Ngd2 zX({Nw@T>aK&fzVwPt^~aCI3D*s`HB7ln-v;*Gt~DGpEMxDJ~EE+9T(p(ENLHrps72e zXGxXWN~5-vjtAQVUcF;?rYR5E-e57MpzZDyt>%C-TXdB9DiDRtgy=K{(7xKX5_?)O&=m~ZB=Qw>HFlgAj_M&0g|E|B~lFrzU_i`!?37qsb{ z;UP9G@=>JO3VIVLm91I)Nn|YrZ+lS+eP#uTlj9SQZ8n2Zq>T5Y3s(8TWqxA<@rc)K zYZ-}sY0fBv-)G)OD69Hk+Z6h2EsDZ4qx-^i1V0U#8w-~-^TFIuan?V#2pw$z&AA`> zMK>=0^&ow1%;b)~;SZWx-|L*&84%+YV0bYK8fG5uFw z8~Z?{DnWB2%$1-ufS*@j>;!5nv5cRwgM|0VumOHgV+v0fc4(c5K5-85x+`$L%~QWS zWIE!BXwj?v9al7+rTh+7IJpQ`xH=OBHak5NhOSydu%LQfv@Ym!p|S}q`)qasPC|^< z_gy`G-!t>&9301jjtTVQc4$%dS~Zn!Y9& zFWVC|aC3#~4%N1Zwl<`*> zw5w)uTVL)vL2wydj~(dMA0(&^o!zkkg6Ne`a5Z$Pu}_JPtpI*&GPp^krboC7ah=bi z-uoHHq?6Ra|b==YAeV_ryqFf%v49*#{TIQEGU%`eJE@ zB-14R6I~IMo;*c7^;M4$FZ?~XDk|A^C_5i*Wmq&MQ`@9<3RnGMB!60W(oh+>N}LSG5r61Cq)})WoIy8oVlxyjKMExayRii&m(B-7%%niSnpsquWWzN9)g6 z25gRIPlcCUuYI*Gs%d&1M6C$&Ua7JR<@_{Q5taf;a0J!Rv_qTHem}!JV9(XpCPV*i z{=2Cz7?Ozgc=>r}=5yko)W}*b(XZm4>$hX&@^zudC*KD4O*oMP)+FL*>haBW4q>oi zwFWqYqzm5;U&9fwC2u{eC@IaJN;_wr2Sm@4y+oJVelWX}j{b1iiaM5qhOP7h-nvMd z8CPN>=C&8ui|>VtXnIstLe$)4tYjxDjo!vU+;* z6C7c*{M=vkIzZNJ`jblXB(75mI=E3F0J`hSUmg7L7#0PJ1wGU9FglP$)_t;=ghdPY z4LwG81HQ%V!ekfPtgk;la49@GVQnw;$SoC2C9zHlW6s&VQHh$KF>4Ac#R@w9`NA1W z_UIefK+PUDO!Te%pz-~D9uF$AuAObHgo-@RNWQoP7D8(;8j=u62aSo!d6fg66u~QF zp^{;h641LhK8!ZDwe&6QoF0Wf;5Vxx51ekw>U@69t81!_KU9YOOP>t5Uq!+M(U1<5 zwcYTGV8C;e?yz5v--bY!y--%ab6C^3tUTbiK45ocb;*XYtCe%+{3PXF6q4o)9r`4H z3m!~o!F1qKsD+4|2TzDEm;7IEb{f7w!^Ysn%ok@4u>0V5@MrU|nM3**e1o0`;Luq; zfQU3-%`pY~zADibV(LI+s zj-Wk>eJzApONCGQ#hf`k0>tc#dAHNu2$Z4G5d8Swm>suN#uZ{@D zla#x^Z$bj}3O0%kGIcwDK6UeoSRDVTFU&ezHW_LZ7@}}bfh%8iVJ3UBV_j2iZx^%W zJjF1ysVlfqU>!JD{igS$S>{qgBS? zn%l54SufpBc4L1`2#iDB8W+Ineu#qs*&pQ*MigFNe@6chihuFPB{-ac!v81K=Sh^| zy?faAy2d9uP{#(nB0quCZ|R=im!hxhP!A)FA83U$xZ_^|=c2@cYOA_X=eX%CxuPqY zD%tBVH*JyO$ZIXVvi#xM@cCN=zE*%Y?bu*2*+j-Vp@_PQQmelB%IY+wPk+f-vMh}a z7g@U(ncHI(5~}gwOcLlsg=>ir0s6auXWv^nDJbW6E~OZF7g6kph|Y4A82jeOBcmg4 zJdKx*Lk*4NjHVQcY9GHi)Lg#y9GYsGi08_b(|)}7e8Ef0cmd#2^G#%z9<_lhdyHC& zXt`S>7&*Gco649N5-X%3YNPZiPn?z0z@kl#*YsX$I`3@^!~@i^^T=bSs-YhE*2uDuc|+U~W=%uPl{T@@)RQYrHuE41u}id&IYk&=eotCZ0oBb0K# zQY0aJ-0}PPJsuwZXk0GmGv4p_>-Bu4WJB-f-ni(<(SgxF%NO<1J)v!TLn=evyvD2y*}~6YP+|LE!&~{Ws@0=-9q*)?Ukb|yvSZ+_ z#QFq%<8puAmamx0K3j_PDm~Gu-CkX_1(VJxjQ~Bu&Q$n5w;( zIX95{SM12SUW2`Vek~hS@UwO#T}WMhd~VCc!i=eo^%T=*stRs3)EBojE%~rZ>GS0| z5q2tSz?}RY2WZ$0-n1dS@5)jb23isVGlRKy=Kq+q1+y&^ldv~)OXm!PAF$UTeaz@M~k*Z|AX1%Xi+%p~D=J!@dxax_4{d;^ELxYNj&3FSZYmfVn9T)zXL)DO&Xf<) zu8+^}3Ii_V%*%hl)<7$8Q<&G$FOn6PyRhyBRwF4MD|M2>?zk+OoYq5=yTx)L`EI*8 zqESKLiSFL2MVNfoX>==dU@Fk8`?aBSMaRkLFAki`CimA@iWenVIE-ec7QK(1=I-4w zzutAW;Qk?}M~X$GOjPjZvROe{(RZQo#>)i)1M6|t`FqpQpzO|gfD?S{e0}-TD@f@m z9~g>mK-v6UOZ`!`^iQeMBSTC1IPm_$Xo7uA>E%+cm%RI?C&1^$`OGC+FB@;~kh5&8 zWJUb(sUMx`dPj>d4eJsAFm&6ty?Nt3^VI{FtUjvz*`Rwtb~Wr~N(2`Cg%%+dT_J>t zzQM_O{7m6A;JC5a5fPMeOUDR4htE!3J2CdB>f=Mhz5Je^26@{x>8D|a184kR5#nef zmL^iYztv;(k3GWn0)hJ=<+JU_3-%4B9G5mN>iu?WD2`BnGja2=7pf(nB(JB{%TK(g zY`C^>vFpe3Xq;W6S)N*{$@?QY zHj&7!vBuX8jKkYW@Y$lYG*IAk8V^0}ee|1KJ@hy#w^8qX$CSo}8{i&s_kk-==EJ7u zOKIcxPO+mGPTCm5)RYlO5keC2+zO#J!gdsG+zH#P+;0mtpQbovP$DZEI-;#Mnu-Hf zhg)e{iO?!~1B8w{+lzFP!+?)`@=HOxX{D^M&!*KRMeuz`L$PSL3U;Y@8}L+vyG8X* z|5s&C@I|MvO${FRK@JK!(LhbQ5ey72a=swm%-S*+kR5xSMBv&+%yZVO-)={% zZ>1RbbP_!EA<@KdVYdzQE|R+yz?eakWhE3PvseAI;&3F){n)Pd=oaekyl1!Akz8S( zF4!GOe^MwOc9)#{P3FNjF?VOFimh&gK_BU?(N$fZ+PA7AN`_yABx%Y~m&k*UjN4!X z6u6k5RDkiLxBEzvlOHTxm5BzsV1Kk7eE2rhn9`6;C@mB>i^xsx6yIOAb-~e}G+|}jviU>&Z~ZO2)nvuGah4BxuzPWE z0a4KLL8e#vy(5`{=-*Wny!vy5=40cL^VTHZ$e#7Ee?wOdHb^cky_fqyj~g9kh2IxL zna|k;Zy;BlH|>&Dk%SipySslK2`0QhYP+tN=V$sF1 zi%j&yapAKd*#6GEsKehR>+3jQ<)3C$DAd@DxwXMq19FRn0d@#iq~A|>+aWCU6S#O| zt7opX1C`;qdOW?F>4rs{YE3!^6C3OmF~tu9WyQb*dU#>@VGU~|rTm8U{ANj{E+6wR z$JyG6&J8oC7Y_8&3`H7XH85*+260yZ+~?Z8i`IH4wQ01DEju< z~(41vUofW;lF zkIj-`UI4R6d7`pQD@7BT95@WY?+t^-DDAPoJE7gFVdD?V2KoIiD>odtnFMl3;Kwt9 zKg;6#cD2|GV6ghqiO}IDKg(2lw2xl0hwisWp1tk7EA9GeHScl2{0*3R}8y43uAma z!fc%v9=b0V%x6Cu_X|?|a`G}?3M)pL+Q4#uU)g%Z*M*usUzmY2Un7{QpYj1dMz&}1 zmn8PH+4;gBY|ia=)L7e_sB1&_GRM}RvyIz%BATs)Z@`HZ<~a7^ye(LlG)3pjLQ{V) zUg*CcTQQK;$QhN4hrtEr9xFF=YoD2>iv3yRX}k)Zy>Ubp=7z&R*l@$R{Lwu<82UMZ z)o4FmgK)p%w?xt@;9t0s5Xd`ty~m2y05~1K1Ixo!=YITpt>o(Nuh*8oTf%dXpWR9}s`;k#inJBB zE(-I+cn|BfdC8{BY|RCZPL8fWW)At6@Ip+~t_fvq+gMMO=U~aedz%?;p*;Ee^Us@> zC7ggxr#``()IEFQM(Ol&>9n%=`$-ZFXSG!PSme zh}$X5XF=!VvQptm1FYk&1-HrC{)1}GHe8gGY+5a^CM&|}qnI%TOl6h4IIGugq_vTg zi}L<>=~qjS6_1=LX>xv{U=N+}xIcj0sd<=1@R&)@6ymE7JmZuT zspFWN=>8!gYdRwIsH*4DA~S7WKc|}|On#aQNU4bXcuaX&4*~M}HZE$rjO@(?-xF!v z_jPVi6)^!P2%~9GCRKd^WxM;R4QaL=Q4cELFp+YpFd_VOoZC-Gob>UXIu5;&MM_Un zQo<|CD-Y1-Dm_N!+aidqRaRNv2~{8YcMte(+4NMt65Kl{NKoD#>vfn=Ggmo!lE2X) zQR{LaOV$(vU}9J2M17OI$m?qRA_*D#e?{H?B%YZbJkXED+g}mKbU6ukMc$A^R?9i5 zEIj@5=XxvOREzI7<8H5ir~O~d@Tt5cV_$Zp|J<$>UzjIRXk}kR&%5$k)PE2o_>Xhw zL?rAwVyq<#Bs3Aa-F)VWiPk4sUoUWl)sLC*{11)!54K_6_#<*=`NH$%7x_zI2CCZCYdzOS76z;#k)o>B zyO4Ear|50W_}R_Wfs!d!nYC7qd$>NN^&tB_Pdi?xxz+0N}vDDx<^b41TviWFNM+kXY;#vU}vOr zHK?fQEHy;znp|uE`qX``-G8UW@Vr!u@E!#UjYV<(^EW0vLDguR`eaH-?S_ZFyGD+0 z)V-u5v=o-z<2vodISZo;Ri79#4g2TCR{rXUa+goXM~A}L(UZ+scpgLIjJy1D=?9tI z=fv5*m(#Tj(T(!OW}@V~wY+e0^hNRx{dFpgC(G1fP*sEtFZXIpz(dKJ)mXG6*nLgB z@TO$sB6Fe^=4eD#*bh2FH+LgT^aCUIa$F?Jvj zKi9o1;qi4xBN!|N5q-S$eDy2x2#ZkHXf@cmB`TWKRjpPg^BLkN5cE{wxgZ2gmp z)SO&lKuD(2BfbQ~4&hp`-;#a|&&U@p8;c?9p&NMXwM9P|^l##HBzhNxr*+CD=jCVZ zIhx%=o!0{OjfO9ek#gD$h~8ew)`m}y zbwWzdDofVd(M!D_MLRrh$!hhUKH@$27(L$nG1^6fzID-RrcyJ_Yg@re6^*|Ti9r@y zpJv>0qH+~_a$W@i-!}=CL4DMIFKC5-7c!WrdQzDCeU4Lpm}kF3U9&lUEy#`Gv%)Nt z1Ugw04sgoyz(_Klu;Ik>T?Fni3s9#?hoMzVR`YK?BF_y<>&`x+5ZAQqmHVo>%U4$V zWk~gA0zhX=256RTB3lQ3VGbH1FAPLgelgss+RXM0RfOf>fA;-&?s zW9~rH{o>sQ^_3Q{)m&F{VvifT_r%oSj7jD?oUS_tkMoVE6`)?ZO?9Z3yS9*pV@8hY zJ)L`N^xAZDaQwHZZDkNA^s{q0x1I4gV%$3nGRu_`=+$pN$12a(Tg1mi$%qO6 z9gqtbm4lh^m>aLX{g7n4*enUsPDx`?O9A5Q=Q7Xxmg^eLgd5)#eHp%5>xp6EP+ zHr4gIz_@`G42x{&5Ck^FLzS$pcgMIDJ@~ZZ!L}GT#P<;J{c77No}3janT-{fT7O0M zt8m2mktZS70ylIKXx*2kXNz=9v4YAcu`&8x$CU4mUUU_0S+RU~CyGM!yHs|Z-eJ)= zzS<^(c*4%^#l7~8h zZ<_E2l?#C~HgU?j>hO5ID9^g6tXvR}Y_*c68^f7Rmvuj22g$LwPsb|o;QdYxqgg_C zFK6qlGen+l!q($MT&N!c*9h6iipjNC~iBPY$d~lUY+mNk;T{C&j8VVx%p=0&e-YcsHVD8R+{5@IpgowhfkD`mJYlz*TxT3 z3l00sqo+1Gk&I8-SiPu!Sdx;+E?k9G6%rQInmJ#H+z!c0=_GbaT)q;80L~c_hW-=_ zS%24fR*Ew|;>&mG3t?)YJ*c}38W-~Jt3PA8p$o@%U^mrXA$lEf+}*(2>w>3dP#y9` ze_~_PmGD<7q{kd)*G>fjR&YkB(yeG`F5EpHtf7vff|E|Zwm_5t)%rRm%|m+ZjEvJk z-$z|}M|0@!KH#RztUNSK$OMdpJ8%08vT5rwD zVI7Z|j*DvNH$0z}xcj;2UP$yE=BjguCoB z9d4g%R4DIeRnk@@+*rQ~qY)S6RIu2WcK}Ora*uy;=Z^zh{?<$6z1EEFpHQW=vM#O) z5u1d7(9|T{^uH6)Xj(lIUDK9ii7w#nC=26T$-^_}-{K@E<>lBO8e;poD;;JDXWoCt z&(_a`>tQs{#*Mwd3C)K?S*&c_6inUO6?G3i6k>U+X{}7gb9#pv-5VLovERk$(Voi+kBeuA^X(X7WNS`&9L0b2=2WM zD>ZM@WD~74=@`z~AGulrl>xnd`Pq=of7cF)Gq&9#+$mPUig+HJ?q^ZtkN9TrOY50-M<`i(P6%G(`I9Hs~MMhUYYd~fy+_6~6fixTa@dqWn+OA}}CpjCSfvsz+A6yfCr<>KOlrz=UJ;Z>0H^aJ3@nno-sB zJ}9w>36pwuz69@BB3ic@G~u9FmGV@>cvHoS)jqQV<{Qq#)Rj?6J;N}nW9OFzRjMhF zMywr5#9fym=tMuWix`?9>Masa8`Udn6Ph&vJyojm6?Zj83aDHOF&C2KFCR+ZL++fE zhWRUn>%~Z5^mhfzX$3nSmkj9j8$E9F56p>3VndJhsn5=)CViTa(jaiRsZ4IZDyjS# z)Bw?-7eDIR`Mp*y64-_TE#4k+N$WZbjLtbIL+J-j@Y}j&{XMnT{K{0lC&A>5M+$&k z$b3j6gGWcqJv$XlYrevUiu{ef*GPXz^erztX0sZolU%*QNAtAW>QGMD1HG+#wULO# zlf93YiFXCt?_y<8%H_4_8MGEkXcWIE#ggs@)@{N~KUoUfhDcE?wtLzr3!Fmw*4R-! zaTO5Y=x|f$K~SOQ3zfc6V5!!Uz-$-Y;?b7H#yFrN-Py8w$>}K`N5KHI6_&Mxfl8F| zkl1h;(=E`V#$0%&2$F=w?y+Z@QsagBt}LsS*p`me1}Z%p&rm&Y3CNtNEHpo*eBE&G z746o+@ayS)J9X}UIfdhOZtn8_a`H*KTC2J)M!y_u(7>CmC0}G)oOq(0KG(}!S zxBc7=|XQEa;-I=S=lMWD8#>EA;&Sp}ZqimU^AfP~V8Cs&cq1V7@EE z_Wpa8`t!tA;e9L0uM7&^>>o1&CmKKh))52_sph>Hl*D=tN{!X;WszqGlykYOZ>Q1#rWh%q1 z&k$~yVp)o#bt=H7k_5xaF_*0bEeQwv@&<{Ppc>aD1Rmc1##U9WVuSe*idMeUX9hP zaE%&u zqtEE}bj8O$dp9P1_cpvdnWP7{)>%V@tl^vbyn9|GI^k$pFMx1x)sHwANd( zduB0wwo@PgM zWk}+B@gqs0G35C_U(H>OyOZ32F)!CqWRN&Q!ZzUO(ufaytO<~wCpyo100GqLu|d0r zSbNpLc%U-7n>e=51X#BIY1ZaHtWsT=ljpEPQ_JzbqpZDGL^_6Gk1pWr$)d_X{Y9MN z{{phHnzlV!Jo(fW_R08M1Y4qk96V#pTh}jGGj>z0>+$h-_1n-M)+nOF7u&^Xy2It% zkQAN@hkz}31U}tlEG@Yztbb02%h@D=O)PPs!arb2SF=sV&>AIN%+L)NiQST$al9 zJZGl~Xme%Y<^s=9KT4;Kx&?w$<;T*_C8ap_y2>Y8M6B{IBoVr+ICmZQd0QL%o-fir zlCFuy80`*c7~R*x_7;znDtI#*s~A`FT;3(c#@ygDZDH-mtj)rI#HirLk$0 zz1O9beE1LX<{P@3S!?gl`eFd{ZAbSFC{|g1yoR+5WQs!Ev<)r0SAMb%O!qn-SwD56 zbL6?i(gL@PBk696Cf$r5xeHc%nz(H-xvY@_X)?$~*t%e8fs*U%`;4X!R<$=1mgH`p zPZwU&-nRO{tqXJhMTuX}6!=yI{wEHv&eX{P-+@csq6=k$7&zL>I?!=Glt@3V1akp- zOSy6DaUOew0}DQ*H4Em@CSNKIwFvn^K(Clni!#(p!Lt=SD_vl(JbQx9bblf%J@0bl9Hn?S6odgyc-@~@#d)<0EB|JMK**$gVp4`F!SXyz5w5yXZ|@boU=;sB2%? z{X+e@{cZCTkRU2)!1yOr2=)EIu+B91)#~Pk!-f0FrJa9#R z@Q&@14?-j}S$Z_Olwg;?VAGgKEvGOp^6Qr0S5h$ZM9INjCSbm0V#e+=qPK)={Bwrv zfQ`(IIyEB3dg%U0x>tkhOQTDAyk1$AmKqhTQIt86D+g?4ahLKb+|0;lN(}R0An?p2 z(4Qb1{<*v1b$NSnd{4oRg8Sm)7Gmr z^T<_SJiL%qZd&DPWKr8zQInkSO?C3*L2zFR{KU01fegUdIuP{R8j~|lDjjUqX-kO1 z8k7e6x3);(=7Tz4o36<&3xtWQ)eHX~hBCWaS890Ubl-4GvgEO#g{4Pvb6#i5X}5D% z-!_!a$o6G3l8x;XZYG^=C3=u(BDU^P<>r$wuVQepDwf6qo^I5?C?acgW|0 zzc>niOsHN0Ejq%Vuhesd@9=b$OdvO#*SQSj|EA&oe%rn1I=F$KJz#&2&o;b?WWw&6+#G3Vl z0=}ez+nA9o(&i$_3&hz*3GeRNNbrT9af@!TU4zWRviG7J$dR|l<^0}-~I=*{@H)vem>1XR6``aRWRD{gxC zJZC2!eS zAvNd;UH&qks2AfM@z{M=;HAggD=odQA1Eh-8#t;Me%s(Pzi^J;n2dwy(N?Y8$+EAA zE6T->yDeZ5PENvld(5GK~;t z@5DYPIb&srSZ`IIikx$h0|7hAUcHWfNIp3&Y3Y`Fbn`bKE~0F6Af*dEj#h39qv<< z>y0K4{R|(w=QK8vDeCIBHrvgcVtH$!)Zq%Eu^M=y=@#?MM)%BGp7(Wg1@iy#FoR?I zPrENdx<~I26$d>Zp{_W9Oi!%pmst>K99YY>c>?->eX3*a%oPp{*lA&bViZF_P**5t zk6synv_~G4Ofu7uXB+(pUGHlne8{smR|^dnE&{%qI9_2FD@%&<>!4bH7#2s9u6ZPT z;|Og-_ui+1Cy~NoYwo8jG5BRkm!Z!fHbBbq<2Ow%tD%upeeTSB*)0Eeqv-K+rDR*s zs7>hnYJvgvf1mT}8fgyMn! za<`b~FJ0U7MmF78&ZX1HxOOjuayU&Z9wVfxxuRJN zU3M-mO-ljE>SrD!kp7d?r(cxryMuVVytw6NmLSQseCdu~&iQ}iZX{3YJ+)iOv~r6M zeN~g&$EC~IY*tQ|0D(ZeYCt;VQd|=qQqD-ELqp^z%4Bg zVR4z_1B!%uN8kBx8ZOMkx}e`Bq5WUwgEgTCA3qP@9W%a0c%f0{86kGCQbvYzB z`!@S6XWv_7x&Ml^%^2ReO7k9RA0dWI~0uNtac~mf2?8rMev$;bHb8q_2^M3hN&q-B~K- zs0Kp5aMqAQ95betYC%P~t7DA9q76IKhU+UYq@YyfpK18>RBe8K z4^11Xa8v1#2xZ^yAokU{5hl5tM&-=H2+eP0y>2f%{Vmha)w#@})D0r%JwjWG^pDlAP=` zPBY54ot8MqXWpMYuUbYC%Z}qOubef9EZbf?Yi}*rv>eBN#osYqmTVuv2w9HMTbiM} zFTyG=ONP>PA3&d|0!)yGN~x|pdO`AEHyvVn!e=fj#u?(tZmcDSpI$x=X=c@jAti{& zpYVqA?qlV2Wnu1Z(~Alvid9z1N1%XuZPQ+6weu745e4W&ZOHj#U-crv@L!}uyME8W z$|Gm1*Aq4dEDzgz+#u=?B)>1w5y`?dRcSc$T?zYq5Qu$Z1w^W^ooy1N*48!nr=93J zO(9+WxhtM0*|6&XVtEocF_NwZMudH~9B{4FKDKfkzG|~1m!WTxhHz8~F?e@>q^7R%U zS0u%)fAc*k=Gr?UBr!ja1<6&5q85cGbm-)-UW>%OBx{@P5r+~l>K4(rEBP}a^B*3; z`XcWYZpK`^^3YlsEsUR57I|MwY8il>X7pH?a?dbi)~JQ7{Uns<`cX5SR{yv z8TWu+m30=5L|C%}^8sh(2Avl%MXwaEd?UfHx8?lHZM8Sg-sZqtfacTBqz&B`Atpz< zufddi9M6wfTWL1Vxfbp|bETfkwBviwIYXj){aE8FP!N@|7}!_)=X;`DFCw8!}OTGsU3bo7m{ zcHI_Oz~tgn9#oDLHfnJB#U_-5{>JG6xLy?mWB6CYS{5M&@|R^+sfN!G?KWVAneU`rAbCR&wRQz{Cn^~vg_P{4A|uQEduf#|?Y(|D_EPjDi}Qd) zf@OIIzw8T=d=QvW7$wkcz4tzlY}W>-88q!LXucU(@)abHak2mx4B#n^qTHPMR1__s z(hVip9%{&QGU3SG?;7z@ySC9^a5*QlfgEGUor6YNAQ-Q_ zrzQy>x^AhS-n^ZE5I1&NUOnjjXuKJ_si%RJ8F{Od?8SG|ods)RF$0nDY^q(n!=c`% zK6;%kaX%PObCp&WwNKa_ra#T5$SAa&pS%>|lYYf@n0W5rc=r?b@+B`1FKS804$dkWoh*ZnbYroCo`cEb=NWpdPN>X%CcB zzn*^Wy@rj|{iipPwX91V5B~SA;}D+eQhu#lGK=FWIK9o(L02(ju?}3KCi!czuKa!t zE=wY!v!yG{2NTAvmn!hxk@2bXm7?x|(wi9-&deFk;0MiH$pwm9cm`4Quq5_x@IWBg zhF=6JKa*dY^5g4`Lm}JL>Kk+Z&sbh+UwhDfsy>$W(mFQg8b~gLiFb>e2|VKCXdlQa zYqo`UUFTM9Tl{!8e!r582EYwgK|%0L^AoKKZ^OE@_5a_Jbd9NW?1w9Bk&OW;Oy-5L ziYrlF52Rw?s>SF&$*4%lsPm)V2l^@BEt40%- z+MoGxukFOQ4P8iSRtm-TP6l)jJX{|e@bKr?JNuV)L0J32em(Oq+s>(D75KXPhlW(h ziu!en*G%VKhzkfto0rPIt6CpBTF2744$EZAtJl-9Xlqw~N)T}~=1xfF#@rKUcq6;L zXxDQVrnf!ZQZx39yCNI*sm0l8UC8ZM2lsZbC&xZYq0PXZkn&akd~Cta2kTl&Mg0t} z%6BE>*E82v0C@xksH3OlAwhES0&*X*4l!=6g*W-kzXY8&u`s1fSply*p7+(N`uou= z5B|d}QHJ_V06PyAwmr9}J|R)%=;}n*{|kOzJrT09b*~Om6&QJZ9ibovKdB)>U&Hmo zV84t33&cMqGfZi+YuP)%Y)0w6y_w5^_}PPC4}n^^@Gi)@+gVd2$q!Dz-V?hHfk}-O zH#1RD`)`_zNMb`vbEHN}C-eT?gqeC8C!M$e?IY8(L6t0ff-lt#NJCWi^L}Qw;6Nf) zOibJ3aF@Sv%iq(74X|JU{VQx{KOl9}Jn#+OK=9?^4vMilm0I@hA~09`d*usAh+sz& zKy+|s1D;VhpW;N9n!HmRy|#c@u7`-)mxHJaA2)kx`R%lD-V{%3lAj%PeRw7PC@tG6x#9BVmV_6$Jyd9 zG|3Ueis`adbHWZKU~s1$9HV3A?<`ouqULS3U!2o{R>8_N80kI@J79%(MYFRR*5cn= zfzyxzt)scuMDvS5SUf{VsdXG3%U6w@CX5*kny~cVm$4oAiBfE~rtm-p{fxlF<}O$f zVjIc-bI8Q`?%18X=<~$b2bcVlZK_F}UZ>ALaN0qim|6S!}g4h$1iSVbQ+ zf(YlN+s#?XEt<@}asWRHdgR1LycJPj2@j1`;x-na0$xtpuufD=4G>!1@|bQ2X*0c? z1phf9_;RsDj~(d-dF<#mu*Py9I?kU^jNhmW3!WRyzS=kkXq|&EFJH=Qwy3?H`7t|= zfS>g*hq%MgwcI#0eyTKn74bS;(k8Fo=f&=4mlwlS&5N@%{@`9c>TIEQHEzGL6!gM0C5CsS>;|ER3xO+K@MTBI!IB|z zFH3IxJHCJJ$)NLi=QX=roQ|keLJyZ;LbsrlGivr5lfzl)_;+Re$Gd*}|42H#t4f-k zlU=mbjlHFgI?-$M)`9uMq=~iX2J-R>xvU+PVvcrB;0?W)`2M$PEIPZ8Y41Q6Q^b%b zsB*RNZX->b)DBe^Vieyo+Fjhj6MalU0xPr?9ZAoJ}d_l)<1?bus!;B)OKw_9V<7ZV8^zXk|M&vGGF-*+k$f+O7-yI5e?oC8=?N z!dUQS(R%VVR&Yr*vr^nw9c1DgPZ5Wm++u$f(};89TX!5$;hh78PEx*sHf$G}!P^k! zH)!NAD=Iz<&Zh|ierJgu8*`_nK*}id9WZv}AC1G?S_<`Z@@bd(UrTyvR-M9~b(l5P zul*c-)r8Tb98PY<7QuFWY)9L75lp+B+Qe-boa+n{O%Bl?0LGu0&$cQxhsV2Z?a~Xk z4n=5Do%A(bPO6Q1Y@PFxgI%gJ-5J|{y5z_NR054G)Tfs1W3nC}#JAl1tXq=j(d@Ka zz9Z$ABhhW7S6zSHH4@vQaHvUU%il|%*|L@W&o{0#UJ@MiDsnaRweRD%1;77Q5Ix|1JgziB^vZ%=a0h(MlVN7L;U(GX@G;{C{JG#?$_RSwSf92o4 z_1q|Zemh~Epm{-Nw>B4E9|Dt|Y-+0f|TeZ|5RyM*bLjpf6 z*agj^%m(ZV-=jjsg|B|NzG2?xuWE_twKy;nJ}~s_d}FpbOxD-L>=|)BLLMvg zB4nIcYht_IB7%UwAR){jdAS|bWCbLkb}%TI>zk7)eKZRw$Wj{SK*bSOljLl66u5@J zNY)}99gGw)4fuvpZ z7wHO^M+xj!LHbOu)-Y=JTx>yb-%)B+KA_gJ%n1Aw9L}oW0|Sr9vsD-Wi?R2npJf2H zJ8&d6)Up)YC8;>Us>3)Kjy->%-d7yR;7m_0WON(Of zUjK>y(jvdRG$C&JnW}?FNG)3gYn1EVqV10|OrT^!U|m(9|gy={@gH2wep*#%b!@;=sG@0d4tWl zAFuK1B4+c=bO)-A8#m8PIC{!uqO-@zT#sr||Ce)^Kz7GprpO4AnC3JU%6;G&XkHV1!cuw6&`{861u`ejnSyk3Iz#NeeS*c+ zwm-thL{K2b&hLSPCte!eVs-z1s%reS%414br;8vUD_^7%@x{ml-2H$DxwChoz!53i zVUX!!dZ2z`<$|4t)K8o3ZJFrJlpYkHe~M;k~ArS`J! zNKtJA(G%Z`v}a_Ve$W^=+FHv&`Thmi7qoomVQID%3Kb(I3G^MFyFVKtP$|l8E|q5; zP{Ot+A=*L7BxLyxH!x@hU}3leCS`ZxHw7|$D?;NaX*dvVLuP+PC69vHt`VIeq4FAf zyV(AgV2x`WuNAg<^es;{6It_gCY#4OrX)c=5_VJAJF;|oIMbT$4Ikbqh^+Smekt3) z{#T>jM^XGE(_?DMwUK-B=HUdGy&v)A<;@AZ>o}JiL~rVtT0|&XOx=q+Bx{Y`ycLJ@ z_YE%07X=)*rMinxW-0yzT7t3$kmo9G9eR^``2RvS%-nEhiT4{hZZhsmZ&^1kV$zP2 zOU8mgWjQCSu~58Rz1xz#qnPmY;^)D}GYPvyoosh&yM>Y)9No^5ee6r}bJteT3Bp5P zm|Sy_wFN`(K_FT9Z}QoLgcV^KAM=#Z-JRNhgP!-PyWj@D5c(<=Qdr_xs-(Nr{Q`?% zC1W?rxwI|kY)RSN+Kg+<*(T&1SwZxAjW^#ZvZm+SXLblaY=6AT(k5e(Wqz;ThSwBc5MUM=Ua9 zOqI(W&2SA#BjEd}EAenF~&Y3y>jB3!iG?~( z+Q!sE!3GU_=1fqE=$tsWi`25uknQ?oNhy*QhS3k>#&&A}DgK9I(Z*Ll@~oz?gCfq3 zl_zn00>ax@CQ2S2m@%^-2+_tIr3f!@8Pq4 z<)ehL7=NESRzyB2CO?+C3Rjb&%N_!DA>CGY6w-rFr$ zy404|WuW~sSawu}yB&|gJkT1vFp`qyF|8HH-u?kCvb_wv$s+lEvFBhUv78cec)#-i z+R&-^j3q|zJ%>Zwc+FPmfwACa80!YkH{eH*)*~tUQHeAYdx(KKd_Cp~{^i92~ekp+8j1FdLB&_~ZDlDqAcJ55A*4)f^e2gb~NuEI~>OU0;$CFRV`T7g^h~ zx8v~lvzUWWsr4~1X|~iO+Pv0)wf`#G0RRKvzK1SXvy0vTQu6K_!HYQ zcRHB}mc)i{TF#Khom}+_P5UhE+mS`4Y2%WMX*+Scp7;uDW$Mm_CGkSP3}#2+{E|lz zAynTZE7B0wV>yQ`PDnLZLFE^`&o-h8? zTH3V@(rilh6l#jJGWpDZ^BPDw)DP{T^}*-eFl zZ;91A%~|>@Y6@_Z$+Z6}H%a2xLE6**c6GTHdE8+Q{9P2|RR%I6D=6+&P(y zstlGoA*a&ys0LtZgB<+qZYPIjh#pbi{`Gm=%%$N*Z{XQI(DGh>W>-?vdhMU*TlW-LXEXcv_!LiQqCm}94sX;;WrUlQ4} z6g7iHi>PE@hLnBZ&2rx3_x>@TnKN@9j&ZK%zVGW^t`~5>Amub4 zK=2dIa6GULpoE#^W%5BD_S)rx|1v}&OFZ1U!#ermea@EMgSN{#DUzBy%D3Tr6eLE0t-CU(jvoZ*?#%D+piN0J$276r-}!FB z3`yBlfQPzvj1QqZO#hPv_k<`8XRyS#Bp)nI9<+T%kc=`C=U&dcpC%OU&B|BTzTa;8 z*7Wk<+mj3DUgUof7r*pCRzCV8ML`WxCS!WMJwZ^l zV0>Gi(Ylo!40?BxD_H81y3Se1t#-sx#u*AIIRN>0j*LWgT=@)&YTj4pL+kA`0RLc zf_6$$t4DdNqDcDrVDIzA_-NzO*@b*kO<%_;c(*ZQf}0=NFu*^UlX`~rpK<6yuTK)8 z&4xv%Emb=9cF0Fbcs7)OIvcq2v5)YtsVa3{53&I_m6}NGwG+fIuN<0vp58dZsrqq%W>bEL;t-VCZ7xA-84ZMy_sBcAzU3>lGKpSc9l%=g=L z-K2p1lv6$_8)7`??!A&I&?+N`O~7EsJH|{^X9hH)kjXmmO8Cf9iUsv&0Dky*uUTt! zJ`&nA`%HofACMwmsilhQjUR3ie_qrufH4&2s5!>5oiy24X=zC!psnlLInu`x~cfREc zQsVa~<2Db2^m#p*2hJz3?>_}Yk50olIrer}ZOY*%RakMchp>YdV-pPFhli0;h^1!) z%)=>UR2V&)FDb!n04_1=>tRR(~*Om}VKm?1y>1q?>#X7DI55%TdtvucZNO6AaGN&z$=- z;02*Wm*jbA3&;_IU9@S}@<_^i6`{2)ZqQA^RX49SzTV{1IQ$fJImk?8?Zv)6_G6*Z zj5mJ`iyms(fGuwtWDX+JT9SJvla27M5Bw-EagyI3iYn54IBrd?Gq(hHv0FZ@jqHeY z#R20*8JsR9(vhpAD3zl7+VJt3$n^f`_h4na@pxEZ0mK&h4c+@fzlv@qG}5IptB&ZA zNF$oUiE_AEaq~ZBh7_Kv9 zxnW>=c5|=kCCqahJh>gi|NJ>MZEi-!9;hBB$}abP%iIbG52?XTxjwM&F4*aQq*Erc z(5R^luRT4BoLDx1nI#VL79Dj-q+H}r&T;uu(R+fhy27yTuv?-L@eIb5$C@ZN8GDoN zbtv5}`h$tEr~}u+JyQ{C)dqJRudmeB!-cSX2$?h24NVsm|bS)3@ED~z~r<@e%6!%%R;Du}E40*#YAR2v6E;A3e zL(S5l#T`e~hXb4)WC|zskJeUt<#@*Gd(;Q<&@w2$bgJt@Tsm~BU%eYoe#djVJVBIz zt!3EGPxAP~1tqG*r-v1MS*_=`AE@ma-?Y#6pH}A>TmOgmF~iacZ)tMYM=y7YU2CDT zOT((Er-feYYq%16)*NsT>8>S1{_+vcrRQ@U0|dtClvf2V)3>7-yNfxm`=9oOh<5F; zOHMe}cD8)8zlY>_-fP+!q{R4>d7nA=v1R0`($9_4a3;o%q|w8b8W_sRt*6Eca>RT< zqartCn(oqDU%(xG8^}Yn%gl`r(-XG~ObviCn}7!QhS!9O@Uj3#i*^fI=$3-tg8f?f z;UhhyT+V%YGrXYIo&|S?6S0Dt?1I?LI<*x$dH5wA0IrEf>X*A6l*?B|dKRr3F@A!KVX$~b6$lW1{nl@Yzuc854q3u`In@k^^Ny-JQl|j}gIa^H z|Al6bCovM8a|^5*6jV<|-qW<3tEfefnOW~`e>Icj=k?GpWXU)w?glsIXaGNhan$JQ zq}slcnLXX;-M>bX^0j)41V)R9T4J-C5J_?OKj6(o^9OBd$}Qg334IHqwLFt<5RE0z zm@!Evt9lyb8jp9_p*LLH5l+c_QrtDfgQfC#7gBPwL5Ol3iPkhrOT=ExAwQ`_L?vmz zIF2#3q-+D)X##&CSl@RU`uH(xKyL_CO&9%W9q2vgVh(o+QZ}zI$b#^sX^WNKV-k2Z zuT$!v6w|EsCo8sN?9{p444JC;8NZizs>0XM;bAR>Ir~WOrb}xFF#iM$U)EI&IBu?3 zY|3hP)PqB=wL6wJSap4x7;4dbMd&DK#(4KXg_3XObMzdrn+$%Y{quF``fEnIrYo~+ z_EYin=aTzRMGa}$1o2;WIN2}966F1@o64!zfAOfECOoY-MUGywj5OLceq@r+!V?|7 znLt5RD~buC05R{T%d;1@JAl05Gnw*&+)wRJ(ij4k=xdBQG)mlo@?`>wU`G$zuydKW z$izw$?gq1Cy5l2^!mhI(11-lcudf}4I^rfWRC-zCa3;9L;>Aj75io-2$UTKkXGi% zb79@>ZrrVccAcY+>0nXWg3uHrhY(pAEv+|67NFRRwV)*e`5M7azBv{8*qb* zMdBkqEXlOIsPE{z|I3fr9W>bGIZ*xvYOT%K3l^Erk~z6F zqYpk#6HgcRTiMnQ6YR!EC|2AzlcR)}uk65NHdEDW zFKF2GkfivHDGTF5MmPQ`1=to3R{CLrPi0cjLgY1ArF<>d>Wv<(hq9=cYx^_hgc#8g zU+~cF&uQ>%m?&@FPyaNouiW}oN#MJ_pO?&(PB_bicixa>6tnJYQ}_4ID^wtP{zlS_ ztw^DmV??9?(T!^{M-)3@#l#Sgfoe@k6{N^G?rE&Wn00Z`G>#_!dov0Up)o(r;CZ9Al;L+eG%^ z)n7V!y(DnMad)#_{cjh~X!%ZcJaw@qEWz2D#|)nW^Q(;kKy(L?<_(qr&X|)SHpGx= zU-s8&ex>>J%eOcxiD2!rI5w{;X$X~T$`#4 zEj%-gn&`_~Do!rsx=;9)uw`P68O36-$_X1ja90@YTBJ&7Fk)22SFgf}zN2^smK2XM za6-;7q9QL2x=q6rMx!tc^U{=ZT1kS~2fg6Q-GoQ5*x;I>BtC&yoJ7FcOEMR!nBz9a)a#=n_8^S;I0pUkxudPgO3>=Ff^vC3vIwHX9*8dH@K)c(!{>04x~aRS zIKCMnBCoysV_XW9?v(^uH*{xJddhFy!k(#ysF27(FD%oJkv58vrQCt-M4Mi$Q$hwK zw1Lss2T`0XADG;d1a_?!iCi1Iuz?-7mJe2Vc0djGUWq}Inz7t$QT!(iO@OH68}Cwp zAG6H;&Slll+@J{rgEWXp1~0l9{jaZd)`Viw;j}My!fW*&x#fIBqfoTr%qU{> zl$nDlwsfOelbf{{w%{J0GtdUBj;!wqg;Y1J8&H`3Q$c{oFuF?6e5j!)ig1KX;p?rUzpsZH&^Co%H|;3H)H5yQ;*hEGr^dcmeX zIfWfkrT=^YME~?q6K4mG|4af`uPh9B@Pn)E7*QY27$al#zoW2p1}`l^l1HtFp1!Ig zfrEN+e(`DhiyRF{f14ZSJzl5?{qXK?y+|qYm%Z)FT#ik|h5uH2hH$+@11Y^1WHNoP z-@Q!1Fu&cbehNvvX`P5Y^xi?@9PBVm#|~WR*smPTuFPr+FFViZ9gklM@)X)Nf4%;m zlLYS#$5R*j@)CA$(-3OBnVwE8*Ru={k~m)V>C&c0De)cOkht-{|&g~$PcOK-B+F1Tw&`^#;W%x zrN}Tg;7?H*H+q~}L`<}tVvJvLcC+dU^LY@(?31#m-*SqQ)JTZA=c6{!aZfmuRCFWVgJj;*Erq-=3 zAbefEvH$!$>(OO*5Vsw?w)Sj>n zvlZc*Zl*}~8?%&at_>TxoamcnKFeiJrp}OkI|Ps1e!Z3vz7&Uax%J1!tFR3guea2r zE9>sFoQSE2#}&!%&q6v7E!7nj!5J&+x@{h{PbKAEp}uv)USjIKT^xIm@)N^2A7qMg zYpD?!Y2olHk^=eH-?=3fA{I9?;>z6mBa=i(vFP(s4wg?|ATPMyZ}IVqSaP2It79UZav71y)U0jc*a zPgn*g1QVjTVyZw42|r8^u+^_gCWGw(UwyqMEh5SO;F1=e(lxK)yi1T)jUCcjnW+{O zozywK6Q&u2$O zD_3avh_LT2AXA>4+IL=rBgi=8`Y=2!!Ei9_h-~qxWhq)S$xl)aq0kIRyvbhPGgW-xwW08_p}qmT$6MrDVRfJdUs(WBsBR z+41F7E?rb4F9175IGURud#Y?pW>r3(%cSvgTrYvNbtkd!iBfPAA9)WrOyF;d3k^DG zTBHQsiZWtUvJZ>dF=7+qV4i61fRQ*kJ_L#QC1v-~oGi*?7ey}qD{|-fvncMDHJ(c> z9f60`pMEoPKVaXVcz8dQCEq$Y;uez!+i@DdUtFi39kY6g?3O1_fVuVo{~v3L5)kco zMmN{{JABZ;DoCrtnun-7-F%4bgXnbUBc*?YWT8JvwbWiYv@L2ho?U5vdwCyx+Z*Zt)Q|$ z6wp=-CouKVg2;elbns!+fQCm+k-`LdsqZ*JdeJnSrMk0Q!1E!c?hnuI1l2_!0>Rgi z72@OZ_%q3L;SHzm(2eVfT-;H&;S6%$sz_)uUp3m+mp7;C zwoV8Dj>#?5Asi@v8zOPEC?j&|gztF9+3m>|)E125-q4?SU$XM6k_+<*HZv186)Igq^u+^&mUX{J;hdWUL`3(d8 ztQ)Dh11$!&j4m`LbH&?jx!uW{VXIrwckFl>=ytQMA1~!A`#pmtvT^#S1CNB%;XR9$ zj$X*rKpr1)n=)lH=Wq|QI|s>?s9G;l=LZJ`xhHPJ&s{NgH>k&pIq~)3&7JG1Hc;O8 z79)2>;vEXy-b;P;9@)+n zpsHz|ABWI1=@>HperM|60ohT75=`EEm0w7MJfj$u!TwZNSXt8C5+A}k)StWjc)|63 zMn79--0LenUz;O8=_bY>mE|N~)$=~VY;Sgi&MvnZ{n8H|OD*0j!Q9>huW}ucr`OAT zec-~kfnH*jLV2C#O#SaYUrA2N425z{`>}Pg_MlhJwZ?f?m71MO($}NUP;ScadR}Y; zZ|dHrr*O;my7&v#qfzEKdbXwua+ZgfG)EE5Jh|X@k6X{C`!0##5jz3_&y~{LTl)z0 z!`Wv#|IrH!k)HYy;X<6&p5SU*M@$0RW``V_77z8F2VPck5bm-SBbz}WsJ!f>-u33n zOf4d5g81i0z)69W`ex8(lQ|d>A~B!qkA!>ytyZS{zSJ#~)>A}yqS)sw&cJSBklIy- zA6E1WQgD!C7!!Hr&$|bl$KJ@kZMv5~LUo78)!P};VlcRm7H znM;s_`fRcQbT-gN99!ya=XXRHyoA)u;U_Ge;ZK4x;Jtyo7?yk#J{R3gmDmYn_CV*R zaDs}v8b~QdH9fY>3h$})^2Qq_3`YhC{zjJ>aVt*Jl&q|@I zkI|xzt^N}&Tahl8QDCj{?#*RV>SU}$WBXwDKO6g}beU@}FPOxr82ecY<({Y6EZ6n8 zwbY`ZZ2h&TaBsg#@4^F8lgj!|Be?<94ZxvzJ|k2)MLQIr3z7d0qHKnL`~~%g5uxrg zPomGgvyEmi&+Ns0PO-IjN~1e+zNwh0ckz6-SMc)bkJ0n}fc@NVkWM9Cos`^o1C95Z z)T-P3s1g-Ay}9uVOG|niWXNJ*bKZ?Rnh*v5Gx4bPo6}2-bgx45Lqa7jN?~2`JVPzU zOX}!y_}S|#P3qNkhZqbf69=RAG!m6w=hL_o2N)VFq@ob$SPU{PjOZB@^~2wnuj=C- z4bI*oMK`}PWVS|brX38dU5>r+rjsdhpX+KMD!lEGCaM{twgKoHGXq71JvsGo4qWZS4aQ0hUqFR1)w$uKGoeRLk2L$p`@Mq7-v8 zkc5Y~N%37W`%YJP;WihLRMB>lYg10&!jyf>0i^vMY{NfD8YD$dB7BYw8A-gvlia(_ z)Wc8qV7{eMdpnm8|E7N645%>cC+QJKw{Z`h#*+(TJD^9M#VXC1R;&pY`lKxkK5zBo zRgTGr3W{I@&X)?O)6w)dYemIVXddw;8$VlQXH_0?F^ss{>yfpmIxMyIax$;s6D=K) zN%7g&eL1sl<$3!O4T27rJDSORc@LSjt=x215H%e6C;ilSrpLs1^iMFkT0@8~T^(Bc z$xt`majm*-vk~9*R}<0v#Ow7XstbHatYVr!i*heWr#M}-aX&69D{>(qZL`Dke5-3< z*Z}rh@U_ImBvH$Y^S!y3gLs6NjaKO972G64GW82DBMJBy zi2Iq|Tb>asrTg`l04P0S(5aHQbsHnQo(Qww_P|1!*+5O5h!#sdz*4&3&FKuQb!J>a z9tVR#JJMw%;I2p!-vj0Srn@IXlt`F>ap@slj6zcMh_*OP#ZqHAyl405NS-XsDhYa{ zM3Jn;TA{rpS#qf)Hy)b*4-EVjf8!XT70V^$6F!=Q>tOgUf!5-4A{r^a+^KRC2jY^W zZ;OyyOv1;m1h4-*VK=2<7>9UyfOqQ6gQQ-zNU>%u{AEp~)EQQaZi1L1gBo`V>o;tq zr^bc&N>t3UxjA*i23j}nMP2juC~{Dvq?+>-?M{&SZ-rR&!{Uf>8|#YpHr;+<6mnq^ zV=WsT%kWRm?4rcL#_D4KDOKxHRySn^Yb(mT;S+Db(1JI4G?e6Y+lU9HP1ec#%F9VX z(Nb{&R_Rzu_0o8;9STr`x1_<{pVphA^*gSX1R*mL&Rl@!X)s>>xEfJ1)0WIrBSv zePDwD(v*rL%DuV*5&bOp`3;yRR6alt<xtpbHwz&Jngh!zs$-wJD>i$^`4F>>+N2$2>aAYb**8L|$QxGac+Q&)z*g1u$N;rggV>R>y zkA`-BSV~687ENhd`DqM3iUIarn|7S7Lrg|*f%ndB%f4RRSG3#L&5gSR>9_M7dhM?>({k^6n<6QfIShVkMsHO{M)_Zew%^G5ue)ALC6{%BM{w!+W3qxLC% z8_w-ut%)sajD_Bx&jP5Ockf27mY2^=J)MKXB2$U|!d)(g&n3>&4z2ppiC<`UD(nB9 zLQJWwnSmg|@YCu)cwX8oq=lRa?>H&4@6Ae2C~NB1yh*rG$)Qc|1U(O8AYz?6;Kc>GKhHi~E)m<%dUUeC6!Q4%lN_N}G&Wf~@4 zRm!(xIxhI|*|RO4H1|SANe=S-?ytlg6<^3W>}Cua~{83qHn2r=3ZU}*$WbXd`ZRaljPNui>40) zYXV@vBCTQD$(p#2*84LxPI8~zh3yZEP3wBG%p;s4Tmm908bpZH$EAi#w*S9wn zrFXHho_m#+wP@A8!7;lz`iBpk?+?3G9{B9N|A%(9^G>hN72KkV)bDb#*W+Ev-WtFh zsJ*S(w%K^9<6}DyMq10#t3#l9m!uc+A+3ujw)!H{B-`VdyR+#2q^NIJj3Yb>yNlJ| zo$*3U+LBy_{|scXO@@QX3J~tKhXGu%G}2`j$C2`0>(~^Tgr!y1gG9jelDY8Js=*JZ zwQ~oMUsrmz`~k~rGm458J1(#%AuNO7FsqbQ)XV5*4Kjk}@FPcb7Z4(A>_N4W_h z|NS+9)zbhEp6B^*Dq3bxhU#OvuhTc1_}Z~#ehAW9_^yJ}OIDUZn4mU9F8(d!02ztW zdN_KUA59`i4kzO+I9L8xZ#d}Be`{j^uuuxHJp*7uo)g=t5|EMhHabfsCsb;CBLqd4aQE) z+m6oV9xpV&L$Ty%-8C6BwR)pT{RZP$DyQM?jW7br zG7;}j{=hKq)@z_IP8R|b2QYd9ySjnkg%PgAuEZVbJuPZCTHz^wK};60N(VLdUhuQ; zSF}%0QrW}}_w=y9O5OTP!@+u#LW;R2`AkV$mtu7ezqc)lx#4>vRM~Q#616nAn-msvZ$SP#r;NdrxOpWrN;S|lf zsqIyjDni*RYAotxGrq1^>^lAXdu;hS=YQvjAQKXrQh1?iy3W1bdshu-0PP~|{g0tC z%>8U)jY~ke#bs;qPftbQQ9@|*#QKX3IcC$~4sI+s+d~2DuX<#nFf+}!JP&V2`3Nu?lR~5;8v2!~^ zc05)Z_$(Mch5RHlxA;Ml#i01+B*)7>=*nxlmOWD9E-H+?3SbrW;(mwq0ii>wlTQnu zww85FbnWUaca4kiZN?3T9KX|dTQTguS(ndO8Pg6&PaoNpBT$Y_Z;ilfp!4ou>!Z}h z5bBZ1%65%VXWEpu_kp{#Cw{4_edc{mf*#m+4JULq}b)!kfeoBgU# z*jL+gXr)=PhcJ6hs$rS&mRhkUVg%Nt_RgvJB1sE9;gJkJf9`I6Mm+a&j(YJ&2e9pu z2_)h?#3ADts5(`V>=#2(wjWMRUE^Aw8BXoj8;$`6jyC_!b(R(Gcl2u zXGNZkJby}7!)XcwUa0#H5o7nQs~3`%rBwV_&gkMsLm3$Y*&u~o^atd8oOUXX0#@$( zh~l!HI9ZxLh~d439UVDBU_6Ao>}36Z*1A&dd${SoE-bV>4`9Ao?#Jed(ryQt8w>~~ zbIxdDysF(kzu`1i6AKd%?kvf@g!QXl5{r?6TL6IwCqCMS(pI#aYgWene5i3W8jEQ9 zFSLF#tfRn*^LQ*iAX{R`RzPV`_*D*v_X(((7w?`C*|?dfe{p_sXopv7uRffjy0@I5 z*~DTtjHtOmS7Ah;2+CxQ-xAptP5sv#)E4yQR{_j@)<7H0n2tS?eRwa}_1UNC#f|d& zs-6Gbr0iS1uGFK*ZSO!6FN0ZJCT|6nA88tfCxlnGl6?C5hL;$R17&em>+u%`jz^qw+(fqNy}(n1!3xc|}pkDnnt;>T_{yAHAh9IQv@ z8oI9`!xvk^lf@3eh3Irm@#6C_(3fTIXfItAU#v>PVGcxtvGxzgI8HV&@0Z)Kn!li( zDg0(F_Za;AA2=DSMSXZ2ar|3DO>2NGiIf7Z)6lvURSLWKm{Lw1nvm`()@i^PO{wSu z3V~Q8Q9tu&%%pUo$sC*+g?0i9k=Q$af{Wl(GMFw8Ppjw@wPGw%M z!s==2#XqP#V+FGR5=&$&Vy{TU-%#eUClhP;NDI(XAvI}o%3N|FR<@q*{Ey37`Id4A zXbH}4BP&TTAHrS>Gf$6zw-`Hdkgbhe+fKG$7~vCw(u6W&q0*@g^Lk?moL4irBZN2d zfp7*V5ScB6+d1o`ZNjpmWE(`rfb)ca=J7DHSxovjYfB4;^&3sbevrN*5>GwCZP_eM z9+h-=9aX8QL(&o;l13Xe#43FWS!;w6#U|j}Jumjd%vJ`SvXJp#F*#&ZMbr?vxDT!b zH3A(5h}GEP;3bMU2_Omjs zGe6sqzG~&@jmN?WBC$~}gXVRbUWBSD&BP=n*$$#KZ~c8%Mm+afNR!&T>$uEZe}`YI zC*}gFqkT0H>gQ4}2Fjpz3e5le}OXCjY zr12jDoi)(Ncg|i#V?W$RuxTo+6ehQR<6oO-f0pX4NNZ8SxyXbKP;CU)_6}7t&w7!4 zsDV!`WhYx4>ROHVx1GKrjPh3kR>G`va1M#3p>N-gUPLaprg}OIH{HEPNTbdSY=pd> z{sX4gc|w7rQtq6+A`ZxFf(~ak_XERkHo<6=HPS7%+S0;yyO$=`D$905J5{>$uP`fj zVZ;M|WgLxZqi)8`Cix>rL=&7_osxdCon8Ag1bD9gL}$zXrN`dFU9RXmQy(FaERe~H z8YIOjL6?W{)T)11}Z`=;mov<+o{_Z5t{pv$O44t9o17LN}p;f2b#YoHjh0s4Oc;wz! zOGxGnS39ACdJeMALtdX1bAN+PxE>iWtK+B$xe77QExe(YaFh2#iWgZr`!TJk+#7~? zmC?Iw*vTCk&T=AE`XJ40`boZo9#G}Tz_05)b4-W+Sj(b4MP6m*pa}E4JR)K*!zdrG zxJ3%)dBoCTHh-{O7nwv-ur!4&XCuU=nk)s8U}j5_#{|7(?TjG2Pky~z0nCB40J|AO zFTs_gPaB|Jc|t_}CLFX?TGyqBWl;iq5n9#MO0w$a6&-!ZF4)&ow#YTlY2I7R4b?nlDN-VgR5j-DQ6GmZE#h{#@hS>>B5 zl0SdJG_0;j?BpeL%1Z>z(L`E$o@&6=O_5vyuD;sT;L7U=R^5AfT#C)hZ4Ap?B(EF7 z5SWo}PBHa5%D-pcFE)~D@2q3dFmP2k%3kVSx7FZ-(s|xSlv={@n@c>b~koF|$U6?p@DsG22Hu>aV`k(t*tm{+-`Z_?Q4N(QFQj%h<6|4O{I`fIHF7g-&IyC! zN06)9#CNU)T<^S71p~<=qm`a$uYt@2&>p5L@=+WS*(f`7tVs8|L=UM9(P+xiAVA6< zxY;I?wsEJ@Xs*MpM;_!S5ZRkkkpOSS<4Avm`KSK0N4Tss?%|rZ;)^{55!p_SGfhu= znxDSVcrShN;N#Nq@`RcQqhdY-kI(ORxU}tGF_)+>^j1)m+pI|_#MWi@d{+&-u>1T6 zSBag3Nk1#gSf@T00#g$%v5}#Kh25Y2{AB$fqP|;rQ}?P#;tL8^t^MqObRYJGV>4x( zp0D)#YAGogSb8hJ=R7_7`zovDRqUy}s#o01nV~5b=zCf8h5x>NUd|-H|n*&$j6gRxg`M3qt9LnHBr@5!g#NXgq`gNMxxNCTC zT`P+FY;BCF3#UwdEW-jyv}U9O{1{bG49S_~*mQFB#IV%%O~Qoha0rf9Enc3RE~vy_ z@-OA67#JdWQ9A(sk|hFg3u-2XU)QEd9AC0~mI}*07f6RA9>Mse! z_4J*szmM3RAeEu&O{dN~)x5y;rQfIBVQB-?*4O-Fmht(W6Q@X(_!9bdv&or5pFWwQ zi-He#kuv7jFsOU|k^36grzF9Ji>7Tg%y$kl%XB=}sYiV|)qGf@l;c?if>gTl$KP7lTK*CB zmH;CUUm#B=c`euyu+&jZW-?z7P36yZ>gc&wy#yMgA|f!Uhm*ulzBu74%5`i`AP4VI zoR<*F2R7Ao6Ffr?*@?&A-VZ?ZpF6u0R`>kP*e6}Ai$;pSF-irVf=ACtOw4?9D1W+J z_Hc`doT6Lc3#*a&#J(Cz*AA<;dbwqvtDqp2RDWx_>@m-ScePs+@>|QU_gS?|$PX0u z$NY&b0l|Xx_4*;#6wI6Ny?-1Z3i;VfcB|ItzpA=qDN>_fvgux* zyl@*d40iR-mgD2we-qV9__rtCc}v)x{h$^St>Zp7g5Pp#&C#8|RZ&V_lrU~5eF^))feI^w@=ETJ4)-veQ{Ln5D z$|3rW;o1K(O3~^{%5Dkr5b&FzzgZGdz!d*>8pdXhG~`JGH**-Vv2!F9vHzfR8>(9r zp|p8hQ;|Iw{-&L+iJOpIdT-T`kX5D15#Ofp?aL#2dwQWW4gLrfV~M5f zzD*dsqGTj&EKE~|14?Dkw5O=A_ktecu`rWqrXsScy6CHUX|^&FgyT_5R5*#e|EP_6 zhZZ}27hQ}T3)XmkN$IHo(`jK1ytL=t$fw-Acq{ZVhP!bF?-NUzjkoNgLk~sbIV0(& z3dG;9radjnqs9rE>yeqFGj<&wG_S&!hsg9q;^XO4(V_9;l9H`DKVGz47U!;feZjsF zu9}lSNbNeA90;Db*`*x}$e+pkUfv!cO-db)LyL(XNl!acOAY9m0cxuV_SL`-i_4Q9Aqo0X^&AirmEkEn2o~Iy$o$(hj*_Jm{ zB$)W9)Q6`DrC}br8=7kLAOBfTC#6-6sqRX5KhYcYRJrZ=oIKj2q)U9s^~~piMc7Jr z4N&sVx03T!3=XI>m~?!K(dt4dvz6DtP;i1(2x9Ngq`Tby%SnPrQM{smL~F0Puld$~ zhp(*;{8v0^t9gkejn}Nr5Mgb>f)w3N(3ZnT$fc}!q;Nbb;+9n$5+janVyNi#VJb9X zSt0kGP$ZvcyHg-4ut&PUE6WdM5&Yt>EI7rM=2UQa1PKMN7Pt(j=8hy|1MCO&Bkf6<0_IieWJRT*6ouciZFdw!QIr8MdsN18#JVbVk zCMOY2iya{(-y~(}o|f4R?%CJNiQVh`#LM0GnH7&>qqQh|WP6(u(D+KfN>w8S3t0l4a9!t8K@{? zK%U|E!EeYWDZc01$mMHA!!q@O0M9E~hMXgaQsDpk1_B7JO|T$tw>@z0ak>;8QPnll zgN`R(RUu$s+wo|+a4mkoJ{*%aVLM4@Xx>l94axoXje7JZIC9tDg=vTn--0o^Z_~}; ziHGOHdNG(Z(F8qabOkG2{ZAO@8JDf zi>??^!qoVQcW9o72UqbRnk8Ww`Wp?{5u5%C4}$N@MS10`?D}lF5jftTlu)JmxLTiK zcTuQ2N?564P&bY#GWs@vzJ3m^EX0Qo3{7KKMom5tm}jtoW+()=vlV~yi{1paCg*Q< z59GxENqeV}xioR(zR9>=wf?Nm42rEU0tGFrPJ*;;&<>SHX+ z{T&Vwb*nUFxn(!IGmf@;o?UwXE1%mUBk^wVVZFwi%l!k~jy9$;_t{6DOf3$ysFOD% zu>V2eI3PPxr!aQ34=2-hVc62~23yDhR|bhLe42Ax+W)&4#T^M8zj$6itK{jm&8-(r zWmEJ%A4Lmt`JU?-sqB{O%!G%;e657RFC~gGw)>+jTEpMmME)a0fAjb81oUE|{8Js7 z!tyP=H%YDfY(*oLF1bZl^ROQeo5Ms5tqEMgX`V2m=yq1(h9tXJD~X~M$-gS6SXX;U zBN*!riNeb{|3q%_@s&0|-UR;BV+8O7Tass~chtaxVF$+P!-C`hDCIR!6rm}Cd>--_ z4$C5f_E#hZ_NXOIo{qRk+uEjGtiP|*&tdK9!)zVwukjxzm+GF{rB(ceMp$p0Xt(7HR+a1!cxagfa{**cHj*dEb*I??4^!&DO$lSf! z6T|!Y7=`V)Uud>&%+%L!$2!`n%2;v~xvP}3 zA_o-+i|PY=h^o2b>xpYEN}n3Og%X zkLKH3XjnkP$7|vJf*4T;kq)eBA&{K8F0&YyApkDF#OSKHa=%734}_Wce&)7(Hb9!b zkRl=uV4*QQwSCv9fC9BKjCz+3^X#w!*tbbE<~n>K$DX_+Ob{Q|;yujI;4S16G(duX z4frvG(7z>BmVxJH>#25N$Gz#^vyDd~<5ga1s%a-$a)rsqJnx}?<6~Z8BxvDWj!e+M z%0e*^JddO-7sYdqRE>3rftsm}W*lk4w{47zhqo{@btey#8D`D=P5qVn=FE;OY~uhP9F5UxhT=h39EX{MGIBat4;Z2e zeBtXg1L~r}tXj`-?cedZ=-HjAinFxWRn#wFmsRS4}Y_=#!WAIQ@|5vtYSnaTS z72yRw_P*2nMgA+~?Gjjr`YBQuyYbMc|1v&d?7!3Z*K#iH7N?1Jf!n;TL&q2yqC&(a zs`mbRh*3-3c}?=906Fs1s?_+k*8{TSRoY$OjQ`x;C3oC}1>24-E+uG{zddg-aHg^| ze@jnDI>a+^R|x1I_~a|$IWS%)>L6qAVF}MLd%LU1ruR~Zc1gUkYRloMo3haCQ|$WO zO!xP)_1I7srL5kQb~5K>^j|TKRaP9f)Zb_QTD*RX7!+5qUl(Zh`ZX)>zasjU5D}-$ z{y}rPtA$K^5TJm&+fgCuyXfdEViES^9U#w3kOP-+jEk7aH*04U*f(u(lrFSNjl2n9 z5xF|}6gqNsWw$h_QK!I?lkuo{;B0xddl0VbmLR**dJnK9q~!WB7(AJ=;NenBi=I1k z-=5$tl+DWUl%}U2QDe1C6Rro5itKoQ7r%?_|WqZbR$5-K?A1W^H;vOk1dG5jNl zj-%(n^FH4JB-YVNR8a*D0pA zdcmG?plR<6oZBGSkiExIidb#SgsRN9WZr+_h@^!o+jHmqR0P?B6&Z72SN&ZdpiwIC zM;qoeZzD?xk3NroP)N1D%!+4RuBQUlua&#j!*b09x`zZM>NrG#A!VGty_;u6 zPb0CZR0&L{cG?VoY?P%Ypxx*!wv7Q{YO51R*Z0YGCKAvb$&Ot$_gB=6dGa#C8HR(@ zDQQ`viF_h7u$!NJ34%n3VwVwLnIWwH#f1U&4y=0BUneu*Y_#H}YCt_fAjETL^~0U+ z)dGoo*i17;;;Nj{O>y790aQH}n$Xu?`4k%rq`@dYBm-Xu%Y;Q0Xe=O=We%ibpP9J?UoGHmr;xI1QC36 z_73j*S0QP0MH3yr+4+^Oifuf#mp~Ebc>S@(bKQCWkEAP)hvNVL@7aTOt^3HiB78bfa+GQp zMK|5fEERH>BjwmZ=pZ^J6}qU1${E>pgbq>3on2AnTsM2n{Koh9$NsU8oq5m9?!KSz z=j(VspRh6}CiogM@5BUp;;(?i3XU?5Ku(0i`qkk29@dA{wrQghJi(au7U#ghsZ^lc zZ~3^5I#91H%@6Y4wFfk#dw#;58uS%oZd7rH?MGuCZ@|_Lf?9No%6tGGE#AT%8v6!R zrHhL3gL)scgDk+MHS}6JX?g(odQn8w*$q^PtpjO%g}tq-MNT#*4@I;#;X#F(Od%;!NSy0<07N?Cu~)fIi4HO=q^IaPFrCuO}?^}T_ZvR zU<`yF7qEumDScg577OBp!L9~7RZCIvuEhZha1OtH6PVS@szaQ2Z(I$V^Kq@I)rA*V z5~nd2V`J`~3I=;U$26D}@kk!tfZOf)m8~FQ@Q>{yL3dzTVzS49yz?K_*xPzU^4@)r z3+Vou65DE`9U0J`9OhP(*^x3{AeGnA8E$lQa0&J;CEh&}dGJ0M zstn2Zs9hqL?fWfsA0f__)6{QGBfeMq1v*!8UO9r;+Wt4;@Rnyth&FxG8##w$JY5-n z>-IjVvW95jv>lv%SS4zOy7n|MUe|20lwg%EEvPewjVk+F-M#LhZ@4?jBKWm`unfQf z(Mv>--i|vs%*MT3c+914TQoll-MUSJb#Mm>G<8Jdt&)Q;i4=fD%-Fj?$u)gX9cVbx z;5y*{BZxh5$e2ErSq$YteZ9z`MXfWq!Ld2U2iHybv$(=V7O{DqH286Clpq*DNj1s2;D?JnaQ?q~(@m;SOn z;$yB^i12D1VUM{WTSH&`HFPn!KjpAQ2Bk$l2$bC#Sp(L5^J7RdDic zp*iv^PNj8K5OU@)B~R+s#EwiP*+OtmwHE8Nnn`93N^*V!WoU!{qWK7vLW12C(ptV* zu|-IOLnm9^T?i7aeB_5ZQTWbRU2F`b`SK%FQwzGDbm13{_8SVX zWQMAE!m88f|56FW?*-d5kf%eZ?)*s?WyDA;QjhcHfr>iicu}5}-)cm^qk;112 zmq0k6SCx>?9hL~aWNN|=d$(lR{tc`?GM!UX28+CibNbj&+4kXKc%SK{(~HryvoTxN zhQvNz|G`a0dkfE`z8yNL(=fJM)mjT(u#2p&?Q#*ZRHK=P0)?U-!&i z4yYm*$;ckMbj3D8NjYBMbl*Be<(-NV(KgpXYzSCUV!xWic+KdL5DmygQ5M)uUwx-iZ$@uvdap)0fY z;5iycq{$>(>!omwD2}!*8Gmd08CE->Cm~KAFgXR>ikQpNIRkmAcHrKbIGpt|l`PWM z0wtosqts`Dn?A4=lI6MJ^aA&q1eYQYEl>F`t#Y6nFW$8CmJ?5wXf;rBDBcV;oIXrZ zdp%cn24JbUyHGX}x4C#vPgG2yHo;K?=$tj7>0zQKjL;`J?n6su|3-PHErML(CHQ8J z1B+8~Q??Xk%aB#Nh5s2*)F+bu%~Q8xAY_fWUjeNFOn-F91$FhMoMjF5pvL6Zmiyq# zh`lQ`ta=vW3K)l6VkGgpJu&}W3%8~JF=MQhae!DV)89h0R6BLt?dMdAsGf6;*MP1{ z+P-Q7$wg;)7gt5 zWcVa1P3|JLCYmkvXJh&&ug9wisL24%Y9HNN2Gr`obU3{p_|Dn?=21m>d%B$==g-5= z8K?M5iCRZM>0w7T@Qc^DLK&3dcRH{LpJw#agzUg2^BJU*m&NId=~vero{IMLryRW@ z$}@miazqv;xVc`B1;gtOs#6psCyf0*oGd!NPgU-HUjK_g$Flg?=eF;DuFE`A*wt)Y zHq)`LXYRsw_s9oQG2iFQ0#9rCguc?Oco6uu6f!n=xO2YHg<`h+ELc zIGuUC$PPEQV&R>vgjfa?_Cspr4wWr~2RYZ{;$|a%?l^Y2z%;vk`&^c!V!oZgvcoCf zmNsjbq&khi%G8{d2<>dlrb>ePmEgUy^rE!}C5RAwZ15AUSXd}y!MUO?7Hq*ytwHZ+ zugbpMO>LGS=>SN`^nZ%jU4mY1T8va0Wfc8O7h(LEWFn{;Pv^$&`r9n z$5Fd!v|PkEbtQN=pL!O;0m?aW>%(qV#WMnY0|-qP0L zeCCw1v|vCL7+674WN-x<+;I$U{%ur7xERlTuhiOnEzct+b93T<<67Rx8C_Tsse7l{ znlGk)BNKX(!tiZ9i9eaR_9u)qu&wZ0N_nDP4E^%d0RF#L>cuA1YaitqGE+nCoHzkx ze=B9n;13Fa`>n+}WHPAnsMN&?pbJh0;Aq{L#a`yh*kO^KPKnX$SGU^G;E2|i?G~Um zBKD+k^3FOTP7TsQ|thfWC=ijyg1_I^vEVhM&V4r|PpQA85>n@kb7ny@c4*Z22&cH#!=i}^riK@p+ufLVx23M91hjqOOf~J4wXH34k zKA^Pj`v=mS$a>b%x8220Rm(-PQj<=kHsF1KV=6qctETt!Tc@%8x=|H7V(XCZC%Y}z zPznQ$rN+X}Tc3Q=y2x${bs(veg7ytprlTUIjF6jn2mL9z-!xf-pYq$LO;vF2*RxXo zc;CGvw{pTRg$`&*@)VWrK%92ep(*;jU-YP*GBROf@89Y+nN_o)|WF?@1ls zEyJ=AZYY=yA!IVw922>hdJD?df%c#9hJR_WegWTBqqWzin5R+qH-Wr0o>KJ1swZoO zs}3$SW2h{Jr-iUYfL4R|oCxXF~ znukG4Hr;43z~8qegGw3tAi7Q#yqn6};E(3eS)$Rpz`{$Hg-ZT6N!4}{hNvr8Ak7@O zSB%Djo1ioelhOs^amc_Fx3PO(%@lr&6`{(Y;R4i*r*gkzS=DLsq$81%Dk3Aol7U22 z@eD7E?s+XoinQ4lEPg^!w-F$^tBPS%NhgRvo*lGPFJAk|x z+f4nrP69HspkE}h)}brr@9q!AHmf$C0O1t6i8@%V@Z^#YMFMBGm^EIKf{84G=@8R4 zT&tHOax)nVof2d8NW;xBRiDh3j=Y(&e-jSG2K7y#PYqlxZ~V5tVYP4YT`{nCI}J^~ zM3XoH72i3%&s{=Z{H_X|rLQXs2Ovvc)F$D~=o3}r#3gWRTFdq7SzNvImHxZ8R@!{fq#;jorg;-ASQ z^7kdC^{N8H_H6&jH?8&x%sF$bHdrU(4l_f4@ca9coyOU7m66uPag{a~SATFmv+iJM zo)h8DJ&Mdl*=rY04#qRg0|(Ma$V-fKzbBnJ*W%u-5c6?ZY8o|&Pht2BDVL&yQ55m~ zdp6WaL${lgr^uj&7gS~Dj~XaZB>5@z@D(*%u+s$Ak>-06u=Ux8MCabGz%^x0c8UmB zeVa&~5h7_uTiuft2zf%rN6!WKjh9iwzTvk=f!JbtmU*9DFYsS9Qp=1{lc4D#nJlJ{ zEa<@BS-T&s1qu~-)*n}x-el(r`Zt|}(l*m-Nu1jZWXU@4lkeQZqfT(g493X=A4&SB zP$FF)s3LQ%EvxY#j)DV{cYS<&v;vnlNx(;Of7i>yrw}nbFeO~v4>dqV8^Apn$SJW5 zGz3f6`)tRNyF`{JAjg8~W@;RGmXyF_id=(}bx9Xfkwk_{@0X%(u0$p}n`S($V+MR7 zP71J~7;p9Lqx7QTkB?`&}I zoYg<^W({i)YBG%x+b(QeNvneJEcL~uBBRUrRS>x33O!QGeo`hxT8}HOK_zRMESz!6 zt^nZm$K5(uM7P+F@@NHXrMQaS)!t>$h*)F-~eF3j1ko`OInUJX$Yei z1e;PlLBv3iBrks*2tsTwVGFK7WyBBW$=8A&9Z+iJuE|?v$BKJTHs(O|7u3G#JqJK~ zkl<Bd9m66>Sc+O zn`lL`5-=C|8-kmnoZXo*X0wM5(3;TPy3Mr4Jc7EO6tv%@9evgfaB7V5pXXZdP>ZMR zq|kW1F{86}>~dMk3-O{Z19&@{?hKt3AvpvSpM3EGeM&M_&*Cfn`RBfC&l;sq{J>LR zBf0#hqO5^ZMyb%81AjDb$*PluE=y;NBAVZ1(-gKfQACSWq|eHB^Lk3~lnD1L^@Po;4(N(0tq;JOOq0ja+FFecLwX6)!hcUOkzM#@zx5D0)?*~Olh@q+3 zYV*lu>EIM3+*D`Io+7ts`sI48i@m z#yHj+Imt9qS}s;}SV_KBY*4f}0c5JcI`|2>v!uK00PovnUr~p6X61HlX;_svSfZ_qaYy5BsCI&e{vq_q#r8pMNs0l>L`j8C7MI{UEOn~_HGvFnm_W)5Y9Crx+&>11k$So&Y5|E+wsN$Np_)$F(+Q zGrl_%x_c+KhP#X4d1P3x3|(O<3R9;eKoah6Ikvr9&}BYCPIxzbC##aQ z(i2+o60{;IFQLrSfP+;@aK`K(UPZWa6Uu)u?(|A-kY_YA<}CXLsACVB+V4ZbLMt~Yah z*8O8&SZMkd{?hg6spcb1KQG3F@&8s|-*^1$hmN&j7v%{1eYfQ~CC$A%J-)CuzC6W^ zBNqQw*$vh2Ft#O0Y0B%ZEJd5!aNQPCDLY=i3$!#&NPGA6yYb3L2htu>9#uZ3?NGSU zuOA?N|3CESzgjnrpaFM&mURcqOkbPsp z3a+ULzM1+9-;=pHE*yUIR-;Q`qYd!TA1iju*Uo9>y$~%KD&J!*&$`is^SOh#H#|W( zCEdJZ*j~fu zgiiwdC>;a3<_ExSV8Z#xMQ+xB6m+6#-iSol=Y-hRU0{xpH0FQw3=SzlnBEMR)v^{P z_wat`!8r~xv?H<2H&A>fqpxXR`f)N^^oy6}70-OdGZ_G$6IsDH5l02OL+|`ht6zpx zEBme#r45?41v-;0YPj!b*TNl;Y6>V^jY7uQrCT zIH+x&YIp`(dmXGK7vE~-?_R6vu<{5jwr5;RR+}J8F&yOC9H5me9pKyDh1P$PrerfY zm!=$P2Ravf>Y;We7KbsVq$*ZkcTZb+^mlvmIJ4?MWmQN#>@Oj05ThM2B->i?8+}lz8B&fz#;I6fBYv--Rz0 zJ1jiJ5!MLPdu9p zi{ph|ZdkDFpr`_>G>dkxgo>qDg#<|`)|HgqvR;@KhdU!h!6LwVGkClhVqsKn>qsQG zolz;a5c2$&7Bw**2^Ut~&t*|hFG?RzCql3-PN~2UR9eC~)PiF~2Zy<%0^Cc%V^6Sc z>;SfZ*1*LP{JCTRw2;p`6^tvO?_BC*Gt{J5o0aj@hWXhXF?nP`5y!v!NJt}p#j|e1 z_oT8tahkEjgW8}+xPFRVDr}73_7r_wbNmHS^0-STRIWq6e;B9ae;Za>bk}?fisWHT zM_Ck9KpXKe33}XLa$izx@C+2CvRs4LvMQqL$vi3hSi&HIrU0azEaU$9b!12{krE*2 z;@FD_i^b-D485uQ%`%Edx%}}1u-6M{UnZJuN~Ud(JIuIfKraQH8CwD@xzPL**lxzH z<20X?YZ`!dH-ksx)E9EC;^?TteUL9p zlb(0eC1;N#4Mi=^VC4%)tqZMC!CJOdE1>Rs^0#S}aI+P^4e(64Z6PzOzAN-esy? z%X@CB)t!t9P@(Q-NzqrEvjXR27mXV3LJjW~2nInswQ{fsvsaf89n3+XNcm$u$-a`E ze&^rUB$gUVyFOgkVJNw1tsFUM)^~#ap6;hakAG%C_-=x17|gFGuzZth{Z z;gxTt;hIT#m%}1)aEn|^o>-NL%QLsWh5^^8trslHqK{fB>HAuL$@z8jzG9eOZ`<|C zY{N#YwO`}ITl75JbX;);qlKfqqLQp0L4rR6vJsB7X{Qxlom^kWpBo-w(tl(%u7x>> zvABa*GuR?d>w-S7m6LhBRJM_j=0oFUwI(mpIu zbeJGg8lx^@yawm(qrjqrFXGMM?O_GlefUOQ2IO%hJDgOWEX%Q#N8>{xerSmi6-tqa zCZoS6`OL%kynaShQ&73k4$q9Q0Q(w1@=ow|CN;AqWK47RAw4ZO6M5Z`##HwLc?Ar; zPTotMl%y!Z=FK9s5s)E66Nwf(d|&Y!F0wcz9neqfT;gQT=1VU9=z z8eGZtZ=i1Gv+X^h#Vw+E)ee$w>zAd>2@ozNCDdL6A4Ef*{6~8uSh$R57HGpE(Ag@@ zv>xP8sS2zP8IKA7)7DIrOp3%2le@Y4_W<-eihAK%nP4-HK8QGB4bN+6iBZo2I?Z*U z=Mk0Cvi?9s(h)-FeFkzAE2w8(Gbj;Rht)J_oyg5zY6yg}QN@6n3X%*LtS0FiI0^#h z7_Wmr+y6svHzhOARPPAJ*Y7QNkJ|ysCC*`%gipp9+!ecSEi{HR2DW^hNgr=#L6iENW+GS`rO?}q)f=ld3U^4Imx`Qx{*(DWqoCUO z?mw$G7r(R?a}BYQM8zbz2Yu7#Gf(c>WR5@hjud2sx@@UEc-sdpD=xzqJN1XpHB_9x z>S8SrmgIR}P2IUN@x9Xb<7=8cNqzSmb$q79jUPibIuc>pn<=vVQQLi4|B2^2uNBT2 z_q1%wwSEM>Y&t;ufUlm??_%JHlIG}PUB~s(+XO>(1ym)ly0%6%=C@?9pn%bY?=-~v zop;D&A3$@r!!()J+wj-$t=xf~Se!YdQRPOsys~ZtQ?h?2yCV7aOdaQP5cm9%1@n2Tw80_p1Cy4!?z6VyavdGy`kEG zj;SNG++=5C6bY4k@a;M{QODl364H|fV&a$gA5fr>fz-n2Nqlv^cy<^gWi5KWP(I-3 zIZRi;=Y#-U*t!A>$TkaZTDi;N>uZ>+8=zugRylZa7Ekm0povK^p^h1^!RqiH#@?@p zzGJgHu0~kP-|e9QHbHV1I&;^7h(lTRrD*#Nb*oF?VyT8{$UuXG(NDsi)m6{9B8Sjy;{GIVYTSh{dNQ!DUo&$ppW!<0OO52_>Yg9v*Df7hzY zM+`dJ6zn3$r({tofUj(dtm$u&Y&5zp+1akomxe~F55Mb}K9`O>7^y!UXFl}?6zyJz zJ}Pkc!PD^31+)R^mITWUpDbv}hO4BqKXrjv8IJP{FjMLUI{+1}m^6S}vvf*iUP1?| zX`ohJ%NJlhi`UDL9D^c-YHVG%=!Iya(eI~>NS^R5q0vTF-t#|M(!x@|Q~j!mI1yvo zYekmn3FuGMVWHM5sr%k7Lr#xb_phUv{@8dXIx+w56R+j63nKR%k=TKgBll$`=wh44>dLEV#;~ImVYJL1jdpeJQ^e zD%zI_jcB`v;|QBjSd>+URvR1Z-ayw&v%;HqNyldX@{$FmOLpC6U!>pK@zjr@8Gw~H zBr63nigvNod7_y(++Wf^Y8+x@jeZ$ndFg;enY7ZYfOlRsXlZwWxLOlcOu@Sd}XlF^8adcIkRhlmQ@yT-Orc$bx7Wed3 zkRrPC4qD!d%l-wFDw+M{qCb46Ba|?l14KCq979^A%uvmq^2Z)o9kV4awBX-n9gj^pR?mrbH`eCqwR3&MbQg> z+~Gdu{$ry?G2H_7)NlT8&816*ZCR%8Ti3x zNS2jWCk{zh+fFDBKx8FCoB-X>%-iD$H<7ra{D<>y+y-7Hm&dcjUX>#eq7S14cE;xD-*@!9z21HAp8;^M5VFEX<2B$SB1w`H3@RN~LTO7BYDgz>P zvoDRIJ0RTRV0B$lHKH~sdDm(kn2%*2m2$jAhjq!UQZ#C`kg5|3?#i%seIjtGz(>XG z6ZnJMSqG(dPNM_i`mnZmwiM%<1QgLj)eAztMF)l-ZkpLMALB7&MCQwl1!b-v(u%11 zbt=FD2YW)-WJH6%*QK@iOK3Av$hx?}Fi8rJBMIz|h>r*uUaf-!6*Y#-1f#WS{t#Eo zl1-Uu$(p%9+d7u(M9g;JcjOUSyB0>RsNEW{NF=6e{SJqf*bc6t$w>))DpNHuNAVUJ z!Z240;P)MXj}YE?P`CK_Q!>Y{_3}hJ1Rf7A<9*>4@u7(3tk>iA-)pEggm|)?8m8F# z*AcXdwHgkgJ9g4VpUX(DAwD)i{&^(;qG-Jn))1UVV|0qOb~}rI?WS?XP=#dAXUt-}%g# z^+$V!X)bLdt@WPo{2Z^|Paqjrg|DA<%Tfq|B=YRO8mLR9@!Byq{Nj{#T1aC%?vXKinSWz8{JqkN1&<8Zlu! z_2pv&jz8FBI4`yG|B(JymX=`*bVx_qJo$Z_ zczESjtr14(U|4xcn3`VMR!PNkiZP*%?=@pCk$F2easuHiw|S|*z^rqDLsISnieJ7; z&U*SmJdfL1sPXCh6eCW%@qc0L57${ae{dMuzV3Nt%l>Dzd>}RNx2;2pDe} zl7K#M5Ne45#gd;{Dt-9niK*s}D86#-ySOI3uqMR_9m%Rh%p)$aQ*-VqtAm8`!6-!u z$bV7#13bQ6#lWrv@92-l8U*`|`Ym#5wKo3BI*2NFZTbX}MEF`7n~2zmN10`e-fo`i z@(c>fXFlE$Um3oo0JU|`i>QNyR-3Ioyxb(&Vf&TBo(ynHf^rG`V@b8DkT64lrlV-y=)MNrcRa`I z(F5Eq9=qi?PEQ(^p0nLc`L$NY;nlo}2&x+bVajazq9<*lUo?h7jxWKwQk1rZ{sc{? zkcP*oYV%J+?n`95;V{>k=&ydb3L8rExNt8e`!?gwZrXP_%*q02{(kCATP?$hrFLt# zHi^;I1nap*IYfB%6#Ok{ic_;uxicw?Vqqs9YnFOrAiMz>s18ZbhJ;J-yF~RnNn5m%Ur_U@RvzIpghAN9%q+^i0^HO7 z+wp|Ct41@r+Cs_!lwzNS&~SM+l+W`&4WzUXqCW#Uy1Go zSwB1vloa7sd28wij_Z2Y`E|~ z=>Tu^f=q`?RN2>3AyOgkMqq5e%*=dvmY zpI)7>9y7FAZz-MdWurn!$m$b8amZ@JRD!=Z)?76*)22beN_P?zCgDW(ES$CBj(HVGQyYr+2LzT-K!G){`U5c;KdJF z{Dr5&Na<~S`Q@{!su4?#71&X-%kQE>r{p9TCV~D|-2MxMMBX{p?Uuq?Y%X$MY1q4D zGfdK2lH+f#h_w#1E<##ztT1Dpq6%Vid=c=H5`h~%!Kywv&b>j#IH74@4exo`@(eVk zXByMC4cbWw4=QHA;@vDooh9!Ymje%ZmhMO7ggFp_d_`e-MSPJzPwfn_;2LG4C#)!Y zdZ1}_oQk6`;5EG0V$o7$I5h}aFOYWoYzw2`_p0ptv6{A}H^~!R0Z%q@jW{^}6B(#S zWII*<9aP<=?Jd+$lX18VJzGO7MShH8nuoVAdnYJabN0GL+6v=g^qPb8a8VV*hR@in zfb$u5*ZMpwIyoxu0k=)CudXI0>;!6KARw?^9tPsAGb=9R(`v`TueI!! z$$!4(b7gp(ah(Z4@I*H}&fFtaFsKtmAZmEC`Tq8wk4RBZ&lVwt9;ppPw{ z5XGan@dbXWM5ztye4MW`f3J5W=lp?+$O?V8{HcLW)7Cnd9)LexA^m42={{``q2HsHc`CW zf)KiB? z7sj^u2$Jm9EDc-^v(`jQq4;t9xRy z?~F`LNIQC7%XLxVxMj@IF8;BcF~hpgMi1h!egqHy;TVHWJ^g>u_wx!xCzC$*CvoB> zvT9SWRqgM^3m+`7Fh-bQzCQ~qhpe*B|3VdGGP(b4d9#qjtsZbLaX?27<20&;%+c1$H8n zm{vd!=UD>=IPsa9c=N5|bwbOzXIoVS?v{w2;O`i-Zdx#aU4+U~PA~kY2QMR0%*-7$ zdRsYHG-7-)vz1+ORgxF|pptXDE|)WK_1OPjDRbwrhtq5pkMKp;{O|PnipEQH4x_Iy z=Z5=5&%g%s_z?A==PfFSTF^I&3R3%@M;DTC)|fz9e7ZYNe;I!A3!)_Mw_Vy?TH}D; zQyoL4c2BGwbM2Xw0MsbO`)y{yKXlUe1jf7is=SJdS>`E+(^%)RA6zf$ybzU$e;?NL zH1X$pLdBp=et}>sMmxl@o0h#bjT5wFBnnf7GKTki-~fE3AZHs@6yx*aF(LE#^0VjV zmk--gFplOFn&O=Wak%jE>jJzOw~BD82MW}F((vc+~8uEq4GmAT(OwDdo|npM~1 zO@+VZR2~R{8S0z4CJ|_@9roEC?tGUtz2lnx>^w6q^Wxmi-Jt23AI$D-#pL&fsdaxo zAH&X0=gjhgJVJfU`w3Ny{*~CcS(pf6R_$%<)B4wpzzt;DI;8DC$|ii?d!_*yk+(g} zY5+wNK$~Wq`s$C4I#x_DPF2U(i?P(eSxMEr?T~w?c;fk0gp+pv{mha_bxxxPzQO@% zd-iac4l=DAYG~?zB6<9_^JhlcZNWx(XjdQmps0$gvKo~9jwUAJ(=(QoL>-h?HA92i z2-%{Mfx=uH<~972)9Nt$L=VDWaC(DW;Ilug120ATQ6G|V0HP<;s(`cj^=hSIIgpW-lVVL3=-xL!a(VieYtN(PJqUXc z;^t5TUi0_NGxqbbUGJhaAb!gg>WA44rN|KlV%|Ybm;x^1V^Z26kqJ1@7O=m&rzk*j z>oX-NDxdyg-SUqhAdQ^S#QR*&fQrdQ>eoN!+Qi(jRETKTdMi>ir*(|bu(p(;tF-e8 z8nH%M?9pAYmtf3^t!>bn0-g~)Mu&-d4w4*l;6mZ9^XDP%v77#r4>z{9Cs@5REEU@s zh{wz6Uy?Oj6KR>WV#7|?bytwd*LQICd6(8S^+HYx*Yo&uK5Ef~es;cWzIp!GP2!3} zYo9BQazFeT4gNE2+O*1!j;-&U_Vxgk;i}AD%dPXI-oT!waEzrkI$4Wh&6EbwuFruSk8Nf5M%~0f2M3$6 zoQDrYvyZwau-z9GmN}BI2eG@#^sf4Om1PtUj9M~}h!$$hR*$x_SNvTH!j8b`d7ap- zWpr@=p**D#hw!o_9E%gZ8!WC`CSH&63szljiPDBqxaAnhLp}R{Aqru6?A!%meG$?j z9@hE3?%Zxc|8Hev!E){z;T6PQ%be3ew|G;O;E{pGWR9zf)JAt38Gpi!iL#;j|T6L%jQ!;;He=L~$A17QeaIxOn#^Ex#Xs zt93V%aad{*!_8$nSRNdMZ?~_ON;eX{mXJHURsR}#^-N29`?28RuB^DBFEnj)D0hD~ z(Z$8xYMbS=By>%>dH-i46gR5Rjw}1>3NH^jJ#-91&oa$6EW(WYjD?Kp?g-KFJ{yj2 z!DR8IB?E+d21RfpqeamZ+ACJ%9y$Q`v!$ZjGO9TQ#;2RD|2bY8;>mPTSwVl#FB2bgAXsaMcA zUdpiM2L;?h3mr3oU;*jls-!9%Y42rJSk+*1hZIiQ(rh4Ub6e9w(S?{8Dy)-lNisNWn0)W`9fB2BkE& z_w7K*;D}he#V+>EM8+V&ApbgBi!rhF954Rw)MHdK;R~VHiJdDl@}pnarz${dbC(fS zMWagjO4n(Fzt4W6HB2dX%x|si=9hJ;N3iS-Pu9T8JNxc~M13tPu23^lo@Y6k_@QlTbVV&ok9OX{{DTxCVC)G|>0yU9$rVS>j>pLt4m`WJlR`E^4tFR1^uG9J@}r-^@O5)y1$1d`$z|6%t*KgkI!&$+Mhvv&1t*hHed9Yf0Q zxPUnL<4~Hty|s7Pia=LXO)x*k^s_{kzlQb<_RUBP@XRBIV<)XlnUYxYl(-CZ_S+Eg zTfcVvv0cRQkY{di(u=jvzBU+j3m)LP_ka51*FAzx*&V~4sKdCoOkz4?S5s~-r}ZuM zQ2bOQ=a15V6d5TbMv1ZFMS=sso}Iarw#76*{THUNkjvppGsw#+sHa_aIrrTie*fqQ z9?rp?D^RW%7PaYxHhzUlpz5U>8GJt%4UCZkh@;7Y~m zIp$Ddf74YouXK9G;jA^}fn}Yt?`9^t`PuvAP_i;WOGfO+&4u42`Iv&jTYb~FF?Q66Jokc;%TnG>C8=hZLsTALxwC=R76>@TkP z*xx9Za9@>Wn8OCiu8jU!Buwvh!eV!iPK@dvzc6*=)E~{boa)W4OhlRen)8(vA4#so zptYKHeg1(|z-^~;!4jH?p*!(i_c2PADG~1Ih}L6$8GN6%N6Ol8D*;YJemzPs)|XfG)^VqG>x^5l`N z^wN(ipipG{ZN`%NAL8K0d95j^t%MV7lJkds+aDPT4tNCb1FSP}@zeR#VmyfqAdySs z$aFhf8JfO9O8eD*Uk9!Pp|99vN!@RNAn+SiODaXg9%JchY2RE}3BSSY7>iOBJgm>{ zzTAODH--FEOtD}2Azv(i?L@#`p?(X~N`j>$jrkH{I^56otL+JRlTmxo=y>@wvl%p^ zQtN)t`iMjjB? z?xhTU%Vc{;T|Ya@@F(s{N$llI1PLznE$RO>*!r5A^FF?(h0<)~vG9VOOKbX?aPXe|L=> zRS12~Hz(q3xs~rq!m_<8C&X~E-nOeHuWSoh&0$KkeCZiRJmYbNool*RPmCy>%+rh? z6E?BjmT~iC>7yj917ETGiXWB?FH_A!rAnp760gTr{u~H=P*SLLv_B!f@I}hhq=&a~ z7Y5fDTH#tUl6*Z@eEPa_EMFAIqAua!PcEXFbJkvR;!bGv5(fAfja-ghvG`sf?9=)m zEZ3hfs=36|#7Id0$3`;Wx*pN8S;Ztgj_+TXJNq`qt7p!fg#oh7N2iOsV=$oll_)Vp zjf=V<*E_3F{(M*PL3u1A7C3ymN9?vh{8sM{3=(tFGU5V+=jwU~{neG6*hpzsdPnp^A~nLOHf59%zkKHWR-TQ@M5V;^X@=v%*%^oM zbk43-+qO(~%5v`$=Xidd3&Yab#o?RxVArz>+q%mM7$uHB7$|$8=iD-)^kXJ#HinzT z_xq~fZ?h;)SLS>kWh6*{#U7=1O9F0lbudR7`RuS}t8 zE4pAEcrf~}f#lpcEIP4tO%9j|p-c!mL*NKQl*8m{l;Gv`ez85uYt@qG$s72zJ=k0k6UvW3Q>~LbT^PL0>LdG<;D3@T=}A#9g$(O(u(K}4?A>aI zAb!XRg5*vP!(e98%g*$3?Q2PtfNN^GYR%fYQ9Vss=&C>|qDE~c01?Glt5cNbSrb`` zPB|3%%l)Qo?8Xog$CtQ$6naaWq+=Wm?MyC7Lcs3l#jCrBn&qH!WKb8U{v* zVA8W{%Q}>AWDfh>!mCF5i2;*kGqDEK5z=tk zA>>E@W1S69?a;Cd;j$?TCWt8*sB4*>Nl&d3uQ+Tp);G5fGxahl_Zxbgwr7nM2Xioq zm@L!IP2{z%Xgz_!sTw@UlO2=Ra#r9h7?bE0^*ZUam7b%i32_&n$~j2SO8MfhQ_|Yk zL7|l`v5b1fG-Gq*U?fd%YM&D{p6EcSLGlbJhjHSvkl$Zw-?Nv(8}(u`X~KXdM&`JC zm%!y;Hs(#Qcw(lI-57wbx15#Ex>_ba^z#nem){W|@u5mzuMv`K=X1^aw0_^5y0WQv zrhxHMaCiHW_$PX4+X;D;v`YZZ=we7)5&w{AZFkszRVby5<5EqoKwBDEfu{u}*CWdU zbJyWZ8g+pG@a&jz8Mvo>kUe_+&b)K|!umB!C(l4bgMLckv0{R^jP!;hF>f4KURHN~ zQj^7=C|KcwI1}<;@AI)EVLAE~Bcb->AB^EH2gTS+Ov}A0KYyXc+U1Otp6$G^WpyY< zp!FR-28kM(OXy!iOe*G=lYI4DJi@)>zRXybOCQ|nJ|& zb_MJSsvFJi!xEJ%VnP=~2NxE<_5W~aHmX}}jYjzUk^NHq&kkqPInk>?LDIt+h??58slG2g-_PI0@g~a8I1d5#KcU*DnUy3yf17&l)Ae9v&r>3{$I zuL=}0&;BS=?KghfU{n93k7YyBJndr_*?wC%p^v(7X3_Gw2Z~WthqFpKgJ0^d-Hs0a zGqW$c#ZK9X|23r-cdK_*gmr)*Yq8zKV3P#5ejw>K;M!o}MD$L2I2M2}$hs~?$yfDm zNtXJRYt~Fnin<_vrE8PH$svpb|F2BK#}*yzc0Mi1sHjK^V*y4^(9M2}L10;~XTK zsHCA#N-3kr$T+txB}&^khnA0sl9h1|DjG&bgg6?=Jmxu^asS@Fzdw3-bab3^s{3_c z@7MLZuIGc)TXi66#ct+~{ZIRQusr4p=$5!$8e?Aj)XQvMxwh7Od6uiYGWA&fOfBTr z!L5vqhomm>FeoNwGxWJ>h%34F>=Y9B6FnfhaqP1US$g8$qxHWEho7i$s z5BuR42{_YSKzQaVz=1M9L+}&FJ=C-_(?QchIP_cGqvp9s^!=nz^<6Xd0R)zb0H6pp zK>06}*R#Q_ymJxkCaR))jR-q zo0gD?KkGKgT~Ewew=~Orw+=jVg*J+Y;?eWsBsA*bvA6?R0F6C27c7M$YC*ALE2zCe zNR%psLNB0Ih?!m>t3|8eKX5ng&Je&p|L{`H_iE!pe1MZ3#FC?ZS2h3>mN}@$v69THMQM z7OnFa>N*BE!`hn6700qQ*7tpCoxW~E^VI3$`j%}>Jk zJQMhf?SpGaGUZUezE*jI41GITOmzY6;`5bWzM^;m8DV*Yu@me`w06lJXdnAo6y?em z^i(flS#g8dTkI#w^DZf=?2X8rLMWq^y{m`PCr>^``23Nc6h<4N9zs1#v>jf|NuqGg zK11aL$Zn|$51ttyT7MTfX+(472?e zbE-wZZ6d{7U~9dV3~oQWfjO6Kp6MxgP?*%D$hy!0>qvCYG@tcPXs@PnuBxBqPctvC znR9mr8pTO=^V_=9pBD#Bo9Egs9aB*TZfE$rmt60}Wx3ZA>u57gWJf8gHxLZf!HgIHJ z3Z>xXBX%C?h{ZF2QW_bDk*-Vr#IMKH`5r@#cm1rw_3*at5hKx(6JJ$`-HB1#H50B4 zeRgym$m`z#gvz7m=cb7V-YMyIh3inA8kQ1kg{l8(`5QbI)iko~_B93QW5-s|V-8`} zk-ohaSbQJ;U$qJB2fexhe!;M~J{oYur}m>6p`EJ9w<^?%g*1jNwnZAsSSY;4_>A>` z1Fr()m;&olgPW`3e;R@BU6&Zb58!4}3L5i_x~oO&2hkuPRiZpz#zciu;h~gh5JfK-e0pb}+U$)s2-QFz1K$Um^E{DXtQU+3LwB!$m&M7z`d^uY(LX z5@^{&xKs+~=vlU>7u?Y=v-SyCbMJODttzf?ByYSdh-SWDqBpmy+yg&W_pM;Rx+vt` zV!i?J$)!QZ%BLt;etD36{4nXSH32x?#hUROaG1s9>(9%Pmm1(yk=J!7Kly-e=Oz?$ zpT~g3BYn)Z4!K<0Q1z;+MzpSpLmRJ8N27~BpugbeX3ld6M=!@tM*pwKtepkL+x2rO z;O#m%UmhBsqFPC=Ow|Z%fX*s*#1_Rpl`I}urF%F1=bfJ%6K;cEY<&)Wsa2JME^#V1 zqU8Y3R|Lw=u!7#Rg3+jJR_cmrX;`Cv5=n7X;GD6E;WI87zz=Dlj$nOGLgA>a8nS{g z>L!^nnhWgpcSad$unwU3!=-7&;>A0k{CTxuD*+yoKvX}m|iv$mWL(OpFhnLnP zD~_ZDP^We`4BMZCGO<7t@ZQTp@Q>qQ6|{ZfJB>a-=>8upa6Dn|ribOisC7thUM5-R z$6ry%GZ>gL`Pu{AF^NX>8rydbL2KC{&{<@EmhJO?rxFjoAvV^DJfn2}XW@JDLi>JE zmuf-Eo#AE?f;qdpe>gA@YTK#{D+x1SQ-0?%&^{`Z1F9fTz0Y{oP#E3VPM7Uj{XvFr z$&z32TMVFDneujJ3@epq&JEY_K*{7#Y#?q=;Um=D7C&sc5_CyaJ1c|qVF4MB+Akw6 zrb$yh(P|ujUkrbJfEI6TGFCPzNL!+7iLJ;#XG#6Trp;X;Hwh89qe8xu?28eb0wJ28 z*sA8ruok4$(zu<^PWwyxzQ6kh<}<3MW!vLuRYDv7-?o>zy&Q7TlixY!QIp{|zv>Rh zM>_Pzwkr+xx|QZmoniFEisR3t1fCV$-<(<%47{+N*S$D5aPJ*iU?Sr{(OI@1yCryd z)pf1DOX1EWIfQ@37oC3Av^Nu|FeOo?7gDtI zl7V+w7h!{OwFy@ORwyVgY4;zb-1A;sV6msRL4of)v;clqzw3}!Vu0@vQRoiumcpKo zGlj~3Vz056AJG5TS$f+UC-iR0G}4M{0&IjWeWA0c@pHo{U?p6aw1txrPZy0&y6H&3 zQF@~apcQ^^t<*^zTCNNGJM^cmWvyKgI^Co%#_`piJayptQf0I96PCOMhyKpc#W(m1 zpZFpTb9Z8WF0kzM>h#yj(?`FY_4ldr%|J8B0_1qA-P%3}a4AmJ5*#@J8Hz-Bts*mH zqEM%8^q`{s;&)pZic{Iuksyd3u6?C3|L+{IBbtCOi(%VftPd>%vF&yEc;gPA`BYbv z`XFJ%j&u~1zUP@6p9^F&HBx?jXkb1Dc>q^9C%^l}jaPM#Da*2%YBosDO9!uja-&^;f!3OoaWi=p4dVi}(-8 z2QKOGYP=*N44fo1Y>y-aG$}@}xyZqJD-7`eycIa2iA&y%rKu|?gLasp!a+a&WARKd zFmsg)4__J^0lsna+EG5VQ?SQLM#1+2CqIPQ*{&=G)2__MbMsLkys+|FsfN(iss=sb zp>NL@KyKcGX!&zWC}&|*BXcBpG~#=U0_54VT6yQ`65T#xKqPWTRqmDSQ6+%GG>qYr zE}^hN>8%>ED3Ko@$~z3<6|0JVRCy^y5m*I%p@<2K^T_b*?#688?}?momhCR`{hm~0 zc12!QFmgViWx^S?C6{Z6gyO?jdt%3JR|c{5i!Hrt9zjh-qpO9`ZD7xGr???k_~0LL zFQdsn?tgv&_*!@z>*T-d0Ft^o$=tf8&y3^+6;KR&(<-V6`IC|}1Gw;svtacvF!-@R z=MxU-4u566)hfoDS|AC8EXTW)FU!H^XeM{(dMJ9|0Qy2D{JT(=OqJ||nr`M~r6OtJ zFf7Y_MS<&5oTJ@Q=NCGV01ZqFLNBdi1zu+@kgxJZ_C{{P!Jq={o}6DX5oG;H;aprpGEO0^0$_S(DVbcEb3} zMCb?>_JsOrU^@)0^VyrFVWOW!nm8Jy%#?7Zx5_}Dieqen`iDIXxA#Z2C4JkkA1Y5l4Q+J;V};4A z!R~QKU!0wZMDo;Q#7IXwkx zod3G9uX5ScCK9pd{8~5c42_u=o#)k!e0DzG)`9;3!yTB_H9A*lqA{ z()iOGi(-6g|3{7bHBN7SQ5g(?L?^xR1U9_$guj9*Yo6!HenuJLPXwti zlN4kG8b1~s|2L_Sto1Wfayl6ZTj^ZH3mX)uV4J1Qe9q(HiX&92YMxUvtFfAJld6 z-tahU#jGZDX=mTdSKf%lMcz2QkUDJ*?FwpxB7ePHFEUuIx(x#DKxQ4ueR=6TtN-O% zpQsKrL7#T!TO!8bzPHwSoUx|5S6-Kt(IpchEI8S3iIZ3}fJob3NdPDPxyj5kS3YiV z@%~U32y5gjK)X6@2Hjd%dC$2%VXUBb2?8-X-vqO8Ao}%R!GC-b$ScHX*fox~h*A3y zaBq!j2&7*G1?|U?Y*zoA#mH}veG;F(z?6p9i4WI>1YyEUY$PIH%p_LJQ$V$NA4NU} zq2Ew|MSC(x;UZ=1A+agYH~6wAA+eLE^!<=}@|s?6p$O=pjf+1zhg&VwrhMr)NDBmrHJ0ZOlCktvVP#|dLbCs1FNF-ETKz- zg0d8fEz7^9onmK=UYT-O%M#@v#L)mu%(M(ZqK}{HIQI^1DIRo2>d@Wg<~4yHY`VvfV@Kj|i#V>~ ztGz4{@BU><;DQb~7eD=YI)eP45kdDxUcwq9%$;kn}yVI(6VQ+>;ZsJXIG0 zaAdibqZ(!E-l+lS#9sY(qOUO|SPy!98!C^IRUcfC1H_{c_KV=A(H@lv>ni)gN|6(Q zvT1IYT;0)#uRSPvu)&?eA+4OZl>#ij5MJL-;1>^n@*#Z}kvh%oRGx+o8;xsqKAEDE z79(~r5MC4MQ^%k7jt5!z&^>9>ZZm-9nzQoO_W;x$nW<_Q#9Z zzf~xo%4g=H+sE8jC~+jgKzGSWm^mc14l=#Ln%0e*^8c(6EnT1M?L5lPGfV(}uC*uo ze?D*joQYewB4~qwa(FfQ1|It*UQt3dHN6fCI&X^+LqcWG_x>*ofEHUpq@{OCYubGdEC z`fkbqh%Oi$`SeDJ_J@P)bBwkAFdGIU%OKK0v5yE$edE7Fymn-1y`caNgnX|sBnqnT zktQzHLSWt+x2hlVP4?rwh7oi_3J1?Zef!kbtmn_|@j2?Lv6%u0gt2Z;G$5GkVuQd2 zp+8lXv@@NLPUUG{j+(hxq;RMNZ2k#~`6oHR)!?FP&QVlOge#_DKrA46S5w))g~$U7JE zb-<@QBDsF{6Uc1g^H*-V{_X_bN%fSb#?zLd%@ylv#PiQiWS(gyU_jYRwzJ07b`x!u z$3qt@Kro?kiQTy}`|0{Q9DvmOS3*n;1x2V|pm-^J$0(@?tv!vhI>T@6fvrSWywT`w zi>eLOV1cfmG3~)2$V>P>7=>#r-}*FC+iZ3IaL zug;AQx8E3dZjsOWd8SOT+oF8=S*k%e;>%fn@@!<_UVcKAVCT!#GXH@7K3?jN75g^- z)Gy3nJUV3z-%KFC(E#{xNq|aR%{g0{!G4z*H$M4r$qH(9b=>k3Usg1YjI*{bhV8R= z9WxD!*wZ|sn7JmjMqL%qkAsFWasN6){(YtT&SG30T*qEhOEWJQ1x9GtTwhrFpl;a^ zhXX$u5Sx-FJlL5nhHA;}?K$PILk#_H72Kit230ree%YVAMrNG)!3F>vvnZ$yMbm@{ zSj#SJ$sY$L4cdn>Ii4-?NP(>@7tH`K0t{r`8)Yp(Lc4nGB#ux229P-v_!2TTZn%a? z)Khc@RFQ<;6rQZt>TkvJF##X^!T;)hee3uA^5`6b)6TlUiB6M+2Y3~Onq+4D@j?}H z0F;)57&nuW1<8e|vXw_m@$G^9zpJDiBJIf8`H z%7_DT@7loT%#S4fY(|m9_B$|6&W(sz6yYBmK=n)2A*jRhJ`OY_X9;$a6)Sp+p2nS( z#zI5KHT*gpqe+R2nx7i%scdBwYaI4Er7~%*iIei+wp#Ga>|>1LQ>4r7T+z7io9|K# z_IH1nJta6E_$%pyTG36)y(^fp?LRM-2Cb}|`IP8=$6WZ`)N9G#`Y(#7_?r$c3>4g7 z3t-9Y>Odcy-|cp3bnSe7G8_k- zPC{OcBVd89ck-@AiN8Eh!_P!7rpDdzMr^?$*`ns3u+uNexYQ$U&vctUwcCG~GhsK) zc7u2u2&d61-ju-6Ad_|%6z}obs;SHKGM`;-#qxUOK}=Qt&M?9Sy+Zm9BU@Apf6WjN zI%{YcpRLT+yjm-?RL%0fmkV-X{*0ZOV3z7p8(*LKchn=AktF#uRKer(+v)+uSJ^<0 zfGRr!^QB0xs^xqu@TBiqtj!x7HO8V2&3_WG@^e6*3xpr!<{t>_`K=isaLg4iaYR;G z;&AvFIJkf*2qB?TnDdGE= za*xD&;_Q*fRE?a-_X@~K@7V+As3&_}I*fRAKEPSnqJyq{&K&&nl(92|eC)J3NJW5% z-3N+mfKqNZA+lpn4L`yI%UBY+>J@O9e`6tlDfxn1_G!lEkBO{EipA4hNzp5PoljG` zSB~geHNw&dXaDXW02VR+e{)%8C5@ftdVikMJ}X1JW>jzIf)K&`7%A^?)%1?n^trvk ziB%s}#g=B_0)ZKQ7bv5X2eq$Iz-qsP^0A3VCQ%yTr@&rUl(t?4MH-%#rS?q$al_vC zXh+3;rj^=Y5@RnH-Fc>YPkB)j?$G{IaVl%C1TZiq1Mjf%_gsQ5{R_svP{0vrh5eFFv+V+HtAr+6nvx2^i8$ErqqUt}xj%5nT%z^}~X)?Foxj z1TxJ{^8V0{P(eUVZ>sX@g0w2c&t*VS2N>nal0ND;6wtVl+0IzeMm9wt8n}{r&JilZ_~GSI;I7Do+O)5vSu!8veL%&!)+963utS05L4D~j zG_UVqrtBkYV)l5-yOp{-OFuzCV~_&;-V=vt^(R0Qv3jI`bT9b&Eo*1^q>{td?*J#L z=$CDqbt9s=$zO6kik3rw{?!DJxV|3%edHGkN_tY|&Z3ZLMTGsPLx~4%n5tpq9YQGca{#9DZ6K?6O(uU94dYL|&?_**;h2Iwt<*i<0ZNf(L- zs=3(;a1cuB>^#(rqJQe+sU*Oq0>k(`$lx~>nDN(y9`AflzjgunCS123jBxa=ZZL-` zR`A~`C+8HQ_;m#mMw@1-x7rZls+CO9E|NQ;NJPv24gn+Vg|tROk>iq8EBpP3szV!9 zjb8ISOEaJk_lY8Jl{kilIHUQrA41T2bsD%$Zow8s-;!pKRHTf;B9T z1i`M)Lz(KwY#gy!TLlNT^|tDgZ~oK|6s(hSJ1gviCg<6&)MV6e8C?xrS=JMY&6vaV zn?CU_FUb~<&a2nKymoeikG>^eub!{}m9o& zTFDuXa6x=!%3kQXU4e~-DDWeTlRb3qmXJRj>9YL`MnMlQ#8o~FUY`$y`DkyE$2`b7 zahl`r!xA_VmHt zLyIhpbjTE4j(kz%4;!15z7saID2wZrU#d7G7Z&^jvHM}Q6!Bm`C2^Of| zCd{Wgyz@WKZBX7b(K+7~QvuSwwDp{ok>PKO$)jN8t+@Bwu0fU%L}60hZ=^aE$=wCv zN&mGxSYiWP9j=#2LpwMBJ3#k9hOPz3BFDh6gGisV8U$isKs}Ft8hhHxSEaa_jD1c$ zg47%Cliv#B38Mu^2VW$`JN1N?4dvv)4rlg%`P14II?6*09(U`xZMUAGA!xnLkCWK6 z;-pu%&={GuoQy`eKs47KIN4vn+VOkhvXN!xb6#Wd_5;nJwOF79T@#E=wp35mJun`= zL8YdODD!rI6sOJZ&UCP|Ubh3|g-}|9uIv$pOww0pd-*HqB;~Z*QZl@fTPDvZQQ&l0 z4;Z!y&PJS7%wn3MdeI*G3sl${m%H@GX@Zq0CCiPcs}Hg9zZ~6TU%ZewNOcc;N(A9t zuPcY=aJ)BmVD@!oDoMRL@eE8h0PQ*Ay+aAf{aur@MLuzj(LUQf@DeH1ymenx*yQn$ zt?L8E-(yIiUv@wmX6!WWJ{7^Zthzi)bb>|?o6wMu?p z1Yxav)>nT813Guse_$ZI?x9ppXazeBlYwS-hdXg7}b1o$pRa1Ny;=3l=^NahGVm$ z4?9BskWU0TA@>=Ye9IcTeiz>Qft#JqI2;NHT!F)tqVOMq{s>c}A{)teuqKB&5fh-Q zyY2$|1yhXDW|Z-J%vrPZ=+l-yJEgD}Fm$5W_-DFv6|#Q=?F>~GD~!{#c|1%Y2uNlA>}E95^|PpY7&dKqi`@r@%s^TO1sw6?sspT zj8jHRg}20a#S<&H-rpxNagv4KNVjNsFKCas`Cel@aWYQZ*GYO_G3H}!-QyQ!#q{Cg zp$;6IQ+eU}pXfuPpWH6Su11%Z7slQ7mOcFKWD*k9!wU!4=-YzRmH$p0RACF-=uH4n!6%75$-xt+U#GC6HfG-3hIlupF|2<4SVZmh;`@ZWi4 z(31wHxPJVYp@)0QEgJHyK*KC%wyU!;L%_O*j9-)Lc=dvptpr(nQYBE)0qZpccKUC& zmQMwFk|;lrlIBgf2d9swu|S9-`oH12a*;dD>4LoU+9QP`1X7E5F;AgjD&@A|YGAbKc};jPu8Pw!5w5op9s)Zjm>oT_ z1yGhVk^Gmiv2J18Z|{$wczxg*&T#_C-q|@MM{IliF5kKr;)^NX8mZ zvd24cKS-eei#T&|X}Cl|e^c^wdKYO{@(CCX8$IK)n{1SeFH0;K3LWj{e`EfA3Nl_3 z#Z9zTLqEu1lLRAI5Thm;qL_Ao$Q0tx4=BkJhGzes2~+d7B9$R`!C+Q;?Z#pEn|W@D zlVbgSojDTFQs~-4|D+BthS~)V50|?ZO`2$PGl9iA0>T8IY<$i|Gq*aEBAk(&boy#6 z>hw_RT-1!|?ZI{JF2IiryX>uLU649Otnls{4wb1CPMQ_o{?H)^{bP|o+0=Pk3tFBg zb#lL*h5r!14sfSEh%=e2E^4F^HRD~5_=7cZk2bk|}e z=Uqcc-~z=51VjO#85DE){6WOV>zhg>g}M9PfbZCiR3G1&pf>Hgf?pX;j?wukF9Y?n z_M7t$)*p|@blPv}c|N@)IUOak_3D<$lf$7Qd#%M|9#SezpQ0$cMcMWWP7trR(JgBS z8kTf2RfFQQ%8eqb)qP?KKGi9#&6`k+YFVHUwAX9!F<4}`SAULCxQH{hs9^S zqNNnh%q9R<+NL4%$dJx#qiyw%anCl%{j?L8`24DvT%lm3#WtKnXI+Cw1<8Hn!cQM@ zM#X4Z({F}H1nboxgIUACl^m-QcI&`8Jk3#QIckWSUwsof*WiuCGZduLLY>Kb&x#g3 zOr$>nWBrE_{m0VqC9oxtycwG{Lf}npVK}W!ra$lTJ=j4;F6U z`u;u?Igr`0(}PkKddY(rOdwzriasM2CFt$15zBZeFHmz{TD z^aVqaOP;?6qK;)yjlC8MwuuyaR<}a;`?}8j){J~5YAJtVGDmS| z{kI#5ED?Hl%iC5uhz1w&4oW{Ov*%<|}E6VytXxI>NVCk{A9d3Z1216NJ> zW0lP4V(PKYC7^3`qVEVrdE3W<%6E30dY?&+`e()4Q)iBfe>6CY6q6W;_ zs&qU59-G-0XEo8t=ETq*W@zHCR*0gaV?Zw`BB0tXk=k}m32yMK>QHd=^C`C zju=PI-nw{DboUibSyps&hD}uFn_k7nZrh-m+A`XDrKy!#mfM&p$G?CruTW4(!iXbL zBoXpM4EiuNNant$3c}>YM0%_DBFPxLKq2y2*Lth@(3E#n^~09;H)IyP(~#s2Zk8gb z92R2dI4zlZzEk7o*1~H*%Y*1i7Lh zm2R|3It|GIAb^$(ly0T6(#NV?Ud_*d@BrOFL-rnbl7Pxghdyv$E3|r z1G@;sANw` z7^-gLY+dUWD_Yorc^t`rCl@(9V3_@GarHeXIB__)PUS{@*d9sF4?kBuXew6u)rTNG zdE8|`FjRje^6%eXkTs`+Kiw(UFq{ctN$0_n+VoIhbJg;CD1Z^JL@>$`0U*=`Hrf1# zcaO~rQlOq>OMe(T!O01ed+BeSxBiFRZ$|&7!_&T(TzM=u^J_~EUc0W#Njun zZBE9pGrIBWdNNw*=}s)&sPQ0(Fi0$z}U| z51C!2d?|y&7P!d&M&S2S6E_R(kG(|QgKE)>otZ`YZ>isAj1POiym9LnCr&OwTy?w}9*nk2BpfEkcs4q1!z=-&*$;L)eV!38lrbKg-?PYBxJyyQal;;QX z4JY`GK#XteH855ZFv9q>nQUiLx_MbX!up`d2)np|dQA8z=2CiXR!*-+yodIduGu%~ zIDv<_?AvD8&TBz+-SScwz4>jT&$#!OefXH62nT~nHa3xD7XWhW^7jg+I#$fNi%Bo8 z8~E|Y@=eOB=k3fW`;2vBQVFT3Lkph_l*^|ic|}`{q)-X*8lou9!zgTvEhSL>^nA?C zB$Iym4m+Wta18A*q(0wL1L>@uLiwBs=51W^RuF#N;+RF6 zQDREKUBX7K>g~}n_nO46YIE5;qoTr3ODRWHS6`aI z-t0VVw-9X-x@ZGi;)-??vBLXe79N4E!HUO0ql4dC^pkY$hS(E9>K@qr)@+2kDcKoP zk|b`$(els(dwhvMT_7cQ6@m12uyQ#Ekw)`AJvzTbocMvips68>3FzuHZ-p3c4EQ}Y zJwi&C@s)jNS_6aJZy4U2dO0CO3rbPST9@RtNe<%KAjr6{pcZ53_+{GDd_~I)a8wA^MTf!kMsy~#F(}! z>55DT6&xD+IAZyIY*kg85U}l(=K|e;IG8w{A5VnfJ%uW{VHy}ziUj;*C0g^|MDm4K zo(;pKSO2LW&ZX!02{7P8J8B{e;=+8PdYPWBf@h|Ink-T ze9WRdCd8n7+C1)2AT3Cv-&VnsRTCSx`BIyild#C_bEh}T-wl2_wweAKhq#o1_4ajzyrgBANe>0ZvE@Q7ipSa`?jia_*&OuNUD*On5`|5_nP6IC{&{jwVxWf{{6{cTeJt%hzzO%GoX zW?qD}q{f|NlEz}#_SV`*&u6745A=gUfLo=3#ka~tFKwiXubslTj$#&fCHsy~=f+?1 zbrD}aeq|v)olE`l%}Tr>&%|w$n8Q}!BG$`p{Sf3aGDh!sazzt(m416-B~O3b_r9OW ztT5b&Vg#dDlk5cc3b^pT2wnZItbKH#nE+iv`5pKvm{of2ux$tox0X@temwU=gAw4% zj+?%Nb9Op)qidKwur%ksi)fz;%yM@O1uwS!yih$4S`6EhaBns>DM4g4F;r3e7(bmc zBSF2!tc{fl{x1o3teorAoTR)z$+hU%{fqoj4i7fEn0Uc2+9ux$T*n1@-NIRq9qnFV zFWg-;jE6Fc8Ga@n@T~*1<84Uwqo#%oyD>~$y}~p)t-dVXC&5FXkmZa{dq)ZyMJ^^2 zhnTvj&d9+b(1o|iAz8VitBAIQPc?71mi>Mim5^y-|CH`#CdsC|_1LGZ>$`^?(a1TXsE_kmrkLU*h(p}m5~)aMR>2Ap2|ts=#O(62)=^kk))F9pggS&Nm)-8#TFRR zQe&qT+&W+zjm6p}sx^v3COMmPzNbOgP^=nqn>6htd8akzjFbhuL#UYpU52_&J*>gi z5Mgh8ukmNY5NuKwNkK6rSqU~CbbZ+_kW=BT(}l$rWmJ3;Y!u_+rpvm8;tarO$CK?W zB(`V>Odd_BhNH?So6B9XsEzE*?NIM1E=`%2xL`S%S&Uiu;Z7;)%y7sTMyW#gL3_}K z=dYw>w0;aZzT1R66e8l{z%bW_#Qt?Mw8%!0+y_X3lul7K-w}(}bHWUQ7FRl4gres)i@M$v(bf+)M1&d%WoJ?l7)JsHEo zRPR+2PzP=o_ntPY3KUvPpkzpr5-(i@ofLHnhuo`jb~-DUmGT9wa7!?1y>_QvJBX-s!F+4|3ax0 z+Aj;6a&`kFOBDJjo^{>h&ol)q*QF%DXlkkNfNq(ys6xy4Ucbc_xwvT+k{JZBv{;^8AU~v?|K_AqMTJLO7_FL zXrUvd()K}BBNnRA^ORGth*;RSPRb6Z5%X7~K}d;=BDQj&!ntX=>;bf8VD)zfeN>_= zkfeYvzA`{pmJl?tyuIX4L5B&980bo{(cpnk6min%%W0}GI%<=cj|FVZQMn0kxD31u zKTpOjUv}o3eG9y6=n?O2)l%D_w=R$x$8mrzCFvGL`68g+o8sHxjC9kmq1#niUK*C; zR|f=EKb0A$&>KcxzP*5GVc>%pk+G!cUHdOE9vG*BEhvNqK93MjxdkyLc`_@MkA0kL zERrDY9i&Crb3b#33M1)sUv=&&8cEzyJF$UPB&i_Ore#Fy;OuUP!qR$GVFMxjo4u8& zkb4YsKeh!PNfCqW<=QHy?G(`S4tssRVd&iiDFOwKjxVCC5u zUit?m%Mz`+0nKsrm-Lgd1q<|o`?xJ^e_T_$SkYiC2qM^mTFX)AOKB=a*A}V`Bl#VO z4e*&w2`kjEcaA*+%$5muOkJFL58hD2s^C1v!kjmSJlRc2X^^xjP{Ia;>{~1pz9M0%Y;yqtv(PqsGMY?Wa&X zzIz8@XeZ3yvwbAb-}#y1io1v8CLXn+*?-FXf9Xx4lC}+fwbH7?wDF<^B~X zX*~VH*jKgePP8*+nvm7whhAz{>o~2eH@kMNc_!>^#cOSs%J`chMk)!u}%bfoR+I{oJ zro;;vr-M+611p~5XHXd$B|9WIqY)RRtN{q}8st_ff;OE6n_Ve=-X1D(VRDYfM4NHA zljo?UL8rHHA7)KP(>1oRh$4X5Nt`6QsKKN-U@dJ4=8%8zXv!*z~v z8??}FcavaVA&I%0MN+IoHLqtv%u>q6%>26ci_qslL5yP^eXPS=9#2a|a>G&MV-8p{ zH8f;B<9gP#WT*5eQq<$Slx!6IE$nd=x1RORS^&E=Xdbzt}d~ z!gW;EJ#%EcDve36cb9i*qWrOXfxmDUpY^nvZ24C5S|UCB%rT0Alqm`kErf!$N#R*v z%5Z%9{lZGBAU>J<8J5B0uCwt8@uYDs`_F!U*6!b2?w3>aQPIWly&$9P4ePS$(3e|}SlFk{kPIFU!Ei!F_@4*~_WdD*FeUeR zvFg><0nO|wzr@%iN8(Ti8UA|yH2unJTstGj1((eqy#z{5LWIN^#)>?IDuvlc%C6rG!e$393wY} zeW-8Cv)&7BE7+GS_e#1*Dg-0n^+>1$z(00N6NDoAijYbdBF%<;AR*@G!|AF+-=Z?s zK~*9RNB?jqy1&krn(>Z&H3y@Hzwcbta-x@?3F0-FX{LHt6Skh=I*22CZLdK-u|GN1 zM~^9%e=78m;EjxRJB^YzEAd1l>t;!Y083{85omAFPewh(&hv`Twmfq*50=l`%6b0X zH>XuDvYzIU!uPm18Js9KzfhPKUn69;IlOE30$QLoh$`6#e?|5_r&x~v9-+L8{G&qY zz%pM#80GsGr2;c|RVgg$)Pidc`t?t6c2vfoSA6JdACup2fnPx)j~y5?KWFN`c4l`^e^x~%frvnm6hJtps!3)<~VXmh}QZRe$^#I+y-&VJIw`NQbtEm0oi3qaN(&@ zWOw~Wz=+$>J19s!MA^=Xa8rQ>mUC2)_hRsS{KwTtdhm!?*O>9NHx9MyGVCNHu2e08 zirU>Vtnsz=&v|nkd}W&Eoca#koX(KGbUYX_d9*i(=e)$wFej9c42An8tdin|86bL* z)rpUd+2;+=4lV7qs2Wk??nls3Q(^+c4KPst$b@Vy=oyy7aA3naY{EjHG4l-WjRknq#J7A@1hfweA1oJ-IIF?uc6RUW80T^4ke{Jmr`wabFuEf0F%7L2#)}NNOu`vEhkis^Ia^%mH2K95&6vZ#NyabiPoY zs6$3CjSl~TT%;jk!9A&b-Et+VY_&D;{j7w`+g)O-o{uZx5@Du<9aA}KCSkMV5CnO? z4jU46j9xDi`&gEd{T3_gN@KN8EPoDYFq6)8&J|5~PEL2|77ID~bIXOu^A0BPpp2VI zO4z!T!?KU$zwEnaK0r@ytwNkkbh@6t;`bz2aZ(+5=|l7P7Niv}iz?EZ&FAE$$5ZVi zE}Op=y$*>wGc?|=Fbxnf>ukn*(ZfzuS7GF77dc9(GU15O;lJV{RXZS0DG}@{g-F2O zjcc5HHg+hB0CG2lry073DBC#4z@G8tvecOM3-moz$Xn?wZ=Dtjt3Kcw8kj)g)?(#N z<=zVB{9Cec9r~;ZL+c~oA`J@BBcd_C%%KS>f)*qyM>tDBiyktj-5!&Of4>)XONxkr zq!mH2-kEj>-f@Q*j1Jk0gJNBog!}2`{DmfsI-!TEt2;-B{ZMj;Wywu7)S>f#1f>IU zIOy}&DSD1a3+0T#paATEes3IL1c4Bytl+8&QRNNZ3nvN&-Su>#U#J>CusQ${-;Pqp z`}~OeDAuRY&v|)=^ywHHTStluK2QpcydNIH#P)Zt)}0fcS9}E}^xlvXKkKF9;)FT^ z8CmdoR%#sXhbn6Rq;qq;hNDYs-CDcoV2SM4xqYN+8Okw zS6v~0lV(^M^tCrmxoW!!468OqF1Fh)dSzA`NcJ- z@0~^D*ALH<%A8=F{@v0zA#s)|&aHYYX44eADFOO9VbY|^^$iAN`*Z!4L=hxv1i+4(o*4?;%m=7Pmqcgg$b2Sv!Z z)xpPBf5txJp!zS8P6b~8SypGt7ASC5_q)K|oR!(H0x9u9=k&58`R+Faz{aY0Y2sP(k&yB-;B4pm z)KS$Gs`xE$XIw3~3K9@S4#zKYf!A-t;v5xF%Ja1txDIvczqpXC7=iRfZz6j9KK$xu zs#$F8QOh<>RJcUuNqF;+(qF4{+Lbzob;&@0#Op6(Zl~Ag7M(gP_G`jzuga6#gGaS02yw|Ht1u%sppvo0OD_zBv;cl1`M06s8oR zoH-JkBb16#(SgxHNklnvY^W#|<<7AQk#o7`*!KCo_xody`moR8^ZC4=@8|1yKc5PQ zk5#C(moWtvUQ+E^@ku*NySx4}<>OYWMY`e|ud0?FDOMO{=WoA5EbC4G_vH3SdI?`Q z7DKv@&d(_)zZu(+Lrp^pzV5O2=ItlspO{JcgNu(_etA_*I{G-_PP^FsmX_uRh}d%G zaZ#T8Q{L#IKt?_`^w_plD*l_+|+5a9kXuegRh&)MyQ_8iMT!Ap#% zo`SKhh?u-8`1C|a?BE?uCd_HStp_i7*?7(n|Mq$E!su!6nkP4NZwOpWkX*U^sKuCT zqRk-3>_14ew)noB@-US0w{p#rtuL_N&bY|gnD}PU|24jKpOj4nNX3wtW>1~bUnR-A zQC2u=^KKB)lzs~}`0m0G(OYeL%9a?6mPkcq@5ZK*Nb$gfot_I{1L@J#7iVZrRP>^= zE9#+W>haN^gOv{Y((ozHv|NpqC_~b8EX$XFkuf5Rh^IHwB@+|hBaymKjjik!B~ZsosiS^?iV+*9%<02A zMeqFi$+m5#M~{tuHnlyJH7z4s=UFT%Tc^DjtCEUcG}WP|+%%B2XuQ9tTYE1$dngXA z$aR+OZi#$;uloK}*ORcVbs8m1sbiPA237~c7MfZTUHV;J)y^5L6cg^)XmAa+dtMt10BK_r^irz*t^7#| z7K5JADnfp{@~98|V!6xbP^wp2h9#1&r_701WOyx5RD97ahdL3ck^LAH3DN3tjn`## z^8DYQbiQAk+tYT4uuDz7`;Ju6#L)e4iPz$BL;D^D%CWzTyqD`n-D^Emaj{`^yC}a( zta;^ zJ)`nIl`J1S{ie%%)y`qgRygAGfcrBmw94Yb7mM1OqC11`$irTrpZ3vT&1#6WV6A0rm*35qFljguOet#}4%Y z9iXV#+G&bv=fj65p7Vy98zbuA=fEislqUG#px}Yfvh^^<_qau?;qxhr^I`;okvTHK=5hWzc zpKGX2#d5V&sjq3Gq!8hyL#S@a*3Sw2TM1>9kK(DDf%Qw&&90BXBpCGL3R2!(v&d1M z)>34XtekhdbZcxpxV&wf3!*zX+C*ZiZo|d@2g0|K9~{Mga*!wehAn6G2f_|NHL03- zs!1~X1Ds?=R~~ulxZe%LEPcwxb8WUNu$)k`1w>z!q&aP>_5(@j3s(1H580sSlWhXD zsD3jkqQYe>zW-tl{Sjky7q+7>2Au)be0%eA<>i6Z*g)uoBiq>}mMc9!4RL%gCSE3|Y5jHC&@v0J?zp4?wJo2Cx=#gK8ZePqY1k&1|fM41jWoC}W|5`Nr$;$Tl z4laEMt2Z3kg%8s88{4Y0$ab59;9S@BI-D5P)0 z`5nZ1Z;_rSY^T`riiS+stRM@2g&7wN$}D`IE}24up4_-aoECbYpto zKq-=vw#-r!zmWrq&YxV(JtnEPbYROiMnCFT>r8vnLZ;`GdyJ=kB%QP!CqzWwBSUKPeXtsH5#ZCHzkMd(1#MBM~WaJeIBEx5yjJmRdH%uG*B6tao_Dt>=>cfNZ6~{=NOa%yMLioNw)_SWIkLsnk6;Ady`>(A-_Kg+ z2=i4{*ulRT#AhS?s6F5!CiVN@g8qlA2lTXEAWQ9oybEt|)##bzjK@U93DQ`Oy zGMB9`qpniM_dugka5OOz_sVg=^Ek|CnLVlbff7-bqMnx!Tj$pi9el*~tHAmtcV`u9 zFQHY-3cWB`n|KY^zY|+r7c+-^fdxi8YDl$izQXR)q@D7hse~UbPAX~E!8YNk`0dJY z(ZV&>!@D1_4h_*&pKy#t$~v6LDX{53xRN9BBCbcLAyTNEi?I9G=x zr^0xq16fEC%Z0QJ+|8KEI?mg7no1non9D7_p06(Lj~uwHO8ZRa`PV<7)M-j@I#N%G z$8&!?M}G*ECs;i~g`c6`UCuj%R=EU*4ZLZ6s;OuGQC0i?VE!q0d_Sgm_o9}xh0@a6 zS{td-5vQQ{SKWuCO@j2IcJx*!XJ;CZ{(E#aA?7+mh;j7F35gdn(m5+%ao=&32`OTz zHDx1G$--mP*Y_NfFxV{HJ@u_OvI|8mUyhMxB(CPV+O!OIb=~+L^B?B#JuJb!M_(}+ zSR~@VzO^B>Oga9u%v+gLrF`5T<({M7`ciZY=EPAEa5X8J)gG^a%|W-me7R!x-~4Kv zh5C}34=>#WgioYo>uD)aDTkDx`>S7f`i$P?l(Q@iP5x>hc-N74jA~vOmOodGVjNv| z3JoF9j3&))x`LpstjB`9B*oPyI)#e1V83iQ)HI{OHnhGb0f-z~OL_=R!o{idDPt4N5m^kO&KD(_%5XM=tK?G;EmT;=i(v1%qFgo* ze$CH?gEhh~k`WZgU9>_7Wllg7AYH*?A|Lx9m1ZO=dRB)jW0%wo4#|Tg zq1b$eDC-h+r-XhI_Cvihc;x+@=q&}u)K2+SGxV&bIBA2Ia{MLfOrk_tk|Zj;>D4uZ z%jb3VDA8Ijbk9RY*Ay=Q+(P&dU*9VcJIIu%eexzj`Lv3|C#wxzBzBXY?+=hw=l{8F zM!OU5^V{xFFtn0Ly8g*EKc@^`^hwWlYQzR+6=W(Y9)AMEy++pW3PN-}pV;G~bpcx8 zggEK&4bd&n@KPMC@g#id|hV++oC6GbfY?iAFuIN8;6)RDE? zs+zr&TUBUuBqexT0Q#=vVX7Dgxp!NR(T$TnBImrlhkJ80>OFI|c|(hL**_;*ZLG1x*SV{K{%$O)mS>;TUt35*8`mnhTv z>fh0Deyv~4pR_3DdMSydmZIVlsH$PW+0nDDWddv%B@H}`*VF45{Q1mq%)3z87>V%x z4-$EC@Tc*}dQuM}qXoo;qjyt(acxgbYg~Z!dSxKph$>O}wUp9y6KvYgZ-m`uLi!(G zB4`ULaY@*kCsJehiWkDBqPnnj zJQS>Smlj&Nc7UNa`QiXceb_aSc32!l+X-_Q-s}O^Q|?-tgb{j~Q{Q~rO*#rReWa2z zqz2L9w}GPy$!L@L{VD#_H9!M9-)M}y(oSv1{M<{rehj(oLdsc}+J!u`Q6!u}u}r9* z%PH?HjYi(cA2D|;q@BWKtZ%TmAhFk{rF=VyhUYc(Q2v@m^+Hj#ts!k1=kFIF6+8{e zxr-sdf9cWLWcqrM-6}SiFR=s%JT~Szu9u&$A*^%Tw?9TB4*9YI1ycEN`7QOhDD-p_ zlW(F?-XuL(vj1*-=m++cl=JTG@#{Q<_jV%QY4XB4se|sPMLw_>-QVHH*u?V<8it=x zVrVHE`L(coIsY7>T?b>8tEoN~4UAKwZ$3D6N0MXdWjDV!XSZaxU6@Vy7M3Mdf23Vg z+MtOuj~ltatF%#taQV&wE1&kT(iW5v(3QMLd6bcCD0CiD3tzNCG<`N160 zJ;||SYVEdVP%ymAm)-G9SMb@AE1iV5pIX}9=ZxU8e*HVMv)as1$L!eB_<@y`u;Ui- zDih4`SX7u*1#_ejQy|zy-(o4C_+Qvd!I_tqzwG;cQ1m~#NKzI+29E`(Q7_ z2AsiCw}T2Dc4yrX+^hNY4)6lK`(n)gi!uu5)UVpNxW{&dX(ZgK0cYZ*7=i(@V6OX6 z9AMBk7Sz(#0Cv}BWUhXZc}c3ec2yr0N!mOl|0y?I5a+xYYp5Qe@l>0<7SO zB4vF=mT@EoxeIeGgOtvrNpip)I@s7}$F=2se*w#teH;Bf#{5HEf#~{_y z#?JZGma|V4L9|*B${-1NzVjiK{Y@W7J&Bk@l+5C`g(9ohvpfEJ^EJ(fRZp zh9E;T_SbWw#+|~J=3LBG$swbda)`#WX7twfgFUqod7KWzH= zJ4e*IkLmmpA78L(7V4@goka0VoDltNU;L=iXt6?X)t$ahmlvzunD;+GhjNa36J{Bz;E&0;+7+q+ z&*k2r)@-j_itr5`hd8mB%2!XFyK^dU4j3s&=>)9O4OJv~N7M*1sP$_Zg|Wymj!Iw> zZ`HWS>9;89^L9f zw3u(JW6JoV;ezdfr889&^0Ed-_nA1VY!64nrYw5j7Fru2t9hGC<6}? z4ms;+wVo7&^Q%y1XA2__CXuHy)DCozEl?UygNq#`k6vjA1O z12m$#%QT$0XEP2Er14hDXxXnT*<-s;$FKm&h;nQhuJDsrZ<<2*LkCNeMZoKc+~niD zKpbGs56z7&ulJP@AyGB07`Pm&sDBejm@@Q-=*KcPLdSdZ47Y(&eyKK)5m9`Gre-Xs z?B^VKs!5pcLUO#p3+#GmZ*Ipo?)T4S6Dh2`UZg~Xm!^u^%xS50WZ`LBLG`$l8Rj<{ zq#DRCy+!s~%HeaJ<&)$$N$a1+2_;Mn#^Z(aBnd>yv^=_cHKyX1y1Y%37yUpzhF8m^ZXK#ECt=MY8=H}YyA4M;cT(AG(XDzTUo?{tfs-yjBj%rDc?%bxcG{KiF7x|>h0n@e?JZRQBKv= zH2KWT(VT*XZE&_ayfokEH2&~SU1CQovp;n0{|_A0m@@b=lbDk|+TP?VIC$B!qB_@d zqA-2uKjyfXXxVtX3{`mHUtJ=r5VMiBVrKV@)^VnFx-sw20AbIABJ}eH|G% zYVVv$UZdcpp6LFhMdNRklq7pj*^%bGwO+2*9Znuh#!yNPZiDY_Ph{?a>C8ep6qkt0 zeFto%=rf{#nRut>=|60A?X2dhs+F*cH+)I%BK%7yQ&54Ri|5^PIDhyhJI<9D z!_4BFo95-BDmQQWHcibgx-!Pgik4zVavRsnGPd$(^0WW?!aMB6F6cmxG*J9kGubQC zYv8?0hxc4>&}k!ITsuMCA&~n0{#N#n7jtYl+;Y6X)$c{hS&&{9bM9qZ{>TdMMLiY@ z_i3D9|NGm*DmainD4?Kl4&B&GL6*(@DK4(Y7E9pnB-H+YuQBk8a*dID7~*D}sxBzM0xv_p_We<(2Be!+1J7#= z=>>FCUD>7Tx-1FBR;h&CZ%+*`S_4XVVb$@sw!+*6D)hp5hP&-}jlUoXiSLa5zF)D-Cvi>!?#S}K1v7WSzl0(NW#bzBz4ACf- zR|8!Su%OdK`XEKccrIXFcD8jekDn|Sc1f0Y;P?< zp*LwTCIRanb^gt+u`~L#qbeC5Qy}LgGQ3AKrr+fz%?G_Vbm9`#%7$jdo(lzjO&exRymBY!GU7;M=?v;E3+@53 zCBI6?tl6#h${GP^3WnHX?PW#CG;DgB4{VN`cANY0qJ`Bo$Qe8^^Kfk_|AQQ;6*lgq z$LQ&~CHOiacv~k6hb{s9Ie~ya%hiGdPJO<3x)j}or?>P|x8 zU6=`&8fOl&YTfJ2bY~jg=~5Dlwzk%2tX(t8JTzymh<_(Gn zCE($6h|G`80aIU?t|)?8%S)`UL&<&CwZ_HGC|VMhTH*@D%he&RQmU=a7YDuf%~1?5 z>0zJN#|8B#g>S*pxvh#`+QAfTSZ{E;nrm3ZFD!E9nN^q0#;mAC!FlPoQ#-3XkLc7@ z8@v>?FcDX*{8m@<7CANTQr+IU!W$Vk*u$2DZujT0#&<_xvt zzVYbu(a(zp#|AlYVriuL=`lXE#yI8BXba%;lw4j6t)%qKz|>iWMNJbg^6uhQs1McO zQoUkqa(T%dUH}t5j-tWl1L-+c7aj%SuY~ds%qt0=Y6rC3Nd7;(xw3*!b4!(PC_to{Fo(p~_qXm}4>4>lyin~cA>)rZO1==< z=89{h<RN9sD3{!9DirI6v|TfsTi7q8&$OndW?%Q?sulIPqpTvYjQrS7!gc4kiXT?=LSD z6$dT3UixO6*HSf#7aCoxUU4-1N{Kixxy{wZ5wijzJ>c(e<;O${>NvheJkLJ!>cYY! zDBY&~HnNy;B^3QVyGmqY!Wg;`mKFz%VNbn(iyQs!8bHY!QS%!cJp~?fvRlg#m_)t` z=2%7JpzTb;Aq3}(y4hHa7g?W5_gJUw`QtwG-!!ypka^3~*xrb$*g=BcO`k~&d0BuZ z(9TMu*%8SmxbCgr`K8rF92WN`20E7XKu%glz~^gb`z;C2i&?gdk3x=d#W1-P^8bx*-x=A@GEx}&YfC)Dg!GB$A;>p%)yi?aD6ca8J_d5)}yArWY zqKVA7U)}S?eY-@br`dG75xexSbtLO<>m$j{4|QmbN}FA75viMS4<<%ZckZ6Pn=dLO zTC<6^Zl}0(dy9%oe;wbk*wK-kr=3$+g0;oh2ut;IFgm8kD&|7Nmdt~e%!?h<$a&9c zg(XiDhI4DMCw=WJ(Tr!!t;b)yE-dJaX}<-GUk0RY)V!dXC)UIxuQq_u7lIDe!4V=2~Tx!r(t!DD9$m_tl1PD3&<5 zI;kpODjqP*juiYA-S4^PI=u&W>u)wY;L!A)al3(@AYi}_Giq?t>a*KXG@}E8`R!VN zON&yapuhV}f|iV5kCiT%dVlX=MW$38j2+GH7p|O_H~G6y;Ai*Rb=i!&_@u?$xGr|Z zSZTUS1@5FcUemUQRLu$dnbzud;wXKihV+=3a>B}V{He>bkLRDRnD<{=Ep?Hn4S%(U z1|YV0p0WVWLIv_}=XHAK^o_!as^(nvT>&k@0VOB;1pNxpVlel!8{%?I&+zWgFe3Hjn4 z&toT}m$wRzH-D)^AZKS`CaJe83<$2=EPHuvvEvi+23rrBm+q;mSz`fNcX;bX$nJl& zJNECj)jGSI?~BTxAM4Mq>d#JqwD1oPZxO`QGemEFc4BG%v93kPJHHsKP~}_dd`ZDY zh02>*tkScD zhIbD>5d2Q8;QO5EqQY=?k$<%bK3T2s3+LgId`oAym0QMCM9LYOJFOR{6;+L2M;B;B zF7g8x-t)7RJ!Pj2onCX-ygs$8D=~jD=HO}YFgYz?SD zk#a$_Uv8QV!rMco;q|*`%Xc`F&CsYLsWbzw@aRb!5!xkXdY(nM8(lUk|O#3|B^jfqam<<>P;dItRvh;#P6=? z8DT_N#1~@H)?oR*YeC+QkLX$Lhf#47kq1EGtYM)b(j{|JmYnyYg7of}(Ghz+y z@-$l46d!t7b{4v@xg20WFXv?|Q$We*z~Vb{sfTV@9|%MxM9#$I*5qTU{d$OsXWAL^ zGi}XBig6f!uBw14Kfy?mez?Wjw@`#eTU=vfrp*K(IW|*^S*a?oTP|G-N4yh_yp^$+ zX+B=FWoB+AvaE95ha4vL-a}w!it720@9Rb6qT~y0U`|8h|H--0Hbe~5AI2cHs6oY7 z$ubIOO;`q#ul2^Q$a^bv=|t;p#}z)a$xx4!##jHFannX@9ZJxN4d3&SHIq+~og7~8{5i1V^2iK(}eGA9FDU(=Ozlm{FZBT=Y)&DZC(Q|Pg7$J#m`2{Tx{CLm@p4vI11_2+2P)?)!ic8G_eDd+&x8{t|_`_SYI`KNJj>6_mi@_vk#;+Os7+F z-5xa`B*AG+z`Y@$>w3yf6EY7;SZi+=(M=qSd^1xGAm#K}eWF)| zCM|3ikmIbV%X*%&P=^yADZd(649)WP&09ay7mDgX7QXnmMnI<_?Oronk_O$pV1&qw zZ%90@nK_ntuv+8DKew=Mi??DAb`#+t#`|pZzFTfH!yosN@9grgf033=+BqQnH(cZC z?;6O35ylHgFX+#d7?SIrSrroat+_j;{#kMsU|sm3=XxqG8O{|yuet5r2xVX;&6kVYqIL++Ou=bXNWqgsP#4{jdOvAeT zi6<+s64@Tav};s(%DobtFs+{Djl1FAR(e8|Zwrf)Mv zOQ+BBr{MyvucE2aztC@=gRH4MYkKHKtzL?}Xff9rN<1aY1}M@Dy34Q0plU>Eb$_xe zLF`L9dC7@E7b)kLj;{0Qp+KR&DPkD!gE-Z&VW;r*{m4fUTm_`%n*k;RDMD6S$&b9+f?0M&j9eFH_4L~M>DPU{~b z`IaK7#;bq!Q1_szRSQ!7!WD%*cOUo{^NJLMSA%ew5(Ud=@7ot$AQ`k8_YQ84Q%>I2 z{$afKdh2cn8E@`6T+Dp%UaQzX9|su~IiG{zhwIvV#mr;TJv!&^ny=Qp94z(SoaSEq z$K%{@&868~-?bd$4q*-tz4KwY)epC$p>uvgszDEwn$Di9`}~!f`53#gMrpPuVm;t~ zHBWyaWLBdTO6U3uKm!^gONn*Hu1Ne{n*9lNfxSE`I2UJXqQ&ekD+m2Op*VTT6|I{X zje(o94^BWQ=PVtzx_rqT`)T?UW3{3gx4_81Cq~@8=8kvIed!e>2s++HNAv$RE?U*O zI1rh)W@@2Fki>B59P6o3gY8DwL?|XKd))Wlkt%ce{5TyNp~gs)ECkOg8r=b@CbCR7$L+E$4sZ7Wq0>w(I> z&rhL-exB9&6&x^nep1hiFtzz0 zMBKvP*ylq-j@i&TPf{Z@v>$ssNFGvd9ZzHEXa}cM9!eIRySKo+iT-M3p&~JgsX3{c z-Sf(56;41HGefkXRP-N=h8oG7X8+C4p+dD7fWLyM{ClTDN!wkne_PAggd1+7Ij-`C zF1}JFloNKZ`C$E*9Ctyp0u-2^e>tX2o|wf8Pz$~Q3eGQN0{)YO^c&8}u>v4X-&P21 zK1Czld7EApG2_3Edy)1u!Eqw~k23WWS=K?_}&h8F#!@>)z{2Cv2qhZ=< zAgFv8Vk4x4r)pN5oZac7x`}qsK`F6rpiqE6Cu=T&cXS@<0`91%6Hs4za_`e3l8?n~NzNtRz@R&Z$h166g`4DF;nk8o z%Nuh^yA`=M+i9=-5U9H11&Cj9sYb~ACF&W_H|w4YWtFOl1z1lRV8I?bL_dindc=5q z0}R1G8!KwgK>3jewWgkBk4qd3k}xG~?4 zv5sQK)@7N|=#jc_@A+D~4XE&S?GDK-NKLP9_is`yiqs6jIN>l?NQ&{>kyyb3id(j2qrsT*tjK66NnqcRD*0g<`=JD9!U*B)Qfm zygrx!OCEaig{I+Q3&g?kd-Mi}8CU&Z$X3NEx-j(fONhxTeEo!A7Kf$UyH?~FKdst+ z!yZMCLYaGbOw11L)yX)Hr{)Zp(O4t%W)FQgXA@ySFR&eiKl3OK)1437+CXYK z-gH*`-lf`_k}=7ZU?@OeP^V%IqM+;RgT!6$&*jhHZ5RlwV%1hx;2<*n8Xo=6F@Vf8 z8)%u89{%s5IuG(wLi&UGb+}TOHDrq&&n$)($IoP0lX0^>o5ERHUjHwgb9wHJ#l#4zS3Y4oa>8NlwGDsHt*){>B( ziPbf?`aV*cMvfe{%icMG|L}tK<{nhH4@JLf7diEQi8x@WHBjlX9)x4)<^MRsN0A6! z!`%Otn>%LSuWJm0PgaD2$qz`> zO?YlvACM5q_}v>7hap|y+8X?(7rx?O>1`?J%cI8>=Xgi9z$$w}$T-EPNmUpw5mFch zsXh!#d2z+{U1xL%>a+I<)QeMyuRe?FEV|bS*(Zkny8j+UOeEh48^i%+E5SIh7OQN7 zVuup9s568S{f!_L@4XdOzeto8f4_Sp_{=k=AzreBhr#($y-(=+?{5kz#mh7D#)!5i zqe$f70e#ZK6)*BK$C$sbA4MZhA0NF^YspsHxtuKyuFTO7kJBx&L)ZUvHQHHuWQ)OG@x%*;qF2L`=9sDh67$UeEWsh?QPZ416q z<&M9J`S9!|iL$iuIRDNzK-fs?`+)Jja{?7;wPJf1ti#D)Dxe!o7Wfc%E=|NmRYJAFKYC6Wzg1h>g4$wnRALhK=D9xoE4cAqi}nf^bt=y(O)3xPS{Md1K#PpopZF&2 zPlQK`7+ph@yW4wob`~OtwYwK4qf^+F?t*n?1o4bvy_?UA1~5BP-lN4qWeCC;!SuaUGhf zD>ht%ns3VC5VA9`_I$Q&C!f#LX4oByh3U?i=?ei!e@lG;)7-OSv3w>w6MUe;= z4zAf6DDR@9HNLM&Va;m!FKA+V(^uNg=yP$`J9pjP(sl12Qb@ssU0k-f8+>f*5y#N` zEVT`w4|CRjy#tyd2vXO!zq7v>CX}>My%!?umdS{YH5V@yT}(W64*ht3y~zuhpUUzY zTpY*iIF~|{h?Hj7nm zlxM}{3{>@9H-FTLRhWv{078tqU|Z`t?&Sq~bxcTKvg(bxsSaCn6st>pfvK_-MxV0K z##7IKln9^dC_nbi{YO^f6J7d05M@S7?SF-(4)Uwa9hj<+zd`s;4p{iYgm*1`dHHbh zod!swq5(`zleX;;t;$+nD}cpaNS}p{>9#>S`CEPZ+KCtpcBnXHrNXO3*oAb+`j#7x_B52;PU#fS*GH zqXUq?P2b^7DHXS!ftTSfm=vrc=k9DY_$n|u9tem=PqvG|q~bO~QqdNVD2wHPpBWo; zmlI}89pD#pt?eBGe4!UZ$|D%?T4`?w4?ci{xB8!1G(f9DGSg^-$nbx1spZcZb}5(9 zj4HQdOnH+5)36E+Ar(;wbP_?GPi28!MAvZPzLwt_CSc3ke_=u~9u*;*q(%DPGeo;{ zvD9?9Gc?Su#!ny>qQZ+cn95fh_j`W2Tjgn;@KBuJRAuxB}vM#Iv%f*oVYNo;=$hY~qbFB!97`D&aV|6@F1_2fM}c6!>q< zOG26vlB7e82NIa40VE@C9`klLt##D*Q}j4br1Becog^?1+CkbJfYR|GxsH}VHx6dY^6FQr z=N1zaY3XFFA~&6Y2BjR|SfIhaWJG-Y@0Lr5LV9(uIskC**}sBTp5nnp6`7 zYU#?CHLXXjwxHCc6;n#aEzvw(&F!QzPFoq6lSy{?7jqqB)9Ebz2dnefE=GG&LdRi( zl7?U25rgC&)SU0sQocmP-yxS;bZd9xc!>W+0ySX^3G!qyHoAH`_a!02F1WOicQ>Z!d< z-zq1FWKL)X#6rs-Zt=OU8{iOnCt?#RGuzWc0!?3I)3Rda8ZAO?sF1G|zRP39M7mR< z`cdt*w}0+|)B`P0 zKow(_&3EchU^hkS3A(60UN9#~Q1AEv5f|`y-T+>5-e$3XE7MQd?YA@%iSi8(6@B1#Q?tV=l}%6A3Mk zt}g!B@KFs~RQ4BNSdQHPbs6T?EI+$A;DHm!;9#kyMV&2Xqg!C#kQQ2yMhmr=)7#$; zTYcnrh0knTnx9M;g#OOmTvz|9lt(}z$FrrOj)x5X;4>2wXAl(ZjSBy^s?s|*ORt+8 zww{iR@Z@PFQZPck2{s@f10hW!)aPK`v|D!sfIa%>!@p_qDIw#kCVvCh0m$=i8qGTv z4^Qkl)wI-!rov{TZ)3=~pq@<`Srzsp6WM*!wb@Jyc3&G2x}@Dw1(5DPIC78D&3B*wpz01_ zV}n0iQ0lkl)QI@2L-p&6CR4MRBn(3iR3D4d{8yFmSXh5O1E_RhjPh|ug%yOby%Zk@VWHm{ zR2{5=;%r+u%eEJJ`#}hHCVt_koCZgBkO*i3f$(c~!VXl*P%m=hawt#qNz1Li{I{b` z3hviY*aqTjl*CJP)i+Gk<3D`NIPofarR%+Io|~xRObF8*F7p=ZrC6H~ek}!8(E%7< zr1+jkI7?_GJc~} zu&9SGL0}efvnb~6tX{%8^!69O^)`RNO4!9Hrikp0lc+sfp69=;G@0VHynTx3a_%>f z!>n7;*Vyqmz4k!yg4Z{2=&mTMmpAlELH~OpGMQv__!qH-XZz^s3O&|grZFZaOS*WI z-XG-5=|Ap?m`_$E$bOJ-^0W8?l{Yw9Tk4npTF!4K0{=BlcjbehMUcW<#j?L44n=<* z7*`a-10pc&`iD6ES0W0O$_E7Qj=Pw;+qGJSQm+CMF~I=48+obB?|(%s<(e7JsIC=K z@CY3@dwHaVcpTP6T@FmAW;XjJK6ugB0&(ejlOHAj_*mb{F z8}mlD)%CT9odVg83#`cL3z}vyj~{ktW)4;-iYFdK`LOgn(I`Qi4(Z2zRRC$w_n3Q% ziLe%Pm+NPi-7_lL=0r<<5KLr>of0{lCrH#ef8O5Bo3(#ONfxk180|pQ!@rchd`ed-GA;&mj{>$9c(PYo;79jKg-OaWiKWSKX=HNw869&*=JIHf!EI=7JZ0= z;cB?`vML5;*D&D36JcaJuq(iEAFNRd)0#L3fvPgkJ<;zp^hLm$oL>(-^ZIVmNBogD zpjgQUsBf5A{_!HXwaXP_HXF& zf1Yj5k;n1Hj?tuq-o7EQ{CSR#QTqE$!KRDLw#QFE-v_f5^3@S6oh{#pjD#y`Dh$|Th^f6de&%F!4PLqd7;2MV zrvF1V?L8)aX6LOp)Kc0Px zblve(|Nr;>zQZ-Hz4s+WDIES%p#lnHnJ*Inku6{MG=*mb&WzLl(M-B zSLU_HUB9>Q?+=f<58QO!*Yov!o^zh(C?Ig!NZ56c0M$ZbzsvZo`Cx_^96YTex?*ZkhfXABN|B7(?jP=k@xxZX7#)#yr0_aw*H!o z5x}lrjH6}cSiWgOq1q6Ho9SS5X}&taUJjy5c{8(8$gJ2pQqDQ{UKJe3-0lJ_17}{j z#68_muSO;RVu{)xA||-*sYF>+NRf?4K4UIFe&D_@Y8w|ZUL@C3uM@0mfjMyJo=KU@ z?7C}%cS70q0JsT-oC_YjQcN?-*Ms<{_dXz;q+pXnfR(QbZxbF%*r^z?dX{*%&z7&N z59yo)RNi;tQ-F`ZB7`*tLiMogW4wo^;MdKn`RGZr=Etxk`1fA6a(jMdJqoTiX2&mq zC6oI4|GMluU?k*O3QRrB_vN$$MP>?hz}c%p?>jX+{(DtGJd}8MaQ=cGh=ip##O~3a z^XE~jI()U?4vLgSbzFQ2L(p)<9~XKTdMk_w`bM|qu`d^gZ~26PtJwKIC75%7%U9CV z@M1d5-b&2Y4!`-E3&6Za#_uBlxW*B(S!Z`dSCd;ym_O#!^)BMxb_Hp9wDJ@yw)UI0 zbNZE#)42tcJizb73~WtEBf8^1J#*b%A{Z?(U&}M}#j*U3S9Uso(mk0_NdN`RjEOCv zJA6k@R@{|Jg-1bR(5%P*rz2vNbwGIBba=8?#o$JEcff{jxmMv^Tld&-r>38(I>C2U ztlJ7tZFG-590KSc&t5f!3+?>x?u!@RH^Sp()fb^%7;WL+-j4s2;W)B{_X|Fg3v2q5 zKZNZos09Y@Fxxs8^z5hb+gsyb7mY6UXS!9mrWM#NMEqFnHiTK>$@+fL_gZfO=rW-C z{Z2nhgKMx&qvHPPe8VuHG4V7vX|OXD7DRD|Uq-$)DVSRhpWUuR3CY%O4b%k4OWGVYf6I?e>m2y=17Kg8{ zeSk;!#CtL+Z~^3qu6pecKXpeN2G&C58Zj^k!q`=I;QLO6%?Q74RNf<*!~jnLj_4qG zmL6_idA&TJliS^WabLs71_g5z`4&idXyzWlThgb2T^r$JntaV@$@_W&P8LHC<_z;e zdw}hE5tx}+8UkmQ1`$Y;pg=cW%^AMF!LC^&-#^H)N|<295&|bYT7dG?tuWaN|I%Ri z;+|AWSUvxNPx}Xquc%k#_`unLsSYL9W?TzvDlh)VWgp!c?;YK!TVtEq0T1CO5)KU9 zrESLqjQ{*z-peua5Sn_A{ILw{SaupnU%A#mr0s>; zItXcJqOehe@!XtkCxE?D$-Hz6>@7KZNM1R`}E8hVesia0EfmRo{dx z&da0hiLmzlo<0C?*+(~4hw^=Y#zbr^M%{p2h&x2HXA)E87^Z!5{SyV4CUpd&8~*I> zR~$YX#PrpKB44Qpcnjb(?#?8C@NI&G-^iz(fN~r*#g`yB=1f0kI&|Oz9TI~5PVr9( zQEUhGVcO>7)VS{;`95jsH!~>mZ}(-e61KIR#imuK^8pcG$E7?seN!JU2lrMp|9B}3 z2PdMeR9pU9LFD&~B1B3PSZXhNnBy3f|h@f zSCGjL?4!5A?+D@s>Dgu$k9ph^9>h>~w7`y>j3s_PQ1JzxX`re_HKdqu(JogAWrPt)>6(61xK740m=Rr|)Llb$|RFm&!M`=ULeE^yfA9HCO z^kU+N;O>|;_N8EAge=GQy!K>Y#G8+Kj~*qu4#6`lEEx$^<@_o93^y^oxe99xqg%j0 z&^htW2TIV7GmA^g51y?NqP51B0vxzhV5j60aqgQ&wd+wq({V!|I_kQ`1N+x0jX{0V z74Y>%Z)MBm1Z+l3W^n(^5QTLv1v9*pthxEVG^bj<#i@VPzMe%>Y6iM0qV%cMIxbF4 zCi^PjQ{R6px+O`k-uKmLX_>OCv)i@2yA&GZ@QM=WN+&0-QRXI`tWh=oI4DTvL(!n0E1WGVvn^qao-nMDKTxzC6v z-)fw0>7Q_;p5@DY6WA0J)Zv9Wk(ku|pLKI*WZ7}v*XPLrUr1dwo`CbeT?ruh80^_P zLc+ju94CFo#(}kPwIlm_`C*+(P2@5=0cLc2`W-_p?@i*Ayc)7IH_deo6l;Jrmqips z2iiItfx3Bk4lm4odQY`!PLTo9*O<|$YR^B%9TX!tao!+xH7A^%J0=aGT7{N7gZh9=e!1sD2bSZnB zxQIV03l61>*O5Hem0aJt`*ugb_tKptWL=j%AsmiJ=@~ZQS>L&)A4#-4H<%!4O%>+JHTf^2Zar-aB+p1`yW?k-|QVTS>#X z0PZ(Ox}WNY9gHHu(|njcP16Tb5eIY$mJpJAgRSzKL)#JHzDCkKLHFeYH2H8?<~~0n zHgG0R5XwMYl;Y`0V_zN3%K(!Nz(N_Bv=sUb2N^2i7O+NCEHo16dYT9u(fobf$=K~g z0Z0}M8&-dEBS41sDiZP8|LQC=sI@iZdf?w>=)A|-tz+MF+FxZ8Ze`@Ti|zdLpNt=< zYV`bQE3-2-4X&HWe6Tl@#RR-rDo+?WCpIomD!X5w@FDwwD*wsxI#`WxT!rd>5!tBD zO;KpFvOq3!(yl{^m7G!CN0xjBeJ}JpYe4O7zuqfq@|vWk#ZwDwKMp-$Em4`rH-umn z2&^LP@jX=ghYiyn0edwe=~x&^k5pv5cS zI0n0a{y}%QxF;P8>Xi0N+T0wk^XoD*)mq?V4W6^pcD5KKMZ=4EIz8g0aH900Z*A+k zPg!(`)VWb={gQsx{5sDVtmR+^)tikya=Mx5>chSA2yUjo7meSD=3i;#S&RsoF7U29 zyW{F}>=#3{l$gKizQn3O1Gi*H#)R!hE;mYsEj-~sgkfls;bY9kpoOtydV@(dOwe9S zNEnM)Ng$#9#klLy02h$d;No~I&uGi8Rx!oo`P)O0o)GDKT;8SN4|3S&wclRAaEAXY zN6~zF!I0-1dK14MjEAYR-@pAyj$3%444hCEB#WB67JObNMqcjuZVPKg{{5OhNocUJ6JX)v7V7fYzMDVZ!+ZtLl4M1j~KYn>f@ z)#haI-nm~U4eLYfSVn^ND>@=mqD9T zX5_q-OrtVMfz#6`~~_%D#Dx@Ok(%T@;E} zBJ82RDFQ?}#*Arvu5a1ss=z4JpOX(0#}H9<{AzAn_}y{UlkWaF2FNTaX{r6dmL9uc zGR1{zhS;>EZgSllWe?9V>H3;E>)j@cGWzQ-jh1BR?@7K<7mrdtYX^S|32v8^C*B&# zok=98|GFEp+>$qOm1+3I*@UYs%4G)*Ta5lVJyB^A++2Jn4^{x?k(-g$a5}YZEn=Tl zQ0neCe-F%RIg`~id0}&$*78<$}JZD5;OpYV?F_CP} zZ#=~X*qMF#xXv*9sj?N&WE|f<8@S663GJB!oIgOBUQ(&*yfR2%}f5gaCG)2 z`OAb?$i_T1B!ulTb2%>z4S6l8`nenSazz9%Gh;>{b$eV}M@DWXEEO-X8S~YYzRq#8 zhWIXFepAS(D&A#^*=}7$hHY1hNH<*J%WG!|i%^Cp&gShW-NP)#Qed0kBO2q)vCPm=gNqvoaepQ%| z!_O>Q$>OJ9Q4`btR|%au%PS!)0qXCg+yFK2s+1qCSu$gLDsg0o`U9#h)4BXhq87^! zjOM#w8_b#u1FJf+j0blK*LSFnsCVSG3o1tWpNrUsN6HI9_KRpj=-$FMVa_D9?%h~? z>ZYTPGGz4PaS_|`4pY5Q3}9Ey@b(>n6cc)xn-hLt`bS#p%DAqvd<`9|PYYbpW9*RM ze@I3pT@D#1oqRjnP|Y3@`snVM%Q*H{Y9u-_b?Jn?G|7iqCZIMHrml58e>$UsH0 zM_!P#&%faSq3lxrWY6ke2T|t=-vWqZnQW2`ZeWhgU`7Ys zXah(V#g2Heeq3iGeY<19Wt$tXlaIqr+oE$JPl3|AJ)@eXC`deytqHe5sXt$t!i$IU z2@y_qN8noEHoPhgc%n(KrG4F+$CC zODpGwSN72j@()IweVIF4rsP|$^N>=K==^V%;3CxzM8`Jd4 z0y3(O6Q6}2wOq$HH^-$Cr)cUEeVyz?9uh-X2ESpto1$eK*1}Wgmb5dZvs>Qgqpr!9 z$guYI^}lT%Gr{2QhM=L=)R9o%?+m$(re)pThVyiK_{`#yl-(zBt)cnCi#Gx?=L{B^ z^e3lV;V}cT`}&5$({BHUOmY(DY+sW?F}e?cVDtB?orMzu`A49QC-z)vdMxh_-yq-+ zRsAsF3gXiEAL2;HhPbJ1^M}B`Q#h#~SjsR%=LSBA!*3pumL3ZU6*K=52+^768I@wd zcN7f;S%`cB3d88~13O=%(L{$bbXx@}U@q%#=n0W*MX+~Y!M{Tk9Q+4i zPb5BT^f}Ym>@$u-X+Mers*hICGuHIg`6(k`$|zw`ixT9~b)CZ&P90TE`;u5IS2Nvj z;vPz&SN5ftby1EvTS>D7-kOccf2n~rA{fKYv9ff<#%sf=8|VC5m+F9$z1my-_P_G9 z%lkVj@AyNmOMPwq4iptid2_4toad%TuDEN8oW=1t+>N=WIg{l0ba_DO|wpF66l>`|w-%SR_$ zuFQdv}K4yJ{aGeu*BgiDbVa7o6evSlX zJmM)L!QTG!rmVY)vx9jZy^rp2t&tOfe}Ox+-C0A}8rx1+X0rcDZnZd@E&Q6qr; zkwi$|k(??79#rH0cKb;a{k#R+7eP>{8$?e;g>MxO%|3Ve#6w#g)|y$qnStC=1mzf` zRgh$V=F+(Zt!KB!s#oY@@$4P)x&SAPV@*>`KVB;f&1o*6c0x3q@?(&)Q8m!qL^^EEqh1b+*GeRGV^u7W_B zH$68%zO}zV_b;ET9nDUwA}IdAE|kKe z8TQe0D{-gtpI?&^8WX6c|Jp5RNq^hN&LGHljoct4eVlJ+YR^Ue_<56>kO{l&%m~8a z-`oqO&v(BrE|`J!ye*{URk}M-7T;}3(#m7V4du4?L0elJPiM!!9b0didnTb}STV^v zafsG~v}+z4#T1;DadaU$3K#tm@*9??S{q643|Ag%QWL5Wnrl)*Jd^Q%`5U5;$1mt&mn5+S{*-tU<=1r(Ig&ZJ{@=%@j5X8GT}>k9MDxn$?P8H5Gn%-$l1Sk9)X~7|-}H96!wI zCln3KPZ|qK(Kg)GXnX9QWF|MO@nw8(fJF+Sesbj^%hd>fPxW~gq-2qNyo z!is{>2Iyq;nc3M#Ho6bwg5&oh*>}a1K;E zHWab@>3^S4i3z>7Sy9A6#nwW?i>z%}q4x+r5d$L@Su`}JUILfxT1C-kdZRyE_ znJAh}Q<1#Ts3n!6xcNT%g7o%y3gIpRfD}gjc!Z9i={eu9YBDugl zm`B1x5NMvYd(YaZK+Mqw2bB28e?ZTJ#L3?{QU{ul!m`SQ1SD`A;7%^-M!;rj5mVj_ z*?G)u6a|gEb1~#9JbRIx?#dhs=a4P2Yy6V8xuj@@@g?aBM-O`M8nWo@f;rz#j!*H9FA~BR=c#Hc-O?rMZd+QreMKaVrCjj*8sg7wF&O_b zX^9h8@_Gw|)W*yHIn`Z2xj1$AnXGZ}W^)Hc5x&*)sz*t@yENcKrr7Sm@BdKuD__k2 zKr1UQ7@meM^wNyZx9^q@x(SFISj3b7dx1VAhVVOrOQ}ww7zK4ZPRFm;r~(z$nYFF% zXV8VY$7r*v!34N_`fOE2sMWx(@95~q&WH<)Iyh7X4$me=Go?xnUaOXbA7g41VR!mKb0BKtFN__lj9J z93Qo1r!9iPCbK&@Qe*#c6eT+$ukM3pV8asAtEe_@L9)ZDGG3jR!5Y6ELvxLPX7N?oWySdI`rrP3?JEf` z)c@#*qSAZZh5s?SPA5a>wkzjW6hazDu6CT_F`=^gW(3rDKaQa7_e7D#8{My7{^sU> zMuYIa*E)otGx=c#kSG6l$T(coMlIPh$patxRK$SLl9DvSKRYC#47KX5>Ud62b7N+) zoNtTu6A6^y9oYjK_8tn6hsuUt@a0N*`fk0wD|MySLA$!^y_h`tChu(YZ8o23;#>-r zWsBp~{;&XtDLMTM&D5Y#6a5J2KzeTIfMEHHXRRBgyEyx*UV~4X`3N8rlXEh)6u(b5 ze&Rm9j0-6(1g^EhSyZdPpNL^pxQ5w6!swZW5+P1TDJek**m7Z#8@uNj8`wdXmpBxe zUD~9?z4aZ4Fv|OCYt}5?w@tIVj#A^C8D<&d%Q#{xww;2Y{feA4=L9)W;|Ag*r-o%} zTrBL|W(PfeMigVgGSTO}0qlU`ygMB1D}l83Jdfk8@frO*a$pgjo<^5+70VT5h0vv*U#EC8fAG--M%lsHI zup)z$%}RY%!SD(x{UVyoIP1QTe)o1J9hOfjsS8G3<#3{0MbJn zJX!yR1OFO}xi#SOJn}i26WGUUuc*ftGPE?IU}~`jv7C8a5&HL-^E&eNX6ET1q=P>s zIEsR|E{);8KSw+f#)TkNP}zLjGF#%Cf8a4dF{Fqk2l+Fh`aDzPV69$aAX!tYXo0C zKp99P(yay44_AMK%}CFMJ-4f->)hFVwMH@wQH3M94zt8=@upQ9Bl0Z~194C0oDi)- z?^pV@HwiS;?FW6;rsx$ z?k&U&93XcEkrVJUTRl(J;6_51Jpc9&+S0?kU}KtkwuiesW4{qWYW^e~TWx{z8Pvp} zwP{`$D1PB!DCf7L_QnQxA!LSbCfKt;>ittl*7n2(%u{S34KqR${<;ik0|*oX2HNxf znV|N_+~zWrg-+nw(Km-9JGBZ3$+zCKc63Ru!>rs+wpU>TUSiQ&a1R6`&g^?fwBTi% zs`PSQ0Uk;N4^;`vU^$!#%Y}?3TW^q>xhTnoV9G-tfS0-dj5K5>LX0BaVQ#ttv-f#G z6r+8K-_M?)ssju<$m?G>9f+USJb+N557L?}rCAqO*w9%_S~Yu6=^FUr?}d;*TSs?q z-W;CiFJ#FPTrw97z+l-}%==Ea$d%;>|GUlG7sgMG?}4MOdkds?Z={Ag{v!v*!0x3H z9{7ZM#BaFBRg{UJeiyDEvB9(ZQF+nM!bRb?L&ELmy^)^nH$sMxD-AOVJ3rEG^{+6@ zgT2O!9|JH9A=cN>otxKy;kLzp3u+YJrKsOhH{jZgvy~5mQ@8)uzQZ0x#(|(sxcT8RK5;dMr0r8iFnq~IprM^>Dg$vDLwPqV zTfbAoce$ExT_fnHfp-_fS-;}49T?YbZ9bnLsc(Wirm0lQykx%zjl#4e_zvs0?YRiA z`1mFO0>P=@tGM9G)EpmNWcO*E3qmD+ILZD)bBCsensER-lnh zx_#BUZ<$)@z-=EhV?Qg!MD58{A0UAzUkB9I69bg$n)Y$$99?t|+<7i~xMTc_;GRdZ zhWTE@__y@G$had(i2G>^d8gT5&wt80OBWZNWtZa!g$T=20yyg96MdwD1NMQ;8<%@F zKP9O6AUWGeEnFIj!0OOnjo~I&q)IiAhJa3Vk4s3DJ#tx)U9}&1qQ$=*_Pm(iPE?`V zT`)DQ*nrSf5Pktf$6HO9+h_`Hp`LG1^-^xkGpe{Q zd#s6<%AKR}YrHt!f;C;f?^gZ6XPvhnKUVRPd?aDpwZ*=}c7KrdI*8ug`>p9dllm5r z1BtL-y5{iK@DUVQH(+(IKi@MR0t+)7ON4+j#J5xaf3yyrjQJ8KC;1-LYILM(lnksKz`M>gjk0x^6G|r zH(kpEg44bkjaBP;xI)Ni3)bnflP?E_{D9*-wGKha%*jH1pzQK0bgcuY=u&=jm6)qj@2~k0M@N>v>S>6L8v`*Aq0KKoAZnac4{Y zz(F~@aM)*@x3fe<)dK$h!pj-WFrLaTJHZlKfA7Whg&i2>Ny5wLC9-C*cr# zWUqkn(s{UGF)}$M1`G54Y3&fb{)u5eq~5Wa9*j{&g#U%{KW4_AQ@IzAi_d19KipJtG= zVlIayH%xcRs(;i>jC*^7U;xbaPh^&kr`&W}dayFfgijVOc=HH6aKk5=OO3H?Xa9{? zMU5<5jsIf>WH#}q`{gS8xF$XAZjcH{$ju00JZMUQp*$EoK!Sw8_0a?)xl0>R;!;%9 z6h;yuG&hBCGJt}IUE!_OIB)F{z_KUH z*K7#syv&Q3Px}srskNOXzP=)&dO&tMvNILS*e>7HO85R6kngUm7pLzxtj-B`8GJ_C zTWd@{s9kW+Ky6Kuy3zR;nW4uma7FsZrKAa-2nU%_mU}1H5lBVoAm?`o4GZV2#0i5B zx2Y}Alcj!XaJu3%RM^95uRXxHNOLEn;a4_rrW#>NXfAvQDc(S5)8}1#4-d0$NTKY- zz?GJ${T%r`$U8{l<8!QQ6c~{PImI6CsbcMi6_Zc~=5B|iM)5lYL#kEg9X(4}fqe8i zUGe}zpEns86&0`mX$s50K@kkays>6o{4$VKAQ#MPmkMB5!>?R}C{zs!*g_mEp5!E} zK{o9^pui56+PYOq>Jx;GEvDpy5V+cSH?&GHi%ET79N(c7jS~z^x+$9muoCpxk0SZK z@3Ls!uMx{$B4`0LxR-m)Y~LU+jA_XXkOr>PVX(Y@i_t{B(an~Cslxvtl8NlkFN;ml z^T>Of?vF`;+sL|CP2@y($i_D~F0$dL7vP$@Js4A88mIok6NcWWd2Buz7MzxV-9A`Y z>i1Z1RV$)(WbHyZ)iHu%49gpOH~FKHbQnUqaD-GSy|HKt?B3Mv8&nVPa_-?EQrjDH z9bflSEbpCVzK40sdw`g1pa)IA2S?cmXVik?-y$ZuX>FO}97<#U~ zdxo$^d2whMSA)&WG@TzdV4lS?EcLIgM1)LakrID-Ex}_k_a|3846-ZhuXZkZ_^j$m zY&^s$Aq1A7#Ge>()|Rq9y>n?IeWAN`CWIFT4F{G7J{*wJFp9$jjIQ9GFlhJ-$}MXb zvNNi8hluNNWf<6=f1~jsN;=?NJODEiGT)zWBchF7H4NdM02rT0zC|*+1++<^?ER27 zpNHxb#t$O=YDwKYc>;=n$d+#g2hD?o)C9hxDer(wH2zQ&aUVoMq;VAzPT-h-J&a$P zZTZRIGS7pI&6AOdM--E{@-#-MGLXd38av~FK9E-hEymiH!wwcw1Wy`H z;fEZQa7{IxlKBb9!I1G6)gaNRY5x&{pKrf@7$9?0v2wrR$ipYDMT>GQ+$BbNK6M|f zh$;&NtgI&Deh4@S&a)L!w{);5o!G+$Pq7}hf0tDFSW&vJ3eho=w;4=@!!Qu0Js{t? zzDI&6XpKOf#>@8jE2$Am8PVVIMQH7S!Kbf7OhVNLc=MB!wd_ToVjSk3xvv<}(#S%h zD47#~%I*Zlr<>8gC?W~+8wSS<<|zf|($Xg%Tr5yku5+98NqbBq75x^tGbn?|3+S9X z0=ykG zAM1fPr5*!Tl@so;x6P0uj-PeMoM;n{p?zuU<8TFv3yAc*JCA{sY)%c4G~mS_{#GPr za)k8wEYjx;6DFHt6bW@1$Zt&**yS{rbt)e_u0+bdYU6MFpvW|$;~?Zvf`kFBf%OqL zxNGKj<6x-6#6LR$Nk5xU+%!8p^cDrxk76(;&1Af-3>z>!uiP+acpFKPn*wa;e2`XN zoe0xHZ=`nJ==J07?v*8&&k~uBhu_(-vrqE(s-uqlksI^k@DF0wuI<13LXw+jQ>{sUON(&Mnd5 zaoSPG-Q}xF+v5XjsGcmKZw1c##*gyGMkAU;SggRY@vS;AsnfBBQW_$M~IQD6n znaiaL8H-;M`vbl_M55{YVT+O>;Lqp0YE&Cq5Hds_^WL(vP#yY> z_ZeWcD=MggC}iI(OY!iwyC=~0IKyx2!4Q~XwS#}laZ{(WwLujtBEg?uRK*^mbsu62 z9u?3q0%oS!c_D}ZPhN!JL11#damVNEt<-Kfhw*k`d(E4Ap|fW`hjwRT_hA2uIB19D zafzvTGgiO0Y*f6|Qn+niu>!|_1H># z7krsS4ldqOaNbGy1O1}45bFL-3(`N6zHZ7^|KTd=lOEhnLi^cfUGglGlyZcO6hB#v z?W1eFYSyr~X{1M#$dK;lIV57RFJxJli&6ck|II$tqA6q&0rsZ=1ZJs6dGnW0gxq*{ z6_s3lz(7urrpwkvg1Q5+b&E9Nkt1-~fL-nfH573~Zr0=H)$iy6-#D{t0KrpaX%&=1?2*#2}0JFc5;pebr^2lf)K% zk9r3oGJwer2!An*MG?tidHk0t`ohAQ>}q;LXdq1NMBQfurCFbcS$QnFPX6PNo_X)T z)W|bhZF@>Dm)ltkj~r`o#yA(dm7k8w&bSsG9#?i*eQb&^p;v4sAQwKD`&IPg1pHq| z+9s;CaCHpF!ELUY;n=^Ys^-4KsIaP&N1FeoI=?`?JE<1Z-PK!dHbPSOp31U5j~jD1 z71H8RZ!WlFG`!CSi_4uqdk-ppXhftFE5HA~A|dIT{N&g3mBI8PqqJ9^3vN8*YjDGB zW;}$I4g8y3{Sh9?6D?kRl72X>AQ+f3^HOoLRBpykHmQD;XZht}3zie;dGey;1M$EE zW?^Rp;d2L1xULsBp66zK0e87DxO473Y1w_Nhr8HWx^0i>ZZ{oph6|p7^PgWlVF|*Q z^3r&Lr04C!`e(%}s&AUbd@Yj33^*h@6q=g>TIsgl?BM>_ELwS)NmeF6v#w^dC}qK$ z(oV=Pe9$zUM-u7yP@&a4%3sBVQ7`gp9_ls4oU6g%)bId)fB!TA-a=o~BAh%vO z=|xXU!_3IlTh$EFeSTX=pWYU-$*5deA#mT@*E%fj_}I#Ec)32Jsmiv3KHO(%za|5G zdAro-e9xWcdfS|1;qh5|`y3n5f8->U+xc)m6tMmD@i%;V%U@8RT2{hwuuPs5hKHt*0GU}NOdcN^ z_WNlk=cNX`W}o2&FPU-D+7RMj`r#(ps4e%rF~yy~a{CoW@(}(YBH#ZGQ;G+w2DVPY zp@Y(Q-tobw)A6OL;HC8xwr$707{@WZ>{6n4-|&dlc?G#k*Y?xj*}^@$!y&iB(~ZB6 zt;58P;t)rtUoK*1uh+scku<$+8R#s6u__A#z900yMMSqo`jh$o#|FFS?mH?KrpBa8#-xvTo={U4Nvx`3_Acq&VtRYwQ zz~U5Zc;IuBD9Aq18W*{NFJk<4VGGdlS9r830Hwg4ce^XBBkR3B(3DaOTA1O!R5K@F zyXEYCzWJi_- z_ZD!M8Wm@L%l*4OsKRSfbKp?0M8?WtiaHi@7Rryms6Oug=U&YHoD1S|JUY=*oLN1z z+c8iLC!A_nrsVzS#z8qk>a}97{9`0Ooo~l+NA7+ib;?+lqf!Y;ADe~V?O+(dGiJXT z^q!eljmVL`3!K&ZJ%6SB=%>M&w3j@ba4hgkp2%$h&2PQeP3|xwCeH#-`2_-YnBl-7 zZpy=Rz(q%T>T4j>u?-|@LQfXCRs8vYPOkiZ#Qo%bz!SC;4L^-g(GrAK!9;3o9UIRN zOuhx+;i49CBJ~@JCT<#lQP8xc>f5x55{Vl(q2M1J4afY7 zXT?M*n(ynKY9JZC@RWVc1!(|(B(MX;DJvAeREPT3P;6K<0-6JCBENGVG=|mr8HchJ zmijYrQ46mT8c%0vZ!hukxhJPrMT@4(!q;@p(n(f2vX7_RY#8 zibB{=i#l%!aM&n3mKQ7X6+6=!|5@DzCIx7L>?;+^b~c+{6+%7p0Ovew?XlH0D3bC@ z4I-SN$N=f0<${zvB_VBni`VQ@OVH1BTz*3`1}9a681W-KGDH-n%;I4q(3H)q<)c|& zXiX0jgeg~fWf(Fl;JOb!$(c`G@b&YN_7pOnUJLKz_Pv2)eueA89I$%_Z@DI4(l9P*v49rk!s zDcx7`otb%b#T4p=*c! zaK81HN%04527Z83>-k>wWyIxzUnJC#hg#+u>7101X-nQppl>D|rd$|Y7@YNzFwH$E zof|Z`)Z@`BG) z$$yfVGC9~l0R0=t=U~I}p1nUX@$x%P6$UCHdn!q{M!@MVl9>ce2Lq*Ja3;Z>!?0`L zPi9i{IO&81poG%*lp&0*__vZSA56o*mdKB{eJ4rY><6$CO3H8`OFAW9m@}J~E~Q7@ zqXU(Q0%l-bZj*UFsX1<0CKS{!5KZ_IP8!JGj^N)fMAYQWzY4ygC`eaEF)E9AC9^+!z9d(D}9rrkk!mdSocI;K)vs8-fS>cHxXI5RVc~T$3T)8uo_V zhmmJriys~8JjRnrtx0#X0~_1mNi+zGwwVM@;~#&(|B;- zHsm=G2$V*NEUrb1q0j{gHiK|lUT=n)l!dC_Px+D0v2;>}C&Yf_0(#cGR6pjALGF+& zOhM(N99OdrV?1k|g8dv~!9;P^p4 z`zx1^gg5zw<@!D0`SDPp7J2#V z+C34d9O*Pv4I&!?WzTWuBcR6hvXE2ckQ{As;1)Uu_8PiVYL0A`0k3ws|J5gS0vt-N zfPZEs7mSrlv(jNDJm;D$uvnXTeHie$v><>q*wTaG6P zylagrgtFTfK>yL6Hzs*U*CMGgN1woN^4_slc}kLkJbq(LHJxwbUCdMb%;t?g? z5NtDZ$IAn3Ec_lv&ScdgT2kT{IeHH6#BYpGa%9T_nnwY6IjK2?4WQC4fX)&d}DFJC`%1?Pt@(uYZS%i^i*u8(A7hq_+L^^yQ3 zzU;deB^L#A&UxUD7c&db`F|!zvlv(XkdPX7h8LJLeD(SRkS#!%fUZuX~JJ z0nn!qjr@~(%r9t4KjQVUWgFl;l8*##fYKu?MzJ&e76@b7&yR$vsp^Nq&?x^1m~fo% zjm0AakbbH+vk<4C&j_U-q*M7U@!)1bay1+Mhco*CuwBs4ymSxp8&J3Tu8xN zn?Xrt@uzD6nMuyX?vi15;amnp$tc5YO$4`u;3 z|GBW&(j*1^L;z>Y{Aq6DDWDDLIS;lRK%8MwGXDY$Mo+2i<>&Yp{Hqc>?Xtko{X7Hk zM@oXb(ReTiW*=Gt7mCQ%1>^;awtyO;@;ojeV9R$Nkm2G?iHjdTF6UBgDkO}{1cGU= zx?u#=lvaCC3@K!C;0P{g?JmbD@>--h0x&tfYmodq{I()OR}ONvMOx-Z&8dGx zD{jTEmdXk??}r`y+DeKvI+2tJgmxU{9SeIp8hQ8wtCBp&i26 zC*Si>bVq-b@h?pz9XpxwMAC0s)Lg8|^F4vOm%jGC=3M|E{aMsc`Y)T5^Y4jHSHCLW z!gnltVF)#V{aO@&<(t8)W!wfHb+~Jjk(Sc<8?v;n#!fWO41MD~55e)KfXLB%^5U5L z+SO*A9ehOxJ|{d9w$~y9|CS2BwMhl6m+9;90{dI&D=(W!#`>wCn*YJ-;AnQpGt2C$ zvd%z>?TfA9a{2O{ zSP>7|WBC7QI`eR--Z$Vs=geY;8OA>Lv6L1<_O=;G^lhO+LK#xYUfNX5v6F;WMWIxZ zvPRlwETv5-WGP03BxEUOJMZy(-}evKWfo_Sxz4$t=eeKz{(R0{nKvv0CKJv#z!6MK zebSpkfImH4S0#GC8^afw(B}GbD7dyU)V!RI=t0r1eS&054Io5LVqU!g{SpW&C{tH2 z+aXiaI~(MYq^SE4gGP!KZabhroxiC4v(Mtq=8s?x#icC9b>C!efXESS85s?Z9w61fym2KDIa)ew2E0<>qfh?n9K5(=$OjSM5nP+~2>?#-j6s`j z%R$YlpAlzxS7pOK=Z-2$MX#Fq=VHc)u@aJlf5{~Zi=X_NAcwkb04bzRR(y?pU{CC7 zWFsh~F&YV?wCIg{-Up-PsCs8_OlF(6S0`t4zYSI&R?yPXH%K9!KYp}l8y;}mc{-x| z^p?BWCU_!P!*7fnV!r+g%mg`DieROZ<>6QK(P9K!rjkTG>)@ReDwRAAQ-wz|K$Af)_Po4gh zyrtsi_v_CU>ycpP5U;ZXkgk`TVmj||`jJPAJw_5d*LBEYB&#&$9aPoWx3ucMBDnZB z^@@gm3(;RuhIjWnY$yo&3SDaY$C2$5l*GYm{e7*qSji2dv-yJr19dzupo(q2gu%Kh zzZZQ;h`E7x-x{Hq#liZWhTAHiq*w*WFr4;Q?2;c7Pvz}VOc780DtO4*TKKR*iDP?V z->O|^(rP2Zxkq_x6yY3Gc`PPgzt+yZ76<*g%TzT5Cl}>;$OKeu1grVbr46d!g>#7= zU=0GsdQkrNs@5_JEtBO2R*>vD10EQk+*-0P$S-b`OdR*I+S$QKZz-o6P{UCAxRgB?pgX_3EknEyyweax z^`Hh_f}T3wgbX1^j;2i}VH|!sFH1!x!xI!=vYjqTL_a*q63Stv*4m`-$`}$7j~FRR zZ83%vNVHwJ?>4N&ACk*-mIl!504&TZZ12VnEUbOac~Z87*8n_c8~p% zW}YAfH&9J!AIY>Sv67&Xh!(6M`rB(_JsNutcV2x3t(p53%POtC>J1%z;Or2qt*k>L zqT26>ycLMQ+&4jzEq;SFhMfHz@s-M`!MoxakNN`5fG>a83~KsovH{E;J9VCGp9&YG zFpyi|unL)0h1v+6SE2#aCF2A6xhX*Xo6pIc<#5(3=BKYNN~9!Mx+jVP&XFQHDN{Nj zp<{SkB&bb|X2|352sF%IzSSa6896zilX~fS z^X*xVnF_>vjChlh&3l;Df=0D|W~c!wl#Pj%Xg+`q;?}0fkwQV-X4c19RjW0V8eZUN z;7OZH=MIW2TanqTyR3kvjA8L~$WXbj$ET2%rtS=P8LbQN&X>M&d>rk+FU+kyLKE-w z>rbG6s&iPT2G18){VH+ynz>a0St?e&4z)}9&!9^|wbFXP;XV~m1rGPu(a6dU*<`uJ z*0Hab@%>nCg+iG!!R_H=hwmhMLV*U-yb$pk;;pbxR9o@$n!0km6td@ghpp#74PLpw zm02)lvV~RXbT0k5?e)BN@Lx9P%AXR_W6t=mAI~`n*fL6<1%ciB*>rrVUoh;kgU^+& z5N$RCe*X;3K({pG2YT2oZ^pac7n81kNbTUPV6+7CN`Ip{zSAbVAYw5B;6iUaotW$g z-95)#R}zOFSZ~MCV4Ak2cfkMEu_i^A_TsW`>}dXJ%lQ|+@?yaBgw{0{DLgmq`TV`D zV4x7DJ%g==@H`55N1&}l2h~^24cPVdiH0-i8Hyq3Kz}A;bOL8;%GQS%imsAB!OY&V zfe3Zgyw)L(z9V+g?i_KFX+8|G)Ftx2eI7#vNwijGsYLh(-1y5pnTmTk=}{^^xbwL} z#w*atHwhKY+gi;0s$-S-&RNSqw`}q}z}j=TmiKv_H)O^Q`x*|1*T`mV*9;)x$MilT z7La87E|!aG=lw3h=MQSE4UiRo;LBYX3ZwpJGusX!LtjUoH6gM%XI#m2x3~!gMAG8J z<9$hj`EB6k57m88`46UD7Fe&9HzdopkB*lU8w)!6MnHxU+EmV_?SG7X)uOc%zz%Y! ztM6aVJ7S9-FuIz{f?04ax@6X;1W-Img-fz-L#Yg7r^1_2ZJ-~%s1b)gp?_}xsBrn(V zNT)8AeIVQyrwrW*VXWTT4Qb+@x9qkGJ-(>ZvupQ8D@hS+H|f#zSs3XruLXr1JLsS?&<3n1WRF65|(p)Uk>kAJ4W_d{ewzx4Ew zHoz_yTA#(ymgMoJCx43%9p+86luHKZv)0YsQ`CwV<@ybBf`yHLIX<8zF={ahYucx2 zuzNU*NE@#2w#c*F%xYl38?I~gsd|BBNAwY%RC0negf*K`zi!>XPl?qday%xF$UwE0 zb-dpVzxmt^L5tn6t@Ri~6}d;)ccr#k?PuR)A8>v&#A zdBayuPl>P1u@7jrQL<-?#$7T%jQW#|I{5L^^_#!LZG*XQ`vetZ+_O@7{oG=HwCmuf zWnxpAy38Vmy&p``-n0*A`LMi1zPMb^b=N4Uy&jXPTfb^)^KD``%9%Q?5Dy)mD^Xa? zGCu%p`Y~9D=8HQF*3lLBRzps!kr#v1v9Ckvqfm$^^yU{7=gETL5tm)a^B;WyYx&Pr z_UH(~Y!-!`Cp_^pE2dQwWsHn-t?5H(! z`&7USt#&*l4T4L>&FXqkjtol^u9VK8h>~U4w}V1da6CT{gS(s1@3WTKupxG`UOEMS zl6?kMS6^U1dEFLHKV%-4kEe)!+P#^Am}_}f5+yp;Gpi?uO)_m25ePLR!&y(2dpNn} zlJ}X2_HKsL&o8YZoRZS{Mn-MuD6tbLwTw_$>GgRWHQzVG!&@E!V{P^kXo)G~INUtnZRAy}L{s9lHA;Yu4LAQ$(hi?r2TqgmfOvM&ncD*+<|Fn+vp%)o`UR(^Kyc zxWCK=NA#ny+e)T`uvLQ;Y6DC9g*MCB@sdMUD11nfWF=7$g~gd6TWzOAA$qmUhO^E| zGA{&MMs@Gi`1hN=+*Ufa%i;>cSI?M(B0Z-YgQO2tX;abQ7OXqZ1Ey!pZ=;iq9G;}kiU&%Ha*wYqgLcYgLH7tmwNI?~&vRn)8zN4+h^ zc)NjG1^G>1AveBrK&#Sy_mah(6F+>pe(K$pyV4?ER3BIq7zbrEx@~h=eu1>%7{<1i zES#9LClf)=2q#=q5JZX-JZrLgsPUa7*FIg#o8Yl14RjCnVGA!W^xZ~2^89c5E@-N0 zT`C+-1SR;RxiX1j-YB<)J(6o(2|fhHy|55je~0I`f<>av>-vw7SVQY*P$kXNeC(v@XMJHvy>`50^{y&c)*N2C+jzV@G@fc z9ZVK6nJX9P0~v_t1_L>GCbXt-Q4W10}NrBr+(i^P``)|7@Y zbwrIx87_*(z8)%BIv2)zKpf1D-mEzz>|E^g9iEZqu_|16 zwVbq9a1DWxt#k|M;$GNJG=Bw~)X9_85??(e7Jti7QT_-32-vj2&efQ!Baf9Y>Cxys zM8e436fU2CF+{i;uLAA~_KoBQ|8u_hlodAFXv@J9wg@bdKgXS3_q@I9;|KWO%-*4C zC!jU{Lj~DTdFOCPt}Sj0n-~9@)FLGY>KOq7IR6fG)~gL7?Ca)zL$-` z3&#A5yBNevy7Dr;>9LUfZ{~jkKwZhSKntXj%Sakyw}YRAUGM^hBp3f!*7gC&i2|rI zs+j}uvcBd=jT+JDnaWL4l0PxbaKd2RDIQ4~7u(HyZpUc30liG+TeXIUji`jZ-CVyR zr2g?~^to(=f}?3@W)l7W%vN)Q|p%VIw0h$ zw9ki?0l7Or8&AkSgk4KoiGk+v&X&N#@*x$}gUu9)ql46ag%*EqiP|#g!F8AIN=9M_ z*V7)AS6eXXuk=%{wZW;A=c%d|2kAxD3MOx}y-i|ycWn1uaVVq6>=3y3c}p#6^bXWT zhXW7XgZ8Orq3EwB;)bIbqv~!qm$#_JC>(|#aCIP$^=ptK61u!^wBHuz>X2vLgKqX9 zm8xdZOY=Ixq8Ks@qgN+3p>UT(^#uvJgqoxnLqq*94al&Hj;QRRkAlp|bi;W1KJb^K z-FcjMpmO$vE=Qv4DWP_7 zG{Pk2N`DR8@!cb~Z~vyh0>4ytg92qtA!OJx#DU46O+G^rK^h1d)Mj*ZCgM$(V{8DW z3BQ?dB^8YYx{S5!t;G5E%n~%nfaGKhe)@hH&6S2=^=k2mEmN8`2jMUuTruPTsNj7H>$O9~O@`&YGuv>S! zuXM=dt<)JZ-YIM=wtF^^D}M{>o(xkLD4sHBEw=LlpUzA-#~@hDbSK{3En#9FxXCNn zH*=w2R8CGZb2x`0#`5DiZQy$ohty_L_X}08MQ5-px;VjI5)$ys#1s-OVFk?QhOY=b z+529Snu(EJ;zPtgujH-=^Wu0OoSf7xi2}Y$fjF~?TiP1t7t6Zj4*%DIJ{hF5>Q8z9 z5M48EF>pb*>Os1wD)xQJ3d{zjlM_3@(5q=PeMV`E3nf`zij^#Wq6fbVjBT$upluaz zcb`y3Sf*=vrr=>nk_6Lqa5EDXg)$)@x6rAO2{@BQ-rpz}sRq zaK(FK*QF`Z4oUAPso>iYF+U`!um3$#zeaL!{c`UMv7_M~bHF{%(LQ{ ze<*(~IexVI>>zTepZ8w0GH%C?OqqkI*HoI+xby>}0eVpL=d+GZ^l{z}#a*WsrVl)g z!UWNyD^2p?nCus{{Y@g1{x>L|z?UHz2y^S7gQ#hrs$<%q1a@uiIn(KL3oE>=0hLY6 zRH*Z*7&E3~SyFu}T02mVWv3VQ;6cu3J;=dcE6;#-X#<@RO3X^Q&{QE=KZGrhtMTkz zNSh|F2h4c#)Gi23)IFf%V}P&A_U`>7Xa=I@W}vJB3^xksr>gSe}?$7)v1sOS$~pt&g-QAP>Od-?=H+mkMthBw;1PSk?FKIIb$h zm`6R9_YCcmWoh(G%3#@8p|eFHj-p94_G|ZHs03TUEeanY(j8HfEwn6HXkrOmJ0sT= znDcX&z^+cSI@*5~HEGFyutpK#+?7q^%mA4s`8J3we9rQXurafpxh)tqf?Hf&m1E+` zr7?FA-cULolt{OTyW8-dDt6Jh`$cR+#th zIw3GNh}GOMP{h>JBU#3E-}Oe6cJy$zDz2)`Z9ZU3)D1=W6+tV9SxSV--xm(^@5OP9 z&)9!V>_5vOT4-P;Lq2}jb`M;2a0kZ<+ume^7EPG99~?ceT6?SH#ev=IV{c?NH?c`s zK)~zE8Nld*W{Nl)IbIuy&;P&-Buo}T@2!sD2J5WQ)Uo3OrmVd(PFNdL?|?&~@Tv#+ zkCt_?xiz2blqh*^hFsti`60m5h_`;B(cVKezgwBg!@cmBAMQcrXLId=7UjcU3z1RMHmd!oZicdY=NH_ane9IpowdrhR$V$eC@Z?xlT zM=#7L)9~6#Vt_h7ln64I`L(F&oO3O3>-C{eRcL&Zq$f^-*LAg=jk^E=3T#*~P=5Yo zb`H~o=&+Y)N@uD2v3VKx3V5ZToMa1}M*$VVh*R>cVrVcMt))^#;=1YDj9ldhAYqjG z8fN@OUAf&;UQ5?>{TRuU`w{Uq8z- zN34h=ev!#PKu`XY-L&e{!F|En@%T8x+w68OF!&06(re z(8d{+<|Vb^c}Zye5y7-D^M0nef{n{{)q3rC1u5_u|$RivsPe-TA{pf_sw3?~tXjKo|W;hp7i`8zL$Jk!&V))2FvO82|f2g(5Rar%f#oNR47^DCg zQkz<;pZB2w;n`vk$En2cp!Rj&F&t^0vvIy;kcMx0cFcM{mc@Q=%1e6%sbiaC8%g{# zBvY63xRH6z)3^7`pr=1gJdV~k+r@NhxlER$Sy0{v$SVwfBV&tVG0RsL(US*t#aOWw z)+jFe*2CtXNI;f`O*$S1`y|X{99tJ5fhE%u>#VnpNzM~Vn%q0M)o@!zu9=*8MspwR zPuT|WAXo`{v)@{eIOmPXn}dvGpg)$w7VkQb_#R2Sq1`GK%@LYVC1Yh5Ge24@0OI4u zE8!~wpo}6|YGk@_vCA-?o`@zUv41+Nk4IcZ0%6m3SWwU5X3hT7k$Qyewf9G)ah+Ni zCWcWFAc`mXn&DAjco%@lH_Zu7{;|txO<3GJP z_7v7xy#EuAJR9f(nTO$!Xp9n)MLQ(W1WlvqMASweGFX9Zn;Q;=#uWH&2)Q2Hhk!F` zpr%t>^S%>F$B+y5tOxkwcvr$ZD^Apak8XYR7Mptw(7=`4K9kfmaQHIXxPHU#FkJ0?H{07cDYO=2#mJz*9<2%B)M7F`Rs$apNnfjFeOMN7C?r^V9 zAZU3gxunYC#ds)n8hl1GalFdQK2~+FY)%#{)KN18ub1ndk4YQ@Wy5E##fm#8_g*4y zde8v|cTpQ~y)c_B0(M3Wjia0Uo(E~1%nm`d#%LLW-%V#AwdccRy(=zuZ zk+Z&YhOL14&*Uj&`GBGwk*OpjNg`7*lF*ZP3uwg?bOmvNeIKVPBu!zdN zaVrT=GLVHX%~wZivc9PvktD8SjROpJlq?EM*@8stt0IoziCAYEtn7_RK(^d+d_>+d zTmJAR4|XENvJzLrE&N=E?J<@4+AintY!Z8AxD;C+)We^Pi7s)3#m|mDW1c5Atp1^2 zAZ?mZE>Y`+S#)s2uh++cK#AjGS|^h2g+G7U8N+eRs=pVDcq(hPc|EXS@ha1fz$&q$ z_0vDtR_#_C*Im)0X3-SKC|;fx^eF^2vzk%N<`j25v!tN%_ti_!ecV;~I~q2J&&9p8 zm@$9G)R;0`4&($Wg*2JuEAbDx=o$Gv`ffPsNoMFYmYY;ugbFDbvERh>AA)hcu{MTE zcQC4eVR{1T5a0f&@$<7r4O2eywSJa6%--}>EaGZj5Pw;YpKaXxvadC1ifvjls&;xa zU7}Ta?Ml@+(GiqPFZXmKC|z=ZYC@euMjsX#5uNH^W_`mv3AJLqeX@mpX_a?Q465Kh z!Zf>htES(o4;S@6U9|uAzmlbD{jm_=x$9HJ*N;AmRwKH|=4}nl5eE|XW*c_>Iy~+( zAU)U=7aj4kZ0E+3=Hj2I;q;n`u+Tcwh&6#5S{TET$8PZeFAdC~r!5O)OJ9$oSP3hD z++8$433TZjc>3E%5e|;xm*g$uDV!j8LU`Iv$yR%=`uN+&)1DG0MPz7;Yb%|=I`iLR zdeI8h!FSR`@Ru{OM6C!)RbS3de2NdZV5yIXbVwt?l9@G8FW+>7sr)YV(C?R=xeTVE zRoj&eO4i`$2pW?(A(IEa(8(sQu(O0_a5?7ZMtLMN55i_9u=Y>FA33<$LpS`#=JYHSj&hM#xv#-{MTDJo-70(*yORjE^db5zJq-#uCO28_2QVcxjp3T&9;*#IS3Cn@nc zyi9|ARBSu(2%XV06SO@B{{wP@5l*&23)2o@Nr$GrdXCHRq*;N z7puun@kZElCme9~?zv&2+tfTxZ^ne2==mZZX)Z{?8*ELcGAszmb*%UlAg?u~Y92iQ zIDpkqBF1+876DUhP=PLokhu3Vx=x7&oBZrv4K8NHZESM6<1TYd+0|oWmCn?Ah0bQ# zM4y{KOcD^mf7D0DE7|N#u(0gkGU*yrq3FB5yO?%5Dy8R_@e4m^OSOP)An@lGCp5>B zy^DG|(M>+s$&O>`K5J-A3fKB*wO8#&(D(Uz z3ED~bQ?}!~()4R&0@q*8=Pzb`sZQ1-oL>=chq!|ajk3LhU2mg)vs*E*rcuxe$hW2X z=fK7-$c`*UUg)57O9*Or32`H+YXFsoG|uGHd8$tTF-~Ir1q2D0t3LRnXJb-R7I-7i zCPE+MgVC+-oau-aK@9p_YQW?Ph?CuZw@*u8ZT_Aa9r_;*oUKkAE~WA5g(xPR2`1s+ z3_z|Fm$>LeISEFxkefZF0m|l6y^)O_oabdapC_!pLj|^fI2Hvev>ND>zL7f53t+WN zP2SK2&{Aj&WT5-Rc8+d6lX;I0?(;^&Dk7>D<0;5x%{jwhR3jP72Us)kGpRMvDPyx+#U{lKrZ9@w+UfY2YJcH$%VFJY)D5xT#^9jCCt^!TF!7D)L7*m4 z44zZ95-%8Fu#Gq+vlTD=5GA z+x>*j!5Rmj-j6|Mu*hb)k720rVPIh%L$>{cz^CCBR3u~ZnuJ%4xmi)Nl%G3yIy^A# z8?-HrDjL%D2_%H~+0#hRJBXJ{nv-_9{fHDcXU8Ml3>~U^4VhK|%|ra=NpBP%ImS)2huTjc@~gGE zkM_{ToVH2&e#xfItU2F(i@^y%YDea5*G;b8Ap=yP_0?hpdU$d#w)d%FlU@YMG(ZGc z@;i4Yx<~~a!OitVKa|h&iNhVZD2A7~oF$LQ0|H(NGd$|>&fMIq??CXE=V6eg`lwru z?`IG09@oj$Hv@6)oO;I#VWMZ`d8R%^EIPBQ_Z6G7M~|N_16|vo`fbvj#7?Y-6PAFc zIhpUEXL8z0hmICnvafx7{k4lc}BJ0899w$gIn_>)< zb$2;erJjG;WC4AsBNm)B6Z$9yiA6o-`p4c6P*-boJ}e5IuXd4W-H>}a{O5RX?N1|V z@};UDiwxs&{K>%DWqxE=`;*{PsgLs1yxYp02QfMa(U9qbY`Pvno>QR5y)@SIjasFWetBo?fG(Uker? z2hzlATxo?^?}^h2LfxA1c;CKEEy(UPct5{S$lZs)tL%E2SlginWj^gXxDroAcbLxf z2#i$;{{`?&x>f?3IsDE@od%$K2uafe&s8!M(apqNNY_$?jkwdOOY-QfO)(M=V|KDB zBL%!lTmg>u_0oZhs*LCW(3z^fMiF+u_DKQHzlULcz?-EG1AGm~&{$6B|0`V+rsIfs!I z*1Q`eHgT=KMwB78(3^~jTsa;m<_^ax9=`A&&mx3KdLXK(F9Ou9P?v!MQFI*W%v8(o zVwL-(0*fQKtS8{)beOhCh@bSy`mIBq+teYQ;r|c>BGx2u*NOG%MegGImo(+cB#}QL z%{atX;>C(a=%LzClLHdPm2y1)*~cjJQ#|o+?X1;w9B0j~UE+|FJvu8z5595@ z_3+uETQ6rDm66_vKgpFpzw{$*y(ZT12J5}JCHBH)Y2|H&i?==yyvIbqXI+LJM}auz zRnOlC=eTc=hyI~f**1Rsi7wXQbh5TFxo4+l#>7VXi(86zWY*@dh|_yOGCI7yKC=sW zAd}zV{eL~kYVn6%K0m;RytspG&<+&lS__`vMr%u#Cai1s8GRD=)+DK%K{{C1 z=dt>IzSo(WBhIly?Hk@jJH*c0KFxE}HGRoH{htPUw*Q%1{1BzTi9!YrtqfYD0@NnuDWzoq@q~lBAdF2z`^{Ya zF!7Y%tYdWyHs#va&2^zV)d0moTQB<9oe(azNgpDdjrde*vI@d>v8oqSLJ=|n4C+B) zWD+}iz)qR%eim06!(5%nkGdV>lA*0UC5g4+WrK2W&6cF7=l#|4Mj5N%HGtsTwuj#UQIN zL6D~u{fw2mpvE+#B_G-GN=Jnh(7{Y57j(@Zy=8A84B8Gl@EEDpZe=JRx4|o+=_N(x z+{LDK$H|p+KIfDHOM$9jHVy|Y_JeBDu(hTEKXcQLNNX{u^RHrd|r+^TK#a5VQs5MryjC5_X4s-ZTm^?$=>J2Kh!2x z>J%BL@O|1tgwn@%eI_~|+PSUvm}RC+o;@_rSkd{z80W)l)go;~ZZ4t@)z0fZ^?A+A zb!&f!dRIh%h60!6tbMI}(;YlMP(2`T7Hm#xabn=&b#<>X0}4Hi}{`Vm|{mwj;H# za~tv4_W$uEIMyrNa}kpW6LC>)10dcJRv{ebow<}j&&vUS^}7E`9gFdAX-w)=Fy*|z z#;H*WKc4~*rEyZqz+|4!r*SMq>Mv&)X|s3AgKC0O$jy1V28c}Y_{vgd-)s}i$8&tA z(+{CzIn0J(4+BPH4zR_`8DOPKXqgId?3Sd4fPtr`8P{1yIbo&E+s@*+hdT||+X3;# zeZWGf6ApFSy2})7HQ-EB;I2z*IA)>cuqiZckR6@{-!5kO#;Mb{aJTwF|9wYs;oNKfbNc5gzq9=4z z$SfgjQDY;k^z*dHIB3#YUnGpyDjeh9T;}6UfkcCIQeBp)wMes<@A_jVV0EBg7WdY?FW;ZG7;%^@X zQlX8DE7pwDl3o$QS+jmQ`u)Ok)-&S_I*UhILSyCOQJDv*{v?m2JttG7%y^CU0pl24 zqwb;kpSx?Szt&q%_#lmInxSfJ@_xd}Rf3H8l;dsk z+}fxAUb*j1i?VhMhdtb0Ted70l`hE(8F-wCu-~jW@Zf-a{RqOlm1w)l#UgaBDGe)c zTDn?roDB`IhPAw35k-CAVA`YV|HTfa_e^e77 z|9>W35ljB*goFP!kXn*Beczk&5x+%@2huY>o0HC@h`41-SbM3nF~6BtZ>}FMoXrhG z53gZd%`f0!d7&<#3FsKTs0mzL->UX6RPBy;*rkdCKi5Rqm#@FB+;(Z}TdCxlbb09G{ z<^{9s;GU--#jlB_Z5e%GUqwl; zpt*se?=}nU+XXhrXpOa;X3RZp6snN?yU=*~JNc&3H`TwqO)7Kh2?Q zFiM374FG#b^p*kWNpDHd`+2Eb$bDr-S~oByWrR&dS}^#qMKY=3M-KNZvE`8^JSU6z zh0rU>(+5OeLa)BsPrU9-1-END=`U{ zI2a<<&l~ZrjDlY0vw&aQmkt{A_IHZkX_N{tb7rk(nm&wAgo^KkM6c}lN)t8ur~)Wb zpXG24YB<@OD~E3P9cXTj)U(4%GA_C!i{ltHI~MP*o`UlFK#+Dg29Cg!u+qlYI6qNx z)(vo0)Mvng_1hqt3VG5YrpJG?Ss(qDZ(ZhZ4ECw|vgXI|JN3?H4He`3Q0MOA)nhsN zb>}IP=smfMy8g~K)d=?P9^06Qm5#m~i6kzbSq`T}*dg6L^*1O7K5;6PaQv;%-DNyXE&HDzP?s#P zxx*mxs)e?11>AyNXg(dh70Fbg7mORR=J8zaypKf&s+!EefO8HjzfSiv3#AHXISMjZ z7xtS2ecdccpTaHBp&0|IIEiyjlu92m)u)cN2yB^0mV7{t_ zpI$BgxpX?BLBMpVMoF?xn$QK0j00v6o>VXnma3bMhls!VGM$N%x0Cs~IAC6^%c_`j z4#07L$&w0D!GPI!I71D(tx*IYU7w5|w_k^C|45nE!jXUb*z?v}=QHIQyTElXDACO! z&t1_;TTUSp>-4#|bf#HW5n6xq*Y&K}8&`7^v7Zht5Xc)wSn~^Z*9Di(f;VEd#QOQm zVZ%4_j1Wm&zYf!IH5j~IV?(^>EVjlBu*uz%3((hw(M{#Q8%uuvzK;18&;^`T|IB?f zaX~3jQ{l5fW?leFrs48P2x_CTL+#`*N1IunmnM^-g~1uFn&2&PW^Z_L^}WQe^0{#o zi8q+65J&&WeGQTc-WWFkccJX~$Y@sV0ypY$go)Nv>s@9SB9r0o$I6+8N@tnxSTPjR z8>v(1^~aANlwx;-MjV>boKTB;*8P&y=|LBMFcrR&SYL8%r`2-i2hGFg!mNhSx5t?( zHqv!PU?7&xvKBwmM*!)z5=`%uygxc=?SbwiNmSj*OWKLADb2pBtaD`ef+FLtI!^sD zK`DOv4a6=Kq+0$Np7Pv-H5)ZZQbf!MP^!D7)9=%Va(1KaThE~SK4*0<1&jYJ)2Vc0;lyU&Id9+3?RyrLK&?2n*5Ki8Ru05Dc}syu*KzIJz$JUrZ3+lWq9aCqrym- zorY+?6F-MYEjSFqMyd;ei?lL+%N7tf>+_h9X9cp$pfS@qois@4@^a*WB+{SJOyvBW ztUy0Sj*;G6t3nM><{i2DLvR0@e7$-dbn;5BLs>YU&iJ(doSZ6fvS0x)s)8O?(IN$) zH6Luc=B5{e+ZrsoD8kd6M|^`)@o<`ao+Xi=#-Yh&=pr_YTM8x3{-}V+Mv_zG`Cq0Q1 zV^%24@MIELk&OuoR(8u`eisbKy8fdN5x*lQFV`0S;D%t#)6H4wRS&ibFhDYP%h-o` ze9?eqwQZy^iya15oyMRn>pyAW(>2%0V$XP7=Q5KO*+h^EXPvju70J{`U#J6bBRgdC z$Us`D^ZqNm=(nU^?u^a?#57;(Wg`-O3a-e_*brOV z%^Ya)G0WX`7%5i(-zhU#s@TE+4LTOH-+<^!`jgv+Q!kR(m^1A5dfn2qt2B}mJsFad z6KuaGac<5hv36!Yfxi<|nW}_aTc3JiEXEDj%#pAe%lFI@s*)#E7|zoN!JU1BT6?K^ z3LyN2_P3!g>K!-TC|bWhl_r*$tX`wxoV2~X>!7=Yakb<`mulDP|HeTSPqk>SSp7kt z{X|gNMC^6wEa`(|JV-rDmjty>=)R9Rb1D^_w|AM-*$-bLdDEzT50BEVyt*Q+$p1Oc zPLq5@(k7YUzEtppYK+>xz0D3zA-nWvk5GfVehzhS`4V=(;7rAXMZsPr!$S^VklIa% zgSBjDL7ezVp^a~#L4XL==@IW1HQrat2G=9ku&8sE7lelY>_N=_1JhTl#YZIEF-#ux zLQtYB#rvy{;gS#!@$5Tpx#AFsR3(-ib0FYy4sOM|0+{z|L8|T+Y+o1}QX7=BBzja> z{0nQct6h(K$w|Yg!z$g9ecOQp>@NkX|7LH1j`zuag)pb)W5Iwfvw@sp?g|v75D%(N z%3hsM_>7@6a1kC1TYnt4hTm_{ zH>RamuCH5-g=S|k68E-jHD*uS8U979r~kCGh_)?v)xg?b>`!$txmshmpiRxD?399b zSVS$r-%IAKA<)^^_+4`QqKgsUXxh<}LW2o(64w{Ea5mq+z9>B{vO<|k>v!&OySVho z9Q_={E$+)WlalZiV0H#VWBLm@L#9XzlQof6^(@{~ySRghvE1YyH1-;rA?qLMxMOd4 zcC*LcNa7X7q08zB7GdL|?Sg=5O*pF98|2C8c1>IuKqu02Ykzxb&#aqZ`l2tZ^KXZ& zM?^L0jzrb|xw3x?f){q<-#y`@^{8w5KFFubFd``tu!<9hYTPpKcRA>zh5;(z@y{amHh({Kr!; z%V-BSKdM-cKbal9g2?XXl8H{)Q#_f97z5Pi<%9gC(W4pX7ACy$wwyM_)# z`UhvB#vYXbq2=zpaH~laIVgOb-)kxwrhZg&3}`WZN}9>dEVY>upu$NM6*S*=z?~b; z0*p4)QX?K&c@}qxEXPin1Qymn0rGyvOe46iab&TleLhKXyaJ#}E#QGKHB)5-;PN6l zD-`(o9J>#aU$=PA%}}4Z?ZBRzM3buW@znG(8SJs2I`5FPbq%lnuX=5HW9`C>`HoGI zCeCE+lomD_z-HG;;cV0wlXS~0AYN6EzqqRj{`VpVcf}Zz;qOw-FoN^sBqk=pWVo1_ zje1_^w2ti9YWy9MONQ8S80n z9|m~W!roK0d@shI#0h0`H8LF? zkLvymOw|6_H&Od8--nlgy>s^QgK$yS>G8>Y6fr-zE)F{)hM>K7O8oKQiDwfiMy~DC zU?yNFP;_liw zc>Cq1zG!}(QUQLyt{S2HYsoGhAEnAL;FQTP|Ao3#Ke%^*enN)dpNo~O{@`w3g9K04 z6D4(gz<*a1fhAmX6m(5*Tg2P>oV>Qoz{z6Ctty?3XZ0*bH@IU>Sz3DEW zd5y96W0{>h-DdN7+2MNj(_6*|1%DD>##@gzd`eH;6XStt(brTvGh*FO-e70`5dSeP zt|3=`nX2{fD~NcouJ?)RCVe=9=5Zx

Aqgd8aEQ>_}T);8w>lWz)0EBFV)| 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

{tsjFUrMmWH|wF{vEY{Tvu2k)q| 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 Rc>D+8uPr+^Ki|Yk`ai|T*KYs- literal 0 HcmV?d00001 diff --git a/sources_non_forked/editorconfig-vim/autoload/editorconfig_core/ini.vim b/sources_non_forked/editorconfig-vim/autoload/editorconfig_core/ini.vim index 55d2dee4..c10c0366 100644 --- a/sources_non_forked/editorconfig-vim/autoload/editorconfig_core/ini.vim +++ b/sources_non_forked/editorconfig-vim/autoload/editorconfig_core/ini.vim @@ -190,7 +190,7 @@ function! s:parse(config_filename, target_filename, lines) endif return {'root': l:is_root, 'options': l:options} -endfunction! +endfunction " }}}1 " === Helpers =========================================================== {{{1 diff --git a/sources_non_forked/editorconfig-vim/doc/editorconfig.txt b/sources_non_forked/editorconfig-vim/doc/editorconfig.txt index 0d85a9e3..be234b06 100644 --- a/sources_non_forked/editorconfig-vim/doc/editorconfig.txt +++ b/sources_non_forked/editorconfig-vim/doc/editorconfig.txt @@ -1,36 +1,10 @@ -*editorconfig.txt* +*editorconfig.txt* EditorConfig plugin for vim. File: editorconfig.txt Version: 1.1.1 Maintainer: EditorConfig Team Description: EditorConfig vim plugin -License: - Copyright (c) 2011-2019 EditorConfig Team - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - CONTENTS~ *editorconfig-contents* ---------------------------------------------------------------------------- @@ -39,6 +13,7 @@ CONTENTS~ 3. Commands |editorconfig-commands| 4. Settings |editorconfig-settings| 5. Advanced |editorconfig-advanced| +6. License |editorconfig-license| OVERVIEW~ @@ -230,4 +205,34 @@ And add the following code to your .editorconfig file: Then try to open an Objective-C file, you will find the |filetype| is set to "objc". -vim:ft=help:tw=78 +License~ + *editorconfig-license* +---------------------------------------------------------------------------- + +License: + Copyright (c) 2011-2019 EditorConfig Team + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + +vim:ft=help:tw=78:cc= diff --git a/sources_non_forked/editorconfig-vim/plugin/editorconfig.vim b/sources_non_forked/editorconfig-vim/plugin/editorconfig.vim index 18addefa..76377269 100644 --- a/sources_non_forked/editorconfig-vim/plugin/editorconfig.vim +++ b/sources_non_forked/editorconfig-vim/plugin/editorconfig.vim @@ -101,14 +101,14 @@ function! s:DisableShellSlash(bufnr) " {{{2 let l:shell = getbufvar(a:bufnr, '&shell') if has('win32') && empty(matchstr(l:shell, 'sh')) let s:old_shellslash = getbufvar(a:bufnr, '&shellslash') - setbufvar(a:bufnr, '&shellslash', 0) + call setbufvar(a:bufnr, '&shellslash', 0) endif endfunction " }}}2 function! s:ResetShellSlash(bufnr) " {{{2 " reset shellslash to the user-set value, if any if exists('s:old_shellslash') - setbufvar(a:bufnr, '&shellslash', s:old_shellslash) + call setbufvar(a:bufnr, '&shellslash', s:old_shellslash) unlet! s:old_shellslash endif endfunction " }}}2 @@ -454,7 +454,8 @@ function! s:ApplyConfig(bufnr, config) abort endif endif - if s:IsRuleActive('tab_width', a:config) + " Set tabstop. Skip this for terminal buffers, e.g., :FZF (#224). + if s:IsRuleActive('tab_width', a:config) && bufname(a:bufnr) !~# '^!\w*sh$' let l:tabstop = str2nr(a:config["tab_width"]) call setbufvar(a:bufnr, '&tabstop', l:tabstop) else diff --git a/sources_non_forked/lightline.vim/autoload/lightline.vim b/sources_non_forked/lightline.vim/autoload/lightline.vim index e1f09ca4..73e330c4 100644 --- a/sources_non_forked/lightline.vim/autoload/lightline.vim +++ b/sources_non_forked/lightline.vim/autoload/lightline.vim @@ -26,7 +26,11 @@ function! lightline#update() abort endif endfunction -if exists('*win_gettype') +if exists('*nvim_win_get_config') + function! s:skip() abort + return !nvim_win_get_config(0).focusable + endfunction +elseif exists('*win_gettype') function! s:skip() abort " Vim 8.2.0257 (00f3b4e007), 8.2.0991 (0fe937fd86), 8.2.0996 (40a019f157) return win_gettype() ==# 'popup' || win_gettype() ==# 'autocmd' endfunction diff --git a/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/rosepine_moon.vim b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/rosepine_moon.vim new file mode 100644 index 00000000..08bfc56e --- /dev/null +++ b/sources_non_forked/lightline.vim/autoload/lightline/colorscheme/rosepine_moon.vim @@ -0,0 +1,41 @@ +" ============================================================================= +" Filename: autoload/lightline/colorscheme/rosepine_moon.vim +" Author: lsculv (based on work by sheruost) +" License: MIT License +" Last Change: 2022/11/18 11:30:19. +" ============================================================================= + +" Reference: https://rosepinetheme.com/palette +" Rosé Pine Moon +let s:base = [ '#232136', 233 ] +let s:surface = [ '#2a273f', 234 ] + +let s:overlay = [ '#393552', 235 ] +let s:highlight_m = [ '#44415a', 59 ] +let s:muted = [ '#6e6a86', 60 ] +let s:subtle = [ '#908caa', 103 ] + +let s:iris = [ '#c4a7e7', 182 ] +let s:pine = [ '#3e8fb0', 30 ] +let s:foam = [ '#9ccfd8', 152 ] +let s:rose = [ '#ea9a97', 217 ] +let s:love = [ '#eb6f92', 204 ] + +let s:p = {'normal': {}, 'inactive': {}, 'insert': {}, 'replace': {}, 'visual': {}, 'tabline': {}} +let s:p.normal.left = [ [ s:base, s:pine ], [ s:subtle, s:surface ] ] +let s:p.normal.right = [ [ s:overlay, s:subtle ], [ s:muted, s:overlay ], [ s:highlight_m, s:surface ] ] +let s:p.inactive.right = [ [ s:base, s:surface ], [ s:overlay, s:base ] ] +let s:p.inactive.left = [ [ s:overlay, s:base ], [ s:surface, s:base ] ] +let s:p.insert.left = [ [ s:base, s:foam ], [ s:subtle, s:surface ] ] +let s:p.replace.left = [ [ s:base, s:love ], [ s:subtle, s:surface ] ] +let s:p.visual.left = [ [ s:base, s:iris ], [ s:subtle, s:surface ] ] +let s:p.normal.middle = [ [ s:overlay, s:base ] ] +let s:p.inactive.middle = [ [ s:surface, s:base ] ] +let s:p.tabline.left = [ [ s:subtle, s:base ] ] +let s:p.tabline.tabsel = [ [ s:pine, s:base ] ] +let s:p.tabline.middle = [ [ s:surface, s:base ] ] +let s:p.tabline.right = copy(s:p.normal.right) +let s:p.normal.error = [ [ s:love, s:base ] ] +let s:p.normal.warning = [ [ s:rose, s:surface ] ] + +let g:lightline#colorscheme#rosepine_moon#palette = lightline#colorscheme#flatten(s:p) diff --git a/sources_non_forked/lightline.vim/colorscheme.md b/sources_non_forked/lightline.vim/colorscheme.md index 89a71574..0e7df04d 100644 --- a/sources_non_forked/lightline.vim/colorscheme.md +++ b/sources_non_forked/lightline.vim/colorscheme.md @@ -128,6 +128,10 @@ ![lightline.vim - rosepine_light](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/rosepine_light.png) +### rosepine_moon + +![lightline.vim - rosepine_moon](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/rosepine_moon.png) + ### srcery_drk ![lightline.vim - srcery_drk](https://raw.githubusercontent.com/wiki/itchyny/lightline.vim/image/srcery_drk.png) diff --git a/sources_non_forked/lightline.vim/doc/lightline.txt b/sources_non_forked/lightline.vim/doc/lightline.txt index 1e4e7bd0..ab1e89ea 100644 --- a/sources_non_forked/lightline.vim/doc/lightline.txt +++ b/sources_non_forked/lightline.vim/doc/lightline.txt @@ -3,7 +3,7 @@ Author: itchyny (https://github.com/itchyny) License: MIT License Repository: https://github.com/itchyny/lightline.vim -Last Change: 2022/03/16 00:15:04. +Last Change: 2023/11/21 08:10:00. CONTENTS *lightline-contents* @@ -233,7 +233,7 @@ OPTIONS *lightline-option* Tomorrow_Night_Bright, Tomorrow_Night_Eighties, PaperColor, landscape, one, materia, material, OldHope, nord, deus, simpleblack, srcery_drk, ayu_mirage, ayu_light, ayu_dark, - apprentice, rosepine, and 16color are available. + apprentice, rosepine, rosepine_moon, and 16color are available. The default value is: > let g:lightline.colorscheme = 'default' diff --git a/sources_non_forked/nerdtree/.github/PULL_REQUEST_TEMPLATE.md b/sources_non_forked/nerdtree/.github/PULL_REQUEST_TEMPLATE.md index d2e3b7d4..911f4598 100644 --- a/sources_non_forked/nerdtree/.github/PULL_REQUEST_TEMPLATE.md +++ b/sources_non_forked/nerdtree/.github/PULL_REQUEST_TEMPLATE.md @@ -5,18 +5,3 @@ Closes # +#### 7.1 +- **.0**: + - fix: typo in the docs. (bl4kraven) [#1390](https://github.com/preservim/nerdtree/pull/1390) + - feat: add NERDTreeExplore command. (msibal6) [#1389](https://github.com/preservim/nerdtree/pull/1389) + - fix: mapping description in NERDTree.txt. (roccomao) [#1393](https://github.com/preservim/nerdtree/pull/1393) +#### 7.0 +- **.1**: + - Fix NERDTreeFind to handle directory case sensitivity. (dangibson) [#1387](https://github.com/preservim/nerdtree/pull/1387) + - New Show file lines toggle. (hsnks100) [#1384](https://github.com/preservim/nerdtree/pull/1384) + - Add case sensitivity for refreshing nodes. (rzvxa) [#1382](https://github.com/preservim/nerdtree/pull/1382) + - Clarified the NERDTreeChangePermissions prompt. (rzvxa) [#1381](https://github.com/preservim/nerdtree/pull/1381) + - New reveal functionality for Windows. (rzvxa) [#1366](https://github.com/preservim/nerdtree/pull/1366) + - Fix bracket escaping in path names. (kai-patel) [#1359](https://github.com/preservim/nerdtree/pull/1359) + - Fix Case Sensitive Move Operation. (rzvxa) [#1375](https://github.com/preservim/nerdtree/pull/1375) + - New menu command for changing selected node permissions. (mjkloeckner) [#1348](https://github.com/preservim/nerdtree/pull/1348) + - Fix documentation errors. (BubuDavid) [#1372](https://github.com/preservim/nerdtree/pull/1372) + - Fix typo in nerdtree.vim file. (SandeshPyakurel) [#1380](https://github.com/preservim/nerdtree/pull/1380) +- **.0**: + - Now we warn about invalid files instead of ignoring them silently. (rmonico) [#1365](https://github.com/preservim/nerdtree/pull/1365) + - New g:NERDTreeWinPos options for top and bottom. (rzvxa) [#1363](https://github.com/preservim/nerdtree/pull/1363) + - Fix error in README. (nickspoons) [#1330](https://github.com/preservim/nerdtree/pull/1330) + - Fix typo in the documentation. (chapeupreto) [#1306](https://github.com/preservim/nerdtree/pull/1306) #### 6.10 - **.16**: Fix documentation errors. (lifecrisis) [#1269](https://github.com/preservim/nerdtree/pull/1269) - **.15**: Ensure backward compatible testing of types. (lifecrisis) [#1266](https://github.com/preservim/nerdtree/pull/1266) diff --git a/sources_non_forked/nerdtree/README.markdown b/sources_non_forked/nerdtree/README.markdown index 27aa3148..210ec312 100644 --- a/sources_non_forked/nerdtree/README.markdown +++ b/sources_non_forked/nerdtree/README.markdown @@ -1,9 +1,3 @@ -![Help Wanted](http://blog.ncce.org/wp-content/uploads/2013/12/help-wanted.jpg) - -**NERDTree** is on the lookout for a new maintainer. See [issue #1280](https://github.com/preservim/nerdtree/issues/1280) to submit your name for consideration. - ---- - # The NERDTree [![Vint](https://github.com/preservim/nerdtree/workflows/Vint/badge.svg)](https://github.com/preservim/nerdtree/actions?workflow=Vint) ## Introduction @@ -170,7 +164,7 @@ autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTa ```vim " If another buffer tries to replace NERDTree, put it in the other window, and bring back NERDTree. -autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 | +autocmd BufEnter * if winnr() == winnr('h') && bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 | \ let buf=bufnr() | buffer# | execute "normal! \w" | execute 'buffer'.buf | endif ``` @@ -178,7 +172,7 @@ autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_ ```vim " Open the existing NERDTree on each new tab. -autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif +autocmd BufWinEnter * if &buftype != 'quickfix' && getcmdwintype() == '' | silent NERDTreeMirror | endif ``` or change your NERDTree-launching shortcut key like so: ```vim @@ -194,6 +188,28 @@ let g:NERDTreeDirArrowCollapsible = '?' ``` The preceding values are the non-Windows default arrow symbols. Setting these variables to empty strings will remove the arrows completely and shift the entire tree two character positions to the left. See `:h NERDTreeDirArrowExpandable` for more details. +### How can I show lines of files? + +```vim +let g:NERDTreeFileLines = 1 +``` + +Lines in the file are displayed as shown below. +``` +') command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.ToggleTabTree('') + command! -n=? -complete=dir -bar NERDTreeExplore :call g:NERDTreeCreator.CreateExploreTree('') command! -n=0 -bar NERDTreeClose :call g:NERDTree.Close() command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreateTabTree('') command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror() @@ -685,6 +687,12 @@ function! s:toggleShowHidden() abort call b:NERDTree.ui.toggleShowHidden() endfunction +" FUNCTION: s:toggleShowFileLines() {{{1 +" toggles the display of hidden files +function! s:toggleShowFileLines() abort + call b:NERDTree.ui.toggleShowFileLines() +endfunction + " FUNCTION: s:toggleZoom() {{{1 function! s:toggleZoom() abort call b:NERDTree.ui.toggleZoom() diff --git a/sources_non_forked/nerdtree/doc/NERDTree.txt b/sources_non_forked/nerdtree/doc/NERDTree.txt index 55c25cd1..9b8b6ba8 100644 --- a/sources_non_forked/nerdtree/doc/NERDTree.txt +++ b/sources_non_forked/nerdtree/doc/NERDTree.txt @@ -287,6 +287,7 @@ I........Toggle whether hidden files displayed......................|NERDTree-I| f........Toggle whether the file filters are used...................|NERDTree-f| F........Toggle whether files are displayed.........................|NERDTree-F| B........Toggle whether the bookmark table is displayed.............|NERDTree-B| +L........Toggle whether the number of lines in files is displayed...|NERDTree-L| q........Close the NERDTree window..................................|NERDTree-q| A........Zoom (maximize/minimize) the NERDTree window...............|NERDTree-A| @@ -601,6 +602,14 @@ Applies to: no restrictions. Toggles whether the bookmarks table is displayed. +------------------------------------------------------------------------------ + *NERDTree-L* +Default key: L +Map setting: *NERDTreeMapToggleFileLines* +Applies to: no restrictions. + +Toggles whether the number of lines in files is displayed. + ------------------------------------------------------------------------------ *NERDTree-q* Default key: q @@ -673,6 +682,9 @@ the NERDTree. These settings should be set in your vimrc, using `:let`. |NERDTreeAutoCenterThreshold| Controls the sensitivity of autocentering. +|NERDTreeCaseSensitiveFS| Tells the NERDTree whether or not it is + running in on a case sensitive file system. + |NERDTreeCaseSensitiveSort| Tells the NERDTree whether to be case sensitive or not when sorting nodes. @@ -808,6 +820,26 @@ Default: 3 This setting controls the "sensitivity" of the NERDTree auto centering. See |NERDTreeAutoCenter| for details. +------------------------------------------------------------------------------ + *NERDTreeCaseSensitiveFS* +Values: 0, 1, 2 or 3. +Default: 2. + +If set to 0, the NERDTree will interact with the file system without case +sensitivity. + +If set to 1, the NERDTree will interact with the file system in a case-sensitive +manner. + +If set to 2, the NERDTree assumes its case sensitivity from the OS it is +running on. It Will default to case-insensitive on Windows and macOS +machines and case-sensitive on everything else. Since it's not a foolproof +way of detection, NERDTree won't proceed with any write actions when +the destination is ambiguous. + +Setting it to 3 will perform just like 2, but without suppressing write +actions. + ------------------------------------------------------------------------------ *NERDTreeCaseSensitiveSort* Values: 0 or 1. @@ -1040,6 +1072,20 @@ This setting can be toggled dynamically, per tree, with the |NERDTree-F| mapping and is useful for drastically shrinking the tree when you are navigating to a different part of the tree. +------------------------------------------------------------------------------ + *NERDTreeShowFilesLines* +Values: 0 or 1. +Default: 0. + +If this setting is set to 1 then the NERDTree shows number of lines for each +file. + +This setting can be toggled dynamically, per tree, with the |NERDTree-L| +mapping. +Use one of the follow lines for this setting: > + let NERDTreeShowFilesLines=0 + let NERDTreeShowFilesLines=1 +< ------------------------------------------------------------------------------ *NERDTreeShowHidden* Values: 0 or 1. @@ -1128,7 +1174,7 @@ setting is used. ------------------------------------------------------------------------------ *NERDTreeWinPos* -Values: "left" or "right" +Values: "left", "right", "top" or "bottom" Default: "left". This setting is used to determine where NERDTree window is placed on the @@ -1138,6 +1184,13 @@ This setting makes it possible to use two different explorer plugins simultaneously. For example, you could have the taglist plugin on the left of the window and the NERDTree on the right. +When setting this variable to "top" or "bottom" make sure to also change the +|NERDTreeWinSize| to a more reasonable size. + +For example: +> + let g:NERDTreeWinSize = 15 +< ------------------------------------------------------------------------------ *NERDTreeWinSize* Values: a positive integer. diff --git a/sources_non_forked/nerdtree/lib/nerdtree/creator.vim b/sources_non_forked/nerdtree/lib/nerdtree/creator.vim index b9d45dc9..7e1940b8 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/creator.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/creator.vim @@ -38,6 +38,29 @@ function! s:Creator.BufNamePrefix() return 'NERD_tree_' endfunction +" FUNCTION: s:Creator.CreateExploreTree(dir) {{{1 +function! s:Creator.CreateExploreTree(dir) + try + let path = g:NERDTreePath.New(a:dir) + catch /^NERDTree.InvalidArgumentsError/ + call nerdtree#echo('Invalid directory name:' . a:dir) + return + endtry + + let creator = s:Creator.New() + if getbufinfo('%')[0].changed && !&hidden && !&autowriteall + let l:splitLocation = g:NERDTreeWinPos ==# 'left' || g:NERDTreeWinPos ==# 'top' ? 'topleft ' : 'botright ' + let l:splitDirection = g:NERDTreeWinPos ==# 'left' || g:NERDTreeWinPos ==# 'right' ? 'vertical' : '' + silent! execute l:splitLocation . l:splitDirection . ' new' + else + silent! execute 'enew' + endif + + call creator.createWindowTree(a:dir) + "we want windowTree buffer to disappear after moving to any other buffer + setlocal bufhidden=wipe +endfunction + " FUNCTION: s:Creator.CreateTabTree(a:name) {{{1 function! s:Creator.CreateTabTree(name) let creator = s:Creator.New() @@ -182,16 +205,17 @@ endfunction " Initialize the NERDTree window. Open the window, size it properly, set all " local options, etc. function! s:Creator._createTreeWin() - let l:splitLocation = g:NERDTreeWinPos ==# 'left' ? 'topleft ' : 'botright ' + let l:splitLocation = g:NERDTreeWinPos ==# 'left' || g:NERDTreeWinPos ==# 'top' ? 'topleft ' : 'botright ' + let l:splitDirection = g:NERDTreeWinPos ==# 'left' || g:NERDTreeWinPos ==# 'right' ? 'vertical' : '' let l:splitSize = g:NERDTreeWinSize if !g:NERDTree.ExistsForTab() let t:NERDTreeBufName = self._nextBufferName() - silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' new' + silent! execute l:splitLocation . l:splitDirection . ' ' . l:splitSize . ' new' silent! execute 'edit ' . t:NERDTreeBufName - silent! execute 'vertical resize '. l:splitSize + silent! execute l:splitDirection . ' resize '. l:splitSize else - silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' split' + silent! execute l:splitLocation . l:splitDirection . ' ' . l:splitSize . ' split' silent! execute 'buffer ' . t:NERDTreeBufName endif diff --git a/sources_non_forked/nerdtree/lib/nerdtree/path.vim b/sources_non_forked/nerdtree/lib/nerdtree/path.vim index 997abf37..e0c1d954 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/path.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/path.vim @@ -65,6 +65,25 @@ function! s:Path.cacheDisplayString() abort let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' -> ' . self.symLinkDest endif + if !self.isDirectory && b:NERDTree.ui.getShowFileLines() != 0 + let l:bufname = self.str({'format': 'Edit'}) + let l:lines = 0 + if executable('wc') + let l:lines = split(system('wc -l "'.l:bufname.'"'))[0] + elseif nerdtree#runningWindows() + let l:lines = substitute(system('type "'.l:bufname.'" | find /c /v ""'), '\n', '', 'g') + else + let s:lines = readfile(l:bufname) + let l:lines = 0 + for s:line in s:lines + let l:lines += 1 + if l:lines >= 20000 + break + endif + endfor + endif + let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' ('.l:lines.')' + endif if self.isReadOnly let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' ['.g:NERDTreeGlyphReadOnly.']' endif @@ -530,7 +549,7 @@ function! s:Path.isUnder(parent) return 0 endif for i in range(0, l:that_count-1) - if self.pathSegments[i] !=# a:parent.pathSegments[i] + if !nerdtree#pathEquals(self.pathSegments[i], a:parent.pathSegments[i]) return 0 endif endfor @@ -554,11 +573,7 @@ endfunction " Args: " path: the other path obj to compare this with function! s:Path.equals(path) - if nerdtree#runningWindows() - return self.str() ==? a:path.str() - else - return self.str() ==# a:path.str() - endif + return nerdtree#pathEquals(self.str(), a:path.str()) endfunction " FUNCTION: Path.New(pathStr) {{{1 diff --git a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim index f5f76829..3fb38331 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/tree_dir_node.vim @@ -121,8 +121,14 @@ function! s:TreeDirNode.findNode(path) if a:path.equals(self.path) return self endif - if stridx(a:path.str(), self.path.str(), 0) ==# -1 - return {} + if nerdtree#caseSensitiveFS() + if stridx(a:path.str(), self.path.str(), 0) ==# -1 + return {} + endif + else + if stridx(tolower(a:path.str()), tolower(self.path.str()), 0) ==# -1 + return {} + endif endif if self.path.isDirectory @@ -278,6 +284,10 @@ function! s:TreeDirNode._glob(pattern, all) else let l:pathSpec = escape(fnamemodify(self.path.str({'format': 'Glob'}), ':.'), ',') + if nerdtree#runningWindows() + let l:pathSpec = substitute(l:pathSpec, "\\[\\(.*\\]\\)", "[[]\\1", "g") + endif + " On Windows, the drive letter may be removed by "fnamemodify()". if nerdtree#runningWindows() && l:pathSpec[0] == nerdtree#slash() let l:pathSpec = self.path.drive . l:pathSpec @@ -421,6 +431,7 @@ function! s:TreeDirNode._initChildren(silent) endif let invalidFilesFound = 0 + let invalidFiles = [] for i in files try let path = g:NERDTreePath.New(i) @@ -428,6 +439,7 @@ function! s:TreeDirNode._initChildren(silent) call g:NERDTreePathNotifier.NotifyListeners('init', path, self.getNerdtree(), {}) catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ let invalidFilesFound += 1 + let invalidFiles += [i] endtry endfor @@ -437,7 +449,7 @@ function! s:TreeDirNode._initChildren(silent) call nerdtree#echo('') if invalidFilesFound - call nerdtree#echoWarning(invalidFilesFound . ' file(s) could not be loaded into the NERD tree') + call nerdtree#echoWarning(invalidFilesFound . ' Invalid file(s): ' . join(invalidFiles, ', ')) endif return self.getChildCount() endfunction @@ -564,12 +576,13 @@ function! s:TreeDirNode.refresh() let files = self._glob('*', 1) + self._glob('.*', 0) let newChildNodes = [] let invalidFilesFound = 0 + let invalidFiles = [] for i in files try "create a new path and see if it exists in this nodes children let path = g:NERDTreePath.New(i) let newNode = self.getChild(path) - if newNode !=# {} + if newNode !=# {} && path.str() ==# newNode.path.str() call newNode.refresh() call add(newChildNodes, newNode) @@ -580,7 +593,8 @@ function! s:TreeDirNode.refresh() call add(newChildNodes, newNode) endif catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/ - let invalidFilesFound = 1 + let invalidFilesFound += 1 + let invalidFiles += [i] endtry endfor @@ -589,7 +603,7 @@ function! s:TreeDirNode.refresh() call self.sortChildren() if invalidFilesFound - call nerdtree#echoWarning('some files could not be loaded into the NERD tree') + call nerdtree#echoWarning(invalidFilesFound . ' Invalid file(s): ' . join(invalidFiles, ', ')) endif endif endfunction diff --git a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim index a481ba47..dffdecde 100644 --- a/sources_non_forked/nerdtree/lib/nerdtree/ui.vim +++ b/sources_non_forked/nerdtree/lib/nerdtree/ui.vim @@ -103,6 +103,7 @@ function! s:UI._dumpHelp() let help .= '" '. g:NERDTreeMapToggleFilters .': file filters (' . (self.isIgnoreFilterEnabled() ? 'on' : 'off') . ")\n" let help .= '" '. g:NERDTreeMapToggleFiles .': files (' . (self.getShowFiles() ? 'on' : 'off') . ")\n" let help .= '" '. g:NERDTreeMapToggleBookmarks .': bookmarks (' . (self.getShowBookmarks() ? 'on' : 'off') . ")\n" + let help .= '" '. g:NERDTreeMapToggleFileLines .': files lines (' . (self.getShowFileLines() ? 'on' : 'off') . ")\n" " add quickhelp entries for each custom key map let help .= "\"\n\" ----------------------------\n" @@ -147,6 +148,7 @@ function! s:UI.New(nerdtree) let newObj._showFiles = g:NERDTreeShowFiles let newObj._showHidden = g:NERDTreeShowHidden let newObj._showBookmarks = g:NERDTreeShowBookmarks + let newObj._showFileLines = g:NERDTreeFileLines return newObj endfunction @@ -284,6 +286,11 @@ function! s:UI.getShowHidden() return self._showHidden endfunction +" FUNCTION: s:UI.getShowFileLines() {{{1 +function! s:UI.getShowFileLines() + return self._showFileLines +endfunction + " FUNCTION: s:UI._indentLevelFor(line) {{{1 function! s:UI._indentLevelFor(line) " Replace multi-character DirArrows with a single space so the @@ -512,10 +519,22 @@ function! s:UI.toggleShowHidden() call self.centerView() endfunction +" FUNCTION: s:UI.toggleShowFileLines() {{{1 +" toggles the display of file lines +function! s:UI.toggleShowFileLines() + let self._showFileLines = !self._showFileLines + call self.nerdtree.root.refresh() + call self.renderViewSavingPosition() + call self.centerView() +endfunction + " FUNCTION: s:UI.toggleZoom() {{{1 " zoom (maximize/minimize) the NERDTree window function! s:UI.toggleZoom() if exists('b:NERDTreeZoomed') && b:NERDTreeZoomed + setlocal nowinfixwidth + wincmd = + setlocal winfixwidth call nerdtree#exec('silent vertical resize '. g:NERDTreeWinSize, 1) let b:NERDTreeZoomed = 0 else diff --git a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim index 05bee60d..45126dde 100644 --- a/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim +++ b/sources_non_forked/nerdtree/nerdtree_plugin/fs_menu.vim @@ -23,8 +23,8 @@ call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callbac call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'}) call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'}) -if has('gui_mac') || has('gui_macvim') || has('mac') - call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) +if nerdtree#runningMac() + call NERDTreeAddMenuItem({'text': '(r)eveal the current node in the Finder', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'}) call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'}) call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'}) endif @@ -35,6 +35,7 @@ if executable('xdg-open') endif if nerdtree#runningWindows() + call NERDTreeAddMenuItem({'text': '(r)eveal the current node in the Explorer', 'shortcut': 'r', 'callback': 'NERDTreeRevealInExplorer'}) call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileWindows'}) endif @@ -45,6 +46,7 @@ call NERDTreeAddMenuItem({'text': (has('clipboard')?'copy (p)ath to clipboard':' if has('unix') || has('osx') call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNode'}) + call NERDTreeAddMenuItem({'text': '(C)hange node permissions', 'shortcut':'C', 'callback': 'NERDTreeChangePermissions'}) else call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'}) endif @@ -148,21 +150,41 @@ function! s:renameBuffer(bufNum, newNodeName, isDirectory) let quotedFileName = fnameescape(a:newNodeName) let editStr = g:NERDTreePath.New(a:newNodeName).str({'format': 'Edit'}) endif - " 1. ensure that a new buffer is loaded - call nerdtree#exec('badd ' . quotedFileName, 0) - " 2. ensure that all windows which display the just deleted filename - " display a buffer for a new filename. let s:originalTabNumber = tabpagenr() let s:originalWindowNumber = winnr() - call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . editStr . "' | endif", 0) - call nerdtree#exec('tabnext ' . s:originalTabNumber, 1) - call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1) - " 3. We don't need a previous buffer anymore + let l:tempBufferName = 'NERDTreeRenameTempBuffer' + + " 1. swap deleted file buffer with a temporary one + " this step is needed to compensate for case insensitive filesystems + + " 1.1. create an intermediate(temporary) buffer + call nerdtree#exec('badd ' . l:tempBufferName, 0) + let l:tempBufNum = bufnr(l:tempBufferName) + " 1.2. ensure that all windows which display the just deleted filename + " display the new temp buffer. + call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . l:tempBufferName . "' | endif", 0) + " 1.3. We don't need the deleted file buffer anymore try call nerdtree#exec('confirm bwipeout ' . a:bufNum, 0) catch " This happens when answering Cancel if confirmation is needed. Do nothing. endtry + + " 2. swap temporary buffer with the new filename buffer + " 2.1. create the actual new file buffer + call nerdtree#exec('badd ' . quotedFileName, 0) + + " 2.2. ensure that all windows which display the temporary buffer + " display a buffer for the new filename. + call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . l:tempBufNum . " | exec ':e! " . editStr . "' | endif", 0) + call nerdtree#exec('tabnext ' . s:originalTabNumber, 1) + call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1) + " 2.3. We don't need the temporary buffer anymore + try + call nerdtree#exec('confirm bwipeout ' . l:tempBufNum, 0) + catch + " This happens when answering Cancel if confirmation is needed. Do nothing. + endtry endfunction "FUNCTION: NERDTreeAddNode(){{{1 @@ -205,7 +227,24 @@ function! NERDTreeMoveNode() let prompt = s:inputPrompt('move') let newNodePath = input(prompt, curNode.path.str(), 'file') while filereadable(newNodePath) - call nerdtree#echoWarning('This destination already exists. Try again.') + " allow renames with different casing when g:NERDTreeCaseSensitiveFS + " is set to either 0 or 3 and the 2 paths are equal + if (g:NERDTreeCaseSensitiveFS == 0 || g:NERDTreeCaseSensitiveFS == 3) && + \nerdtree#pathEquals(curNode.path.str(), newNodePath) + break + endif + + call nerdtree#echoWarning('This destination already exists, Try again.') + + " inform the user about the flag if we think it is a false positive + " when g:NERDTreeCaseSensitiveFS is set to 2 + if g:NERDTreeCaseSensitiveFS == 2 && + \!nerdtree#osDefaultCaseSensitiveFS() && + \nerdtree#pathEquals(curNode.path.str(), newNodePath) + echon "\n(If it is a false positive please consider assigning NERDTreeCaseSensitiveFS's value)" + endif + + " prompt the user again let newNodePath = substitute(input(prompt, curNode.path.str(), 'file'), '\(^\s*\|\s*$\)', '', 'g') endwhile @@ -333,6 +372,29 @@ function! NERDTreeListNodeWin32() call nerdtree#echo('node not recognized') endfunction +" FUNCTION: NERDTreeChangePermissions() {{{1 +function! NERDTreeChangePermissions() + let l:node = g:NERDTreeFileNode.GetSelected() + let l:prompt = "change node permissions (chmod args): " + let l:newNodePerm = input(l:prompt) + + if !empty(l:node) + let l:path = l:node.path.str() + let l:cmd = 'chmod ' .. newNodePerm .. ' ' .. path + let l:error = split(system(l:cmd), '\n') + + if !empty(l:error) + call nerdtree#echo(l:error[0]) + endif + + call b:NERDTree.root.refresh() + call b:NERDTree.render() + return + endif + + call nerdtree#echo('node not recognized') +endfunction + " FUNCTION: NERDTreeCopyNode() {{{1 function! NERDTreeCopyNode() let currentNode = g:NERDTreeFileNode.GetSelected() @@ -453,6 +515,17 @@ function! NERDTreeExecuteFileLinux() call system('xdg-open ' . shellescape(l:node.path.str())) endfunction +" FUNCTION: NERDTreeRevealInExplorer() {{{1 +function! NERDTreeRevealInExplorer() + let l:node = g:NERDTreeFileNode.GetSelected() + + if empty(l:node) + return + endif + + call system('cmd.exe /c explorer /select, ' . shellescape(l:node.path.str())) +endfunction + " FUNCTION: NERDTreeExecuteFileWindows() {{{1 function! NERDTreeExecuteFileWindows() let l:node = g:NERDTreeFileNode.GetSelected() diff --git a/sources_non_forked/nerdtree/plugin/NERD_tree.vim b/sources_non_forked/nerdtree/plugin/NERD_tree.vim index ef60cca1..a4276701 100644 --- a/sources_non_forked/nerdtree/plugin/NERD_tree.vim +++ b/sources_non_forked/nerdtree/plugin/NERD_tree.vim @@ -29,6 +29,7 @@ set cpoptions&vim "SECTION: Initialize variable calls and other random constants {{{2 let g:NERDTreeAutoCenter = get(g:, 'NERDTreeAutoCenter', 1) let g:NERDTreeAutoCenterThreshold = get(g:, 'NERDTreeAutoCenterThreshold', 3) +let g:NERDTreeCaseSensitiveFS = get(g:, 'NERDTreeCaseSensitiveFS', 2) let g:NERDTreeCaseSensitiveSort = get(g:, 'NERDTreeCaseSensitiveSort', 0) let g:NERDTreeNaturalSort = get(g:, 'NERDTreeNaturalSort', 0) let g:NERDTreeSortHiddenFirst = get(g:, 'NERDTreeSortHiddenFirst', 1) @@ -52,6 +53,8 @@ let g:NERDTreeShowFiles = get(g:, 'NERDTreeShowFiles', 1 let g:NERDTreeShowHidden = get(g:, 'NERDTreeShowHidden', 0) let g:NERDTreeShowLineNumbers = get(g:, 'NERDTreeShowLineNumbers', 0) let g:NERDTreeSortDirs = get(g:, 'NERDTreeSortDirs', 1) +let g:NERDTreeFileLines = get(g:, 'NERDTreeFileLines', 0) + if !nerdtree#runningWindows() && !nerdtree#runningCygwin() let g:NERDTreeDirArrowExpandable = get(g:, 'NERDTreeDirArrowExpandable', '▸') @@ -128,6 +131,7 @@ let g:NERDTreeMapToggleBookmarks = get(g:, 'NERDTreeMapToggleBookmarks', 'B') let g:NERDTreeMapToggleFiles = get(g:, 'NERDTreeMapToggleFiles', 'F') let g:NERDTreeMapToggleFilters = get(g:, 'NERDTreeMapToggleFilters', 'f') let g:NERDTreeMapToggleHidden = get(g:, 'NERDTreeMapToggleHidden', 'I') +let g:NERDTreeMapToggleFileLines = get(g:, 'NERDTreeMapToggleFileLines', 'L') let g:NERDTreeMapToggleZoom = get(g:, 'NERDTreeMapToggleZoom', 'A') let g:NERDTreeMapUpdir = get(g:, 'NERDTreeMapUpdir', 'u') let g:NERDTreeMapUpdirKeepOpen = get(g:, 'NERDTreeMapUpdirKeepOpen', 'U') @@ -142,6 +146,7 @@ call nerdtree#loadClassFiles() "============================================================ call nerdtree#ui_glue#setupCommands() + " SECTION: Auto commands {{{1 "============================================================ augroup NERDTree diff --git a/sources_non_forked/nerdtree/syntax/nerdtree.vim b/sources_non_forked/nerdtree/syntax/nerdtree.vim index c4197eef..6aae6f28 100644 --- a/sources_non_forked/nerdtree/syntax/nerdtree.vim +++ b/sources_non_forked/nerdtree/syntax/nerdtree.vim @@ -28,7 +28,7 @@ else hi! link NERDTreeNodeDelimiters Ignore endif -"highlighing for directory nodes and file nodes +"highlighting for directory nodes and file nodes syn match NERDTreeDirSlash #/# containedin=NERDTreeDir if g:NERDTreeDirArrowExpandable !=# '' diff --git a/sources_non_forked/nginx.vim/syntax/nginx.vim b/sources_non_forked/nginx.vim/syntax/nginx.vim index 04760e4a..d036c123 100644 --- a/sources_non_forked/nginx.vim/syntax/nginx.vim +++ b/sources_non_forked/nginx.vim/syntax/nginx.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: nginx.conf " Maintainer: Chris Aumann -" Last Change: Jan 25, 2023 +" Last Change: Nov 25, 2023 if exists("b:current_syntax") finish @@ -260,6 +260,7 @@ syn keyword ngxDirective hls_forward_args syn keyword ngxDirective hls_fragment syn keyword ngxDirective hls_mp4_buffer_size syn keyword ngxDirective hls_mp4_max_buffer_size +syn keyword ngxDirective http2 syn keyword ngxDirective http2_chunk_size syn keyword ngxDirective http2_body_preread_size syn keyword ngxDirective http2_idle_timeout @@ -271,6 +272,7 @@ syn keyword ngxDirective http2_push syn keyword ngxDirective http2_push_preload syn keyword ngxDirective http2_recv_buffer_size syn keyword ngxDirective http2_recv_timeout +syn keyword ngxDirective http3 syn keyword ngxDirective http3_hq syn keyword ngxDirective http3_max_concurrent_pushes syn keyword ngxDirective http3_max_concurrent_streams diff --git a/sources_non_forked/typescript-vim/syntax/typescript.vim b/sources_non_forked/typescript-vim/syntax/typescript.vim index 5ae37226..f2738166 100644 --- a/sources_non_forked/typescript-vim/syntax/typescript.vim +++ b/sources_non_forked/typescript-vim/syntax/typescript.vim @@ -224,110 +224,104 @@ syn region foldBraces start=/{/ skip=/\(\/\/.*\)\|\(\/.*\/\)/ end=/}/ transparen " }}} " Define the default highlighting. -" For version 5.7 and earlier: only when not done already by this script -" For version 5.8 and later: only when an item doesn't have highlighting yet -" For version 8.1.1486 and later, and nvim 0.5.0 and later: only when not done already by this script (need to override vim's new typescript support) -if version >= 508 || !exists("did_typescript_syn_inits") - if version < 508 || has('patch-8.1.1486') || has('nvim-0.5.0') - let did_typescript_syn_inits = 1 - command -nargs=+ HiLink hi link - else - command -nargs=+ HiLink hi def link - endif - - "typescript highlighting - HiLink typescriptParameters Operator - HiLink typescriptSuperBlock Operator - - HiLink typescriptEndColons Exception - HiLink typescriptOpSymbols Operator - HiLink typescriptLogicSymbols Boolean - HiLink typescriptBraces Function - HiLink typescriptParens Operator - HiLink typescriptComment Comment - HiLink typescriptLineComment Comment - HiLink typescriptRefComment Include - HiLink typescriptRefS String - HiLink typescriptRefD String - HiLink typescriptDocComment Comment - HiLink typescriptCommentTodo Todo - HiLink typescriptCvsTag Function - HiLink typescriptDocTags Special - HiLink typescriptDocSeeTag Function - HiLink typescriptDocParam Function - HiLink typescriptStringS String - HiLink typescriptStringD String - HiLink typescriptStringB String - HiLink typescriptInterpolationDelimiter Delimiter - HiLink typescriptRegexpString String - HiLink typescriptGlobal Constant - HiLink typescriptCharacter Character - HiLink typescriptPrototype Type - HiLink typescriptConditional Conditional - HiLink typescriptBranch Conditional - HiLink typescriptIdentifier Identifier - HiLink typescriptStorageClass StorageClass - HiLink typescriptRepeat Repeat - HiLink typescriptStatement Statement - HiLink typescriptFuncKeyword Keyword - HiLink typescriptMessage Keyword - HiLink typescriptDeprecated Exception - HiLink typescriptError Error - HiLink typescriptParensError Error - HiLink typescriptParensErrA Error - HiLink typescriptParensErrB Error - HiLink typescriptParensErrC Error - HiLink typescriptReserved Keyword - HiLink typescriptOperator Operator - HiLink typescriptType Type - HiLink typescriptNull Type - HiLink typescriptNumber Number - HiLink typescriptFloat Number - HiLink typescriptDecorators Special - HiLink typescriptBoolean Boolean - HiLink typescriptLabel Label - HiLink typescriptSpecial Special - HiLink typescriptSource Special - HiLink typescriptGlobalObjects Special - HiLink typescriptGlobalNodeObjects Special - HiLink typescriptExceptions Special - - HiLink typescriptDomErrNo Constant - HiLink typescriptDomNodeConsts Constant - HiLink typescriptDomElemAttrs Label - HiLink typescriptDomElemFuncs PreProc - - HiLink typescriptHtmlElemAttrs Label - HiLink typescriptHtmlElemFuncs PreProc - - HiLink typescriptCssStyles Label - - " Ajax Highlighting - HiLink typescriptBrowserObjects Constant - - HiLink typescriptDOMObjects Constant - HiLink typescriptDOMMethods Function - HiLink typescriptDOMProperties Special - - HiLink typescriptAjaxObjects Constant - HiLink typescriptAjaxMethods Function - HiLink typescriptAjaxProperties Special - - HiLink typescriptFuncDef Title - HiLink typescriptFuncArg Special - HiLink typescriptFuncComma Operator - - HiLink typescriptHtmlEvents Special - HiLink typescriptHtmlElemProperties Special - - HiLink typescriptEventListenerKeywords Keyword - - HiLink typescriptNumber Number - HiLink typescriptPropietaryObjects Constant - - delcommand HiLink +if version < 508 + command -nargs=+ HiLink hi link +else + command -nargs=+ HiLink hi def link endif +"typescript highlighting +HiLink typescriptParameters Operator +HiLink typescriptSuperBlock Operator + +HiLink typescriptEndColons Exception +HiLink typescriptOpSymbols Operator +HiLink typescriptLogicSymbols Boolean +HiLink typescriptBraces Function +HiLink typescriptParens Operator +HiLink typescriptComment Comment +HiLink typescriptLineComment Comment +HiLink typescriptRefComment Include +HiLink typescriptRefS String +HiLink typescriptRefD String +HiLink typescriptDocComment Comment +HiLink typescriptCommentTodo Todo +HiLink typescriptCvsTag Function +HiLink typescriptDocTags Special +HiLink typescriptDocSeeTag Function +HiLink typescriptDocParam Function +HiLink typescriptStringS String +HiLink typescriptStringD String +HiLink typescriptStringB String +HiLink typescriptInterpolationDelimiter Delimiter +HiLink typescriptRegexpString String +HiLink typescriptGlobal Constant +HiLink typescriptCharacter Character +HiLink typescriptPrototype Type +HiLink typescriptConditional Conditional +HiLink typescriptBranch Conditional +HiLink typescriptIdentifier Identifier +HiLink typescriptStorageClass StorageClass +HiLink typescriptRepeat Repeat +HiLink typescriptStatement Statement +HiLink typescriptFuncKeyword Keyword +HiLink typescriptMessage Keyword +HiLink typescriptDeprecated Exception +HiLink typescriptError Error +HiLink typescriptParensError Error +HiLink typescriptParensErrA Error +HiLink typescriptParensErrB Error +HiLink typescriptParensErrC Error +HiLink typescriptReserved Keyword +HiLink typescriptOperator Operator +HiLink typescriptType Type +HiLink typescriptNull Type +HiLink typescriptNumber Number +HiLink typescriptFloat Number +HiLink typescriptDecorators Special +HiLink typescriptBoolean Boolean +HiLink typescriptLabel Label +HiLink typescriptSpecial Special +HiLink typescriptSource Special +HiLink typescriptGlobalObjects Special +HiLink typescriptGlobalNodeObjects Special +HiLink typescriptExceptions Special + +HiLink typescriptDomErrNo Constant +HiLink typescriptDomNodeConsts Constant +HiLink typescriptDomElemAttrs Label +HiLink typescriptDomElemFuncs PreProc + +HiLink typescriptHtmlElemAttrs Label +HiLink typescriptHtmlElemFuncs PreProc + +HiLink typescriptCssStyles Label + +" Ajax Highlighting +HiLink typescriptBrowserObjects Constant + +HiLink typescriptDOMObjects Constant +HiLink typescriptDOMMethods Function +HiLink typescriptDOMProperties Special + +HiLink typescriptAjaxObjects Constant +HiLink typescriptAjaxMethods Function +HiLink typescriptAjaxProperties Special + +HiLink typescriptFuncDef Title +HiLink typescriptFuncArg Special +HiLink typescriptFuncComma Operator + +HiLink typescriptHtmlEvents Special +HiLink typescriptHtmlElemProperties Special + +HiLink typescriptEventListenerKeywords Keyword + +HiLink typescriptNumber Number +HiLink typescriptPropietaryObjects Constant + +delcommand HiLink + " Define the htmltypescript for HTML syntax html.vim "syntax clear htmltypescript "syntax clear typescriptExpression diff --git a/sources_non_forked/vim-abolish/plugin/abolish.vim b/sources_non_forked/vim-abolish/plugin/abolish.vim index 1e9fb799..93d9adcd 100644 --- a/sources_non_forked/vim-abolish/plugin/abolish.vim +++ b/sources_non_forked/vim-abolish/plugin/abolish.vim @@ -377,7 +377,7 @@ function! s:find_command(cmd,flags,word) " beginning of the line, and we can't use position flags (e.g., /foo/e). " If we use :norm /pattern, we leave ourselves vulnerable to "press enter" " prompts (even with :silent). - let cmd = (a:cmd =~ '[?!]' ? '?' : '/') + let cmd = (a:cmd =~ '[?!]$' ? '?' : '/') let @/ = s:pattern(dict,opts.boundaries) if opts.flags == "" || !search(@/,'n') return "norm! ".cmd."\" diff --git a/sources_non_forked/vim-flake8/README.mdown b/sources_non_forked/vim-flake8/README.md similarity index 100% rename from sources_non_forked/vim-flake8/README.mdown rename to sources_non_forked/vim-flake8/README.md diff --git a/sources_non_forked/vim-flake8/autoload/flake8.vim b/sources_non_forked/vim-flake8/autoload/flake8.vim index c407b9be..921e0fdb 100644 --- a/sources_non_forked/vim-flake8/autoload/flake8.vim +++ b/sources_non_forked/vim-flake8/autoload/flake8.vim @@ -24,6 +24,14 @@ function! flake8#Flake8ShowError() call s:ShowErrorMessage() endfunction +function! flake8#Flake8NextError() + call s:JumpNextError() +endfunction + +function! flake8#Flake8PrevError() + call s:JumpPrevError() +endfunction + "" }}} "" ** internal ** {{{ @@ -199,7 +207,6 @@ function! s:Flake8() " {{{ endfunction " }}} - "" markers function! s:PlaceMarkers(results) " {{{ " in gutter? @@ -292,6 +299,57 @@ function! s:ShowErrorMessage() " {{{ echo let b:showing_message = 0 endif +endfunction " }}} + +function! s:JumpNextError() " {{{ + let l:cursorLine = getpos(".")[1] + if !exists('s:resultDict') + return + endif + + " Convert list of strings to ints + let l:lineList = [] + for line in keys(s:resultDict) + call insert(l:lineList, line+0) + endfor + + let l:sortedLineList = sort(l:lineList, 'n') + for line in l:sortedLineList + let l:line_int = line + 0 + if line > l:cursorLine + call cursor(line, 1) + call s:ShowErrorMessage() + return + endif + endfor + call cursor(l:cursorLine, 1) + echo "Reached last error!" + +endfunction " }}} + +function! s:JumpPrevError() " {{{ + let l:cursorLine = getpos(".")[1] + if !exists('s:resultDict') + return + endif + + " Convert list of strings to ints + let l:lineList = [] + for line in keys(s:resultDict) + call insert(l:lineList, line+0) + endfor + + let l:sortedLineList = reverse(sort(l:lineList, 'n')) + for line in l:sortedLineList + let l:line_int = line + 0 + if line < l:cursorLine + call cursor(line, 1) + call s:ShowErrorMessage() + return + endif + endfor + call cursor(l:cursorLine, 1) + echo "Reached first error!" endfunction " }}} diff --git a/sources_non_forked/vim-fugitive/autoload/fugitive.vim b/sources_non_forked/vim-fugitive/autoload/fugitive.vim index 6e5095fc..19d2d08c 100644 --- a/sources_non_forked/vim-fugitive/autoload/fugitive.vim +++ b/sources_non_forked/vim-fugitive/autoload/fugitive.vim @@ -116,16 +116,15 @@ function! s:VersionCheck() abort elseif !fugitive#GitVersion(1, 8, 5) return 'return ' . string('echoerr "fugitive: Git 1.8.5 or newer required"') else + if exists('b:git_dir') && empty(b:git_dir) + unlet! b:git_dir + endif return '' endif endfunction let s:worktree_error = "core.worktree is required when using an external Git dir" function! s:DirCheck(...) abort - let vcheck = s:VersionCheck() - if !empty(vcheck) - return vcheck - endif let dir = call('FugitiveGitDir', a:000) if !empty(dir) && FugitiveWorkTree(dir, 1) is# 0 return 'return ' . string('echoerr "fugitive: ' . s:worktree_error . '"') @@ -349,7 +348,6 @@ function! fugitive#Wait(job_or_jobs, ...) abort sleep 1m endif else - let sleep = has('patch-8.2.2366') ? 'sleep! 1m' : 'sleep 1m' for job in jobs if ch_status(job) ==# 'open' call ch_close_in(job) @@ -362,7 +360,7 @@ function! fugitive#Wait(job_or_jobs, ...) abort break endif let i += 1 - exe sleep + sleep 1m endwhile endfor endif @@ -400,8 +398,8 @@ function! s:JobExecute(argv, jopts, stdin, callback, ...) abort let dict.job = jobstart(a:argv, a:jopts) if !empty(a:stdin) call chansend(dict.job, a:stdin) - call chanclose(dict.job, 'stdin') endif + call chanclose(dict.job, 'stdin') catch /^Vim\%((\a\+)\)\=:E475:/ let [dict.exit_status, dict.stdout, dict.stderr] = [122, [''], ['']] endtry @@ -889,9 +887,8 @@ function! s:SystemList(cmd) abort \ 'exit_cb': { j, code -> add(exit, code) }} let job = job_start(a:cmd, jopts) call ch_close_in(job) - let sleep = has('patch-8.2.2366') ? 'sleep! 1m' : 'sleep 1m' while ch_status(job) !~# '^closed$\|^fail$' || job_status(job) ==# 'run' - exe sleep + sleep 1m endwhile return [lines, exit[0]] else @@ -959,12 +956,6 @@ function! s:LinesError(...) abort return [r.exit_status ? [] : r.stdout, r.exit_status] endfunction -function! s:NullError(cmd) abort - let r = fugitive#Execute(a:cmd) - let list = r.exit_status ? [] : split(tr(join(r.stdout, "\1"), "\1\n", "\n\1"), "\1", 1)[0:-2] - return [list, s:JoinChomp(r.stderr), r.exit_status] -endfunction - function! s:TreeChomp(...) abort let r = call('fugitive#Execute', a:000) if !r.exit_status @@ -1006,7 +997,7 @@ function! s:StdoutToFile(out, cmd, ...) abort endif call ch_close_in(job) while ch_status(job) !~# '^closed$\|^fail$' || job_status(job) ==# 'run' - exe has('patch-8.2.2366') ? 'sleep! 1m' : 'sleep 1m' + sleep 1m endwhile return [join(readfile(err, 'b'), "\n"), exit[0]] finally @@ -1576,11 +1567,15 @@ function! s:QuickfixStream(nr, event, title, cmd, first, mods, callback, ...) ab call s:QuickfixSet(a:nr, buffer, 'a') exe s:DoAutocmd('QuickFixCmdPost ' . event) - if a:first && len(s:QuickfixGet(a:nr)) - return (a:nr < 0 ? 'cfirst' : 'lfirst') - else - return 'exe' + if a:first + let list = s:QuickfixGet(a:nr) + for index in range(len(list)) + if list[index].valid + return (index+1) . (a:nr < 0 ? 'cfirst' : 'lfirst') + endif + endfor endif + return 'exe' endfunction function! fugitive#Cwindow() abort @@ -2626,8 +2621,8 @@ function! s:AddSection(label, lines, ...) abort call append(line('$'), ['', a:label . (len(note) ? ': ' . note : ' (' . len(a:lines) . ')')] + s:Format(a:lines)) endfunction -function! s:QueryLog(refspec, limit) abort - let [log, exec_error] = s:LinesError(['log', '-n', '' . a:limit, '--pretty=format:%h%x09%s'] + a:refspec + ['--']) +function! s:QueryLog(refspec, limit, dir) abort + let [log, exec_error] = s:LinesError(['log', '-n', '' . a:limit, '--pretty=format:%h%x09%s'] + a:refspec + ['--'], a:dir) call map(log, 'split(v:val, "\t", 1)') call map(log, '{"type": "Log", "commit": v:val[0], "subject": join(v:val[1 : -1], "\t")}') let result = {'error': exec_error ? 1 : 0, 'overflow': 0, 'entries': log} @@ -2638,11 +2633,11 @@ function! s:QueryLog(refspec, limit) abort return result endfunction -function! s:QueryLogRange(old, new) abort +function! s:QueryLogRange(old, new, dir) abort if empty(a:old) || empty(a:new) return {'error': 2, 'overflow': 0, 'entries': []} endif - return s:QueryLog([a:old . '..' . a:new], 256) + return s:QueryLog([a:old . '..' . a:new], 256, a:dir) endfunction function! s:AddLogSection(label, log) abort @@ -2667,16 +2662,15 @@ let s:rebase_abbrevs = { \ 'b': 'break', \ } -function! fugitive#BufReadStatus(...) abort +function! fugitive#BufReadStatus(cmdbang) abort let amatch = s:Slash(expand('%:p')) unlet! b:fugitive_reltime b:fugitive_type try - doautocmd BufReadPre let config = fugitive#Config() - let cmd = [s:Dir()] - setlocal noreadonly modifiable nomodeline buftype=nowrite - if amatch !~# '^fugitive:' && s:cpath($GIT_INDEX_FILE !=# '' ? resolve(s:GitIndexFileEnv()) : fugitive#Find('.git/index')) !=# s:cpath(amatch) + let dir = s:Dir() + let cmd = [dir] + if amatch !~# '^fugitive:' && s:cpath($GIT_INDEX_FILE !=# '' ? resolve(s:GitIndexFileEnv()) : fugitive#Find('.git/index', dir)) !=# s:cpath(amatch) let cmd += [{'env': {'GIT_INDEX_FILE': FugitiveGitPath(amatch)}}] endif @@ -2684,20 +2678,29 @@ function! fugitive#BufReadStatus(...) abort call add(cmd, '--no-optional-locks') endif + let tree = s:Tree(dir) + if !empty(tree) + let status_cmd = cmd + ['status', '-bz'] + call add(status_cmd, fugitive#GitVersion(2, 11) ? '--porcelain=v2' : '--porcelain') + let status = fugitive#Execute(status_cmd, function('len')) + endif + + doautocmd BufReadPre + setlocal noreadonly modifiable nomodeline buftype=nowrite let b:fugitive_files = {'Staged': {}, 'Unstaged': {}} + let [staged, unstaged, untracked] = [[], [], []] let props = {} - if empty(s:Tree()) - let branch = FugitiveHead(0) - let head = FugitiveHead(11) - elseif fugitive#GitVersion(2, 11) - let cmd += ['status', '--porcelain=v2', '-bz'] - let [output, message, exec_error] = s:NullError(cmd) - if exec_error - throw 'fugitive: ' . message - endif + if !exists('status') + let branch = FugitiveHead(0, dir) + let head = FugitiveHead(11, dir) + elseif fugitive#Wait(status).exit_status + throw 'fugitive: ' . s:JoinChomp(status.stderr) + + elseif status.args[-1] ==# '--porcelain=v2' + let output = split(tr(join(status.stdout, "\1"), "\1\n", "\n\1"), "\1", 1)[0:-2] let i = 0 while i < len(output) let line = output[i] @@ -2737,15 +2740,11 @@ function! fugitive#BufReadStatus(...) abort elseif has_key(props, 'branch.oid') let head = props['branch.oid'][0:10] else - let head = FugitiveHead(11) - endif - else " git < 2.11 - let cmd += ['status', '--porcelain', '-bz'] - let [output, message, exec_error] = s:NullError(cmd) - if exec_error - throw 'fugitive: ' . message + let head = FugitiveHead(11, dir) endif + else + let output = split(tr(join(status.stdout, "\1"), "\1\n", "\n\1"), "\1", 1)[0:-2] while get(output, 0, '') =~# '^\l\+:' call remove(output, 0) endwhile @@ -2754,7 +2753,7 @@ function! fugitive#BufReadStatus(...) abort let head = split(head, '\.\.\.')[0] let branch = head elseif head ==# 'HEAD' || empty(head) - let head = FugitiveHead(11) + let head = FugitiveHead(11, dir) let branch = '' else let branch = head @@ -2786,14 +2785,13 @@ function! fugitive#BufReadStatus(...) abort endwhile endif + let diff_cmd = cmd + ['-c', 'diff.suppressBlankEmpty=false', '-c', 'core.quotePath=false', 'diff', '--color=never', '--no-ext-diff', '--no-prefix'] let diff = {'Staged': {'stdout': ['']}, 'Unstaged': {'stdout': ['']}} if len(staged) - let diff['Staged'] = - \ fugitive#Execute(['-c', 'diff.suppressBlankEmpty=false', '-c', 'core.quotePath=false', 'diff', '--color=never', '--no-ext-diff', '--no-prefix', '--cached'], function('len')) + let diff['Staged'] = fugitive#Execute(diff_cmd + ['--cached'], function('len')) endif if len(unstaged) - let diff['Unstaged'] = - \ fugitive#Execute(['-c', 'diff.suppressBlankEmpty=false', '-c', 'core.quotePath=false', 'diff', '--color=never', '--no-ext-diff', '--no-prefix'], function('len')) + let diff['Unstaged'] = fugitive#Execute(diff_cmd + ['--'] + map(copy(unstaged), 'tree . "/" . v:val.relative[0]'), function('len')) endif for dict in staged @@ -2850,10 +2848,10 @@ function! fugitive#BufReadStatus(...) abort let push_short = substitute(push_ref, '^refs/\w\+/', '', '') let pull_short = substitute(pull_ref, '^refs/\w\+/', '', '') - if isdirectory(fugitive#Find('.git/rebase-merge/')) - let rebasing_dir = fugitive#Find('.git/rebase-merge/') - elseif isdirectory(fugitive#Find('.git/rebase-apply/')) - let rebasing_dir = fugitive#Find('.git/rebase-apply/') + if isdirectory(fugitive#Find('.git/rebase-merge/', dir)) + let rebasing_dir = fugitive#Find('.git/rebase-merge/', dir) + elseif isdirectory(fugitive#Find('.git/rebase-apply/', dir)) + let rebasing_dir = fugitive#Find('.git/rebase-apply/', dir) endif let rebasing = [] @@ -2885,25 +2883,25 @@ function! fugitive#BufReadStatus(...) abort endif let sequencing = [] - if filereadable(fugitive#Find('.git/sequencer/todo')) - for line in reverse(readfile(fugitive#Find('.git/sequencer/todo'))) + if filereadable(fugitive#Find('.git/sequencer/todo', dir)) + for line in reverse(readfile(fugitive#Find('.git/sequencer/todo', dir))) let match = matchlist(line, '^\(\l\+\)\s\+\(\x\{4,\}\)\s\+\(.*\)') if len(match) && match[1] !~# 'exec\|merge\|label' call add(sequencing, {'type': 'Rebase', 'status': get(s:rebase_abbrevs, match[1], match[1]), 'commit': match[2], 'subject': match[3]}) endif endfor - elseif filereadable(fugitive#Find('.git/MERGE_MSG')) - if filereadable(fugitive#Find('.git/CHERRY_PICK_HEAD')) - let pick_head = fugitive#Execute(['rev-parse', '--short', 'CHERRY_PICK_HEAD', '--']).stdout[0] - call add(sequencing, {'type': 'Rebase', 'status': 'pick', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG')), 0, '')}) - elseif filereadable(fugitive#Find('.git/REVERT_HEAD')) - let pick_head = fugitive#Execute(['rev-parse', '--short', 'REVERT_HEAD', '--']).stdout[0] - call add(sequencing, {'type': 'Rebase', 'status': 'revert', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG')), 0, '')}) + elseif filereadable(fugitive#Find('.git/MERGE_MSG', dir)) + if filereadable(fugitive#Find('.git/CHERRY_PICK_HEAD', dir)) + let pick_head = fugitive#Execute(['rev-parse', '--short', 'CHERRY_PICK_HEAD', '--'], dir).stdout[0] + call add(sequencing, {'type': 'Rebase', 'status': 'pick', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')}) + elseif filereadable(fugitive#Find('.git/REVERT_HEAD', dir)) + let pick_head = fugitive#Execute(['rev-parse', '--short', 'REVERT_HEAD', '--'], dir).stdout[0] + call add(sequencing, {'type': 'Rebase', 'status': 'revert', 'commit': pick_head, 'subject': get(readfile(fugitive#Find('.git/MERGE_MSG', dir)), 0, '')}) endif endif let b:fugitive_diff = diff - if get(a:, 1, v:cmdbang) + if a:cmdbang unlet! b:fugitive_expanded endif let expanded = get(b:, 'fugitive_expanded', {'Staged': {}, 'Unstaged': {}}) @@ -2916,7 +2914,7 @@ function! fugitive#BufReadStatus(...) abort if push_ref !=# pull_ref call s:AddHeader('Push', push_short) endif - if empty(s:Tree()) + if empty(tree) if get(fugitive#ConfigGetAll('core.bare', config), 0, '') !~# '^\%(false\|no|off\|0\|\)$' call s:AddHeader('Bare', 'yes') else @@ -2936,11 +2934,11 @@ function! fugitive#BufReadStatus(...) abort let staged_end = len(staged) ? line('$') : 0 let unique_push_ref = push_ref ==# pull_ref ? '' : push_ref - let unpushed_push = s:QueryLogRange(unique_push_ref, head) + let unpushed_push = s:QueryLogRange(unique_push_ref, head, dir) if get(props, 'branch.ab') =~# '^+0 ' let unpushed_pull = {'error': 0, 'overflow': 0, 'entries': []} else - let unpushed_pull = s:QueryLogRange(pull_ref, head) + let unpushed_pull = s:QueryLogRange(pull_ref, head, dir) endif " If the push ref is defined but nowhere to be found at the remote, " pretend it's the same as the pull ref @@ -2951,11 +2949,11 @@ function! fugitive#BufReadStatus(...) abort call s:AddLogSection('Unpushed to ' . pull_short, unpushed_pull) if unpushed_push.error && unpushed_pull.error && empty(rebasing) && \ !empty(push_remote . fetch_remote) - call s:AddLogSection('Unpushed to *', s:QueryLog([head, '--not', '--remotes'], 256)) + call s:AddLogSection('Unpushed to *', s:QueryLog([head, '--not', '--remotes'], 256, dir)) endif - call s:AddLogSection('Unpulled from ' . push_short, s:QueryLogRange(head, unique_push_ref)) + call s:AddLogSection('Unpulled from ' . push_short, s:QueryLogRange(head, unique_push_ref, dir)) if len(pull_ref) && get(props, 'branch.ab') !~# ' -0$' - call s:AddLogSection('Unpulled from ' . pull_short, s:QueryLogRange(head, pull_ref)) + call s:AddLogSection('Unpulled from ' . pull_short, s:QueryLogRange(head, pull_ref, dir)) endif setlocal nomodified readonly noswapfile @@ -3935,6 +3933,8 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg, ...) abort let job = jobstart(argv, extend(jobopts, { \ 'pty': state.pty, \ 'TERM': 'dumb', + \ 'stdout_buffered': pager, + \ 'stderr_buffered': pager, \ 'on_stdout': function('s:RunReceive', [state, tmp, 'out']), \ 'on_stderr': function('s:RunReceive', [state, tmp, 'err']), \ 'on_exit': function('s:RunClose', [state, tmp]), @@ -4123,6 +4123,7 @@ function! fugitive#CdComplete(A, L, P) abort endfunction function! fugitive#Cd(path, ...) abort + exe s:VersionCheck() let path = substitute(a:path, '^:/:\=\|^:(\%(top\|top,literal\|literal,top\|literal\))', '', '') if path !~# '^/\|^\a\+:\|^\.\.\=\%(/\|$\)' let dir = s:Dir() @@ -4278,20 +4279,20 @@ function! s:DoAutocmdChanged(dir) abort return '' endfunction -function! s:ReloadStatusBuffer(...) abort +function! s:ReloadStatusBuffer() abort if get(b:, 'fugitive_type', '') !=# 'index' return '' endif - let original_lnum = a:0 ? a:1 : line('.') + let original_lnum = line('.') let info = s:StageInfo(original_lnum) exe fugitive#BufReadStatus(0) call setpos('.', [0, s:StageSeek(info, original_lnum), 1, 0]) return '' endfunction -function! s:ReloadStatus(...) abort +function! s:ReloadStatus() abort call s:ExpireStatus(-1) - call s:ReloadStatusBuffer(a:0 ? a:1 : line('.')) + call s:ReloadStatusBuffer() exe s:DoAutocmdChanged(-1) return '' endfunction @@ -4322,25 +4323,22 @@ function! s:ReloadWinStatus(...) abort return endif if !exists('b:fugitive_reltime') - exe s:ReloadStatusBuffer() + exe call('s:ReloadStatusBuffer', a:000) return endif let t = b:fugitive_reltime if reltimestr(reltime(s:last_time, t)) =~# '-\|\d\{10\}\.' || \ reltimestr(reltime(get(s:last_times, s:Tree() . '/', t), t)) =~# '-\|\d\{10\}\.' - exe s:ReloadStatusBuffer() + exe call('s:ReloadStatusBuffer', a:000) endif endfunction -function! s:ReloadTabStatus(...) abort - let mytab = tabpagenr() - let tab = a:0 ? a:1 : mytab +function! s:ReloadTabStatus() abort let winnr = 1 - while winnr <= tabpagewinnr(tab, '$') - if getbufvar(tabpagebuflist(tab)[winnr-1], 'fugitive_type') ==# 'index' - execute 'tabnext '.tab + while winnr <= winnr('$') + if getbufvar(winbufnr(winnr), 'fugitive_type') ==# 'index' if winnr != winnr() - execute winnr.'wincmd w' + execute 'noautocmd' winnr.'wincmd w' let restorewinnr = 1 endif try @@ -4348,9 +4346,8 @@ function! s:ReloadTabStatus(...) abort finally if exists('restorewinnr') unlet restorewinnr - wincmd p + noautocmd wincmd p endif - execute 'tabnext '.mytab endtry endif let winnr += 1 @@ -5706,7 +5703,8 @@ function! s:GrepParseLine(options, quiet, dir, line) abort if entry.module !~# ':' let entry.filename = s:PathJoin(a:options.prefix, entry.module) else - let entry.filename = fugitive#Find(entry.module, a:dir) + let entry.filename = fugitive#Find(matchstr(entry.module, '^[^:]*:') . + \ substitute(matchstr(entry.module, ':\zs.*'), '/\=:', '/', 'g'), a:dir) endif return entry endfunction @@ -5964,6 +5962,7 @@ function! s:LogParse(state, dir, prefix, line) abort endfunction function! fugitive#LogCommand(line1, count, range, bang, mods, args, type) abort + exe s:VersionCheck() let dir = s:Dir() exe s:DirCheck(dir) let listnr = a:type =~# '^l' ? 0 : -1 @@ -6115,6 +6114,10 @@ function! s:OpenExpand(dir, file, wants_cmd) abort else let efile = s:Expand(a:file) endif + if efile =~# '^https\=://' + let [url, lnum] = s:ResolveUrl(efile, a:dir) + return [url, a:wants_cmd ? lnum : 0] + endif let url = s:Generate(efile, a:dir) if a:wants_cmd && a:file[0] ==# '>' && efile[0] !=# '>' && get(b:, 'fugitive_type', '') isnot# 'tree' && &filetype !=# 'netrw' let line = line('.') @@ -6667,6 +6670,7 @@ endfunction " Section: :GMove, :GRemove function! s:Move(force, rename, destination) abort + exe s:VersionCheck() let dir = s:Dir() exe s:DirCheck(dir) if s:DirCommitFile(@%)[1] !~# '^0\=$' || empty(@%) @@ -6740,6 +6744,7 @@ function! fugitive#RenameCommand(line1, line2, range, bang, mods, arg, ...) abor endfunction function! s:Remove(after, force) abort + exe s:VersionCheck() let dir = s:Dir() exe s:DirCheck(dir) if len(@%) && s:DirCommitFile(@%)[1] ==# '' @@ -7609,6 +7614,115 @@ function! fugitive#BrowseCommand(line1, count, range, bang, mods, arg, ...) abor endtry endfunction +function! s:RemoteRefToLocalRef(repo, remote_url, ref_path) abort + let ref_path = substitute(a:ref_path, ':', '/', '') + let rev = '' + if ref_path =~# '^\x\{40,\}\%(/\|$\)' + let rev = substitute(ref_path, '/', ':', '') + elseif ref_path =~# '^[^:/^~]\+' + let first_component = matchstr(ref_path, '^[^:/^~]\+') + let lines = fugitive#Execute(['ls-remote', a:remote_url, first_component, first_component . '/*'], a:repo).stdout[0:-2] + for line in lines + let full = matchstr(line, "\t\\zs.*") + for candidate in [full, matchstr(full, '^refs/\w\+/\zs.*')] + if candidate ==# first_component || strpart(ref_path . '/', 0, len(candidate) + 1) ==# candidate . '/' + let rev = matchstr(line, '^\x\+') . substitute(strpart(ref_path, len(candidate)), '/', ':', '') + endif + endfor + endfor + endif + if empty(rev) + return '' + endif + let commitish = matchstr(rev, '^[^:^~]*') + let rev_parse = fugitive#Execute(['rev-parse', '--verify', commitish], a:repo) + if rev_parse.exit_status + if fugitive#Execute(['fetch', remote_url, commitish], a:repo).exit_status + return '' + endif + let rev_parse = fugitive#Execute(['rev-parse', '--verify', commitish], a:repo) + endif + if rev_parse.exit_status + return '' + endif + return rev_parse.stdout[0] . matchstr(rev, ':.*') +endfunction + +function! fugitive#ResolveUrl(target, ...) abort + let repo = call('s:Dir', a:000) + let origins = get(g:, 'fugitive_url_origins', {}) + let prefix = substitute(s:Slash(a:target), '#.*', '', '') + while prefix =~# '://' + let extracted = FugitiveExtractGitDir(expand(get(origins, prefix, ''))) + if !empty(extracted) + let repo = s:Dir(extracted) + break + endif + let prefix = matchstr(prefix, '.*\ze/') + endwhile + let git_dir = s:GitDir(repo) + for remote_name in keys(FugitiveConfigGetRegexp('^remote\.\zs.*\ze\.url$', repo)) + let remote_url = fugitive#RemoteUrl(remote_name, repo) + for [no_anchor; variant] in [[1, 'commit'], [1, 'tree'], [1, 'tree', 1], [1, 'blob', 1], [0, 'blob', 1, '1`line1`', '1`line1`'], [0, 'blob', 1, '1`line1`', '2`line2`']] + let handler_opts = { + \ 'git_dir': git_dir, + \ 'repo': {'git_dir': git_dir}, + \ 'remote': remote_url, + \ 'remote_name': remote_name, + \ 'commit': '1`commit`', + \ 'type': get(variant, 0), + \ 'path': get(variant, 1) ? '1`path`' : '', + \ 'line1': get(variant, 2), + \ 'line2': get(variant, 3)} + let url = '' + for l:.Handler in get(g:, 'fugitive_browse_handlers', []) + let l:.url = call(Handler, [copy(handler_opts)]) + if type(url) == type('') && url =~# '://' + break + endif + endfor + if type(url) != type('') || url !~# '://' + continue + endif + let keys = split(substitute(url, '\d`\(\w\+`\)\|.', '\1', 'g'), '`') + let pattern = substitute(url, '\d`\w\+`\|[][^$.*\~]', '\=len(submatch(0)) == 1 ? "\\" . submatch(0) : "\\([^#?&;]\\{-\\}\\)"', 'g') + let pattern = '^' . substitute(pattern, '^https\=:', 'https\\=:', '') . '$' + let target = s:Slash(no_anchor ? substitute(a:target, '#.*', '', '') : a:target) + let values = matchlist(s:Slash(a:target), pattern)[1:-1] + if empty(values) + continue + endif + let kvs = {} + for i in range(len(keys)) + let kvs[keys[i]] = values[i] + endfor + if has_key(kvs, 'commit') && has_key(kvs, 'path') + let ref_path = kvs.commit . '/' . kvs.path + elseif has_key(kvs, 'commit') && variant[0] ==# 'tree' + let ref_path = kvs.commit . '/' + elseif has_key(kvs, 'commit') + let ref_path = kvs.commit + else + continue + endif + let rev = s:RemoteRefToLocalRef(repo, remote_url, fugitive#UrlDecode(ref_path)) + return [fugitive#Find(rev, repo), empty(rev) ? 0 : +get(kvs, 'line1')] + endfor + endfor + return ['', 0] +endfunction + +function! s:ResolveUrl(target, ...) abort + try + let [url, lnum] = call('fugitive#ResolveUrl', [a:target] + a:000) + if !empty(url) + return [url, lnum] + endif + catch + endtry + return [substitute(a:target, '#.*', '', ''), 0] +endfunction + " Section: Maps let s:ref_header = '\%(Merge\|Rebase\|Upstream\|Pull\|Push\)' @@ -7784,7 +7898,7 @@ function! fugitive#MapJumps(...) abort exe s:Map('n', '<2-LeftMouse>', ':0,1Git ++curwin blame' . blame_tail, '') exe s:Map('n', '', ':0,1Git ++curwin blame' . blame_tail, '') exe s:Map('n', 'o', ':0,1Git blame' . blame_tail, '') - exe s:Map('n', 'p', ':0,1Git blame!' . blame_tail, '') + exe s:Map('n', 'p', ':0,1Git! blame' . blame_tail, '') if has('patch-7.4.1898') exe s:Map('n', 'gO', ':vertical 0,1Git blame' . blame_tail, '') exe s:Map('n', 'O', ':tab 0,1Git blame' . blame_tail, '') diff --git a/sources_non_forked/vim-fugitive/doc/fugitive.txt b/sources_non_forked/vim-fugitive/doc/fugitive.txt index c91c1048..d5d4300c 100644 --- a/sources_non_forked/vim-fugitive/doc/fugitive.txt +++ b/sources_non_forked/vim-fugitive/doc/fugitive.txt @@ -49,8 +49,9 @@ that are part of Git repositories). *fugitive-summary* :Git With no arguments, bring up a summary window vaguely - akin to git-status. Press g? or see |fugitive-maps| - for usage. + akin to git-status. If a summary window is already + open for the current repository, it is focused + instead. Press g? or see |fugitive-maps| for usage. *:Git_blame* :Git blame [flags] Run git-blame [flags] on the current file and open the @@ -71,6 +72,16 @@ that are part of Git repositories). p jump to patch or blob in preview window - reblame at commit + The maps |fugitive_P| and |fugitive_~| are also + supported to reblame on a parent commit, but this is + inherently fragile, as the line being blamed will no + longer exist. The preferred alternative is to use + to open up the commit, select the corresponding + `-` line that you care about, and press twice + more to reblame at that line. Viewing the commit also + gives you additional context as to why the line + changed. + *g:fugitive_dynamic_colors* In the GUI or a 256 color terminal, commit hashes will be highlighted in different colors. To disable this: diff --git a/sources_non_forked/vim-gitgutter/README.mkd b/sources_non_forked/vim-gitgutter/README.mkd index 82e65bd3..cb9802a9 100644 --- a/sources_non_forked/vim-gitgutter/README.mkd +++ b/sources_non_forked/vim-gitgutter/README.mkd @@ -18,6 +18,7 @@ Features: * Stage partial hunks. * Provides a hunk text object. * Diffs against index (default) or any commit. +* Handles file moves / renames. * Heeds git's "assume unchanged" bit. * Allows folding all unchanged text. * Provides fold text showing whether folded lines have been changed. @@ -29,6 +30,7 @@ Features: * Fully customisable (signs, sign column, line (number) highlights, mappings, extra git-diff arguments, etc). * Can be toggled on/off, globally or per buffer. * Preserves signs from other plugins. +* Does the right thing when viewing revisions with [fugitive](https://github.com/tpope/vim-fugitive)'s `:0Gclog`. * Easy to integrate diff stats into status line; built-in integration with [vim-airline](https://github.com/bling/vim-airline/). * Works with fish shell (in addition to the usual shells). diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim index da1053d1..01bacdcd 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter.vim @@ -46,8 +46,6 @@ function! gitgutter#process_buffer(bufnr, force) abort call gitgutter#debug#log('Not tracked: '.gitgutter#utility#file(a:bufnr)) catch /gitgutter assume unchanged/ call gitgutter#debug#log('Assume unchanged: '.gitgutter#utility#file(a:bufnr)) - catch /gitgutter file unknown in base/ - let diff = gitgutter#diff#hunk_header_showing_every_line_added(a:bufnr) catch /gitgutter diff failed/ call gitgutter#debug#log('Diff failed: '.gitgutter#utility#file(a:bufnr)) call gitgutter#hunk#reset(a:bufnr) @@ -197,6 +195,7 @@ function! s:clear(bufnr) call gitgutter#hunk#reset(a:bufnr) call s:reset_tick(a:bufnr) call gitgutter#utility#setbufvar(a:bufnr, 'path', '') + call gitgutter#utility#setbufvar(a:bufnr, 'basepath', '') endfunction @@ -223,13 +222,13 @@ function! gitgutter#quickfix(current_file) let lnum = 0 for line in diff if line =~ '^diff --git [^"]' - let paths = line[11:] - let mid = (len(paths) - 1) / 2 - let [fnamel, fnamer] = [paths[:mid-1], paths[mid+1:]] - let fname = fnamel ==# fnamer ? fnamel : fnamel[2:] + " No quotation mark therefore no spaces in filenames + let [fnamel, fnamer] = split(line)[2:3] + let fname = fnamel ==# fnamer ? fnamer : fnamer[2:] elseif line =~ '^diff --git "' + " Quotation mark therefore do not split on space let [_, fnamel, _, fnamer] = split(line, '"') - let fname = fnamel ==# fnamer ? fnamel : fnamel[2:] + let fname = fnamel ==# fnamer ? fnamer : fnamer[2:] elseif line =~ '^diff --cc [^"]' let fname = line[10:] elseif line =~ '^diff --cc "' @@ -251,7 +250,6 @@ endfunction function! gitgutter#difforig() let bufnr = bufnr('') - let path = gitgutter#utility#repo_path(bufnr, 1) let filetype = &filetype vertical new @@ -259,7 +257,7 @@ function! gitgutter#difforig() let &filetype = filetype if g:gitgutter_diff_relative_to ==# 'index' - let index_name = gitgutter#utility#get_diff_base(bufnr).':'.path + let index_name = gitgutter#utility#get_diff_base(bufnr).':'.gitgutter#utility#base_path(bufnr) let cmd = gitgutter#utility#cd_cmd(bufnr, \ gitgutter#git().' --no-pager show '.index_name \ ) @@ -267,7 +265,7 @@ function! gitgutter#difforig() " gitgutter#utility's use_known_shell() / restore_shell() functions. silent! execute "read ++edit !" cmd else - silent! execute "read ++edit" path + silent! execute "read ++edit" gitgutter#utility#repo_path(bufnr, 1) endif 0d_ diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim index 9e016a40..6325ca33 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/diff.vim @@ -4,14 +4,6 @@ let s:nomodeline = (v:version > 703 || (v:version == 703 && has('patch442'))) ? let s:hunk_re = '^@@ -\(\d\+\),\?\(\d*\) +\(\d\+\),\?\(\d*\) @@' -" True for git v1.7.2+. -function! s:git_supports_command_line_config_override() abort - call gitgutter#utility#system(gitgutter#git().' -c foo.bar=baz --version') - return !v:shell_error -endfunction - -let s:c_flag = s:git_supports_command_line_config_override() - let s:temp_from = tempname() let s:temp_buffer = tempname() let s:counter = 0 @@ -81,20 +73,6 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort throw 'gitgutter assume unchanged' endif - " If we are diffing against a specific branch/commit, handle the case - " where a file exists on the current branch but not in/at the diff base. - " We have to handle it here because the approach below (using git-show) - " doesn't work for this case. - if !empty(g:gitgutter_diff_base) - let index_name = gitgutter#utility#get_diff_base(a:bufnr).':'.gitgutter#utility#repo_path(a:bufnr, 1) - let cmd = gitgutter#git().' --no-pager show '.index_name - let cmd = gitgutter#utility#cd_cmd(a:bufnr, cmd) - call gitgutter#utility#system(cmd) - if v:shell_error - throw 'gitgutter file unknown in base' - endif - endif - " Wrap compound commands in parentheses to make Windows happy. " bash doesn't mind the parentheses. let cmd = '(' @@ -137,8 +115,8 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort endif " Write file from index to temporary file. - let index_name = gitgutter#utility#get_diff_base(a:bufnr).':'.gitgutter#utility#repo_path(a:bufnr, 1) - let cmd .= gitgutter#git().' --no-pager show --textconv '.index_name.' > '.from_file.' && ' + let index_name = gitgutter#utility#get_diff_base(a:bufnr).':'.gitgutter#utility#base_path(a:bufnr) + let cmd .= gitgutter#git().' --no-pager show --textconv '.index_name.' > '.from_file.' || exit 0) && (' elseif a:from ==# 'working_tree' let from_file = gitgutter#utility#repo_path(a:bufnr, 1) @@ -146,7 +124,7 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort " Call git-diff. let cmd .= gitgutter#git().' --no-pager' - if s:c_flag + if gitgutter#utility#git_supports_command_line_config_override() let cmd .= ' -c "diff.autorefreshindex=0"' let cmd .= ' -c "diff.noprefix=false"' let cmd .= ' -c "core.safecrlf=false"' @@ -176,9 +154,9 @@ function! gitgutter#diff#run_diff(bufnr, from, preserve_full_diff) abort return 'async' else - let diff = gitgutter#utility#system(cmd) + let [diff, error_code] = gitgutter#utility#system(cmd) - if v:shell_error + if error_code call gitgutter#debug#log(diff) throw 'gitgutter diff failed' endif @@ -390,12 +368,6 @@ function! gitgutter#diff#hunk_diff(bufnr, full_diff, ...) endfunction -function! gitgutter#diff#hunk_header_showing_every_line_added(bufnr) - let buf_line_count = getbufinfo(a:bufnr)[0].linecount - return '@@ -0,0 +1,'.buf_line_count.' @@' -endfunction - - function! s:write_buffer(bufnr, file) let bufcontents = getbufline(a:bufnr, 1, '$') diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim index 45f3ccc5..7546917f 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/hunk.vim @@ -309,7 +309,7 @@ function! s:stage(hunk_diff) let cmd = gitgutter#utility#cd_cmd(bufnr, \ gitgutter#git().' add '. \ gitgutter#utility#shellescape(gitgutter#utility#filename(bufnr))) - call gitgutter#utility#system(cmd) + let [_, error_code] = gitgutter#utility#system(cmd) else return endif @@ -317,12 +317,12 @@ function! s:stage(hunk_diff) else let diff = s:adjust_header(bufnr, a:hunk_diff) " Apply patch to index. - call gitgutter#utility#system( + let [_, error_code] = gitgutter#utility#system( \ gitgutter#utility#cd_cmd(bufnr, gitgutter#git().' apply --cached --unidiff-zero - '), \ diff) endif - if v:shell_error + if error_code call gitgutter#utility#warn('Patch does not apply') else if exists('#User#GitGutterStage') diff --git a/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim index f3bbd546..9c2b9c38 100644 --- a/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim +++ b/sources_non_forked/vim-gitgutter/autoload/gitgutter/utility.vim @@ -6,6 +6,15 @@ function! gitgutter#utility#supports_overscore_sign() endif endfunction +" True for git v1.7.2+. +function! gitgutter#utility#git_supports_command_line_config_override() abort + if !exists('s:c_flag') + let [_, error_code] = gitgutter#utility#system(gitgutter#git().' -c foo.bar=baz --version') + let s:c_flag = !error_code + endif + return s:c_flag +endfunction + function! gitgutter#utility#setbufvar(buffer, varname, val) let buffer = +a:buffer " Default value for getbufvar() was introduced in Vim 7.3.831. @@ -93,10 +102,13 @@ function! gitgutter#utility#system(cmd, ...) abort call gitgutter#debug#log(a:cmd, a:000) call s:use_known_shell() + let prev_error_code = v:shell_error silent let output = (a:0 == 0) ? system(a:cmd) : system(a:cmd, a:1) + let error_code = v:shell_error + silent call system('exit ' . prev_error_code) call s:restore_shell() - return output + return [output, error_code] endfunction function! gitgutter#utility#has_repo_path(bufnr) @@ -161,9 +173,9 @@ function! gitgutter#utility#set_repo_path(bufnr, continuation) abort return 'async' endif - let listing = gitgutter#utility#system(cmd) + let [listing, error_code] = gitgutter#utility#system(cmd) - if v:shell_error + if error_code call gitgutter#utility#setbufvar(a:bufnr, 'path', -2) return endif @@ -184,7 +196,7 @@ function! gitgutter#utility#clean_smudge_filter_applies(bufnr) let cmd = gitgutter#utility#cd_cmd(a:bufnr, \ gitgutter#git().' check-attr filter -- '. \ gitgutter#utility#shellescape(gitgutter#utility#filename(a:bufnr))) - let out = gitgutter#utility#system(cmd) + let [out, _] = gitgutter#utility#system(cmd) let filtered = out !~ 'unspecified' call gitgutter#utility#setbufvar(a:bufnr, 'filter', filtered) endif @@ -233,6 +245,87 @@ function! gitgutter#utility#get_diff_base(bufnr) return g:gitgutter_diff_base endfunction +" Returns the original path (shellescaped) at the buffer's diff base. +function! gitgutter#utility#base_path(bufnr) + let diffbase = gitgutter#utility#get_diff_base(a:bufnr) + + " If we already know the original path at this diff base, return it. + let basepath = gitgutter#utility#getbufvar(a:bufnr, 'basepath', '') + if !empty(basepath) + " basepath is diffbase:path + " Note that path can also contain colons. + " List destructuring / unpacking where the remaining items are assigned + " to a single variable (:help let-unpack) is only available in v8.2.0540. + let parts = split(basepath, ':', 1) + let base = parts[0] + let bpath = join(parts[1:], ':') + + if base == diffbase + return gitgutter#utility#shellescape(bpath) + endif + endif + + " Obtain buffers' paths. + let current_paths = {} + for bufnr in range(1, bufnr('$') + 1) + if gitgutter#utility#has_repo_path(bufnr) + let current_paths[gitgutter#utility#repo_path(bufnr, 0)] = bufnr + endif + endfor + + " Get a list of file renames at the buffer's diff base. + " Store the original paths on any corresponding buffers. + " If the buffer's file was one of them, return its original path. + let op = '' + let renames = s:obtain_file_renames(a:bufnr, diffbase) + for [current, original] in items(renames) + if has_key(current_paths, current) + let bufnr = current_paths[current] + let basepath = diffbase.':'.original + call gitgutter#utility#setbufvar(bufnr, 'basepath', basepath) + + if bufnr == a:bufnr + let op = original + endif + endif + endfor + if !empty(op) + return gitgutter#utility#shellescape(op) + endif + + " Buffer's file was not renamed, so store current path and return it. + let current_path = gitgutter#utility#repo_path(a:bufnr, 0) + let basepath = diffbase.':'.current_path + call gitgutter#utility#setbufvar(a:bufnr, 'basepath', basepath) + return gitgutter#utility#shellescape(current_path) +endfunction + +" Returns a dict of current path to original path at the given base. +function! s:obtain_file_renames(bufnr, base) + let renames = {} + let cmd = gitgutter#git() + if gitgutter#utility#git_supports_command_line_config_override() + let cmd .= ' -c "core.safecrlf=false"' + endif + let cmd .= ' diff --diff-filter=R --name-status '.a:base + let [out, error_code] = gitgutter#utility#system(gitgutter#utility#cd_cmd(a:bufnr, cmd)) + if error_code + " Assume the problem is the diff base. + call gitgutter#utility#warn('g:gitgutter_diff_base ('.a:base.') is invalid') + return {} + endif + for line in split(out, '\n') + let fields = split(line) + if len(fields) != 3 + call gitgutter#utility#warn('gitgutter: unable to list renamed files: '.line) + return {} + endif + let [original, current] = fields[1:] + let renames[current] = original + endfor + return renames +endfunction + function! s:abs_path(bufnr, shellesc) let p = resolve(expand('#'.a:bufnr.':p')) diff --git a/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim b/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim index 678af341..a9b2340e 100644 --- a/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim +++ b/sources_non_forked/vim-gitgutter/test/test_gitgutter.vim @@ -52,6 +52,7 @@ endfunction " function SetUp() + let g:gitgutter_diff_base = '' call system("git init ".s:test_repo. \ " && cd ".s:test_repo. \ " && cp ../.gitconfig .". @@ -195,6 +196,20 @@ function Test_filename_with_equals() endfunction +function Test_filename_with_colon() + call system('touch fix:ture.txt && git add fix:ture.txt') + edit fix:ture.txt + normal ggo* + call s:trigger_gitgutter() + + let expected = [ + \ {'lnum': 1, 'name': 'GitGutterLineAdded'}, + \ {'lnum': 2, 'name': 'GitGutterLineAdded'} + \ ] + call s:assert_signs(expected, 'fix:ture.txt') +endfunction + + function Test_filename_with_square_brackets() call system('touch fix[tu]re.txt && git add fix[tu]re.txt') edit fix[tu]re.txt @@ -280,6 +295,29 @@ function Test_saveas() endfunction +function Test_file_mv() + call system('git mv fixture.txt fixture_moved.txt') + edit fixture_moved.txt + normal ggo* + call s:trigger_gitgutter() + let expected = [{'lnum': 2, 'name': 'GitGutterLineAdded'}] + call s:assert_signs(expected, 'fixture_moved.txt') + + write + call system('git add fixture_moved.txt && git commit -m "moved and edited"') + GitGutterDisable + GitGutterEnable + let expected = [] + call s:assert_signs(expected, 'fixture_moved.txt') + + GitGutterDisable + let g:gitgutter_diff_base = 'HEAD^' + GitGutterEnable + let expected = [{'lnum': 2, 'name': 'GitGutterLineAdded'}] + call s:assert_signs(expected, 'fixture_moved.txt') +endfunction + + " FIXME: this test fails when it is the first (or only) test to be run function Test_follow_symlink() let tmp = 'symlink' @@ -382,8 +420,7 @@ endfunction function Test_file_unknown_in_base() - let starting_branch = system('git branch --show-current') - let starting_branch = 'main' + let starting_branch = split(system('git branch --show-current'))[0] call system('git checkout -b some-feature') let tmp = 'file-on-this-branch-only.tmp' call system('echo "hi" > '.tmp.' && git add '.tmp) @@ -396,6 +433,27 @@ function Test_file_unknown_in_base() endfunction +function Test_v_shell_error_not_clobbered() + " set gitgutter up to generate a shell error + let starting_branch = split(system('git branch --show-current'))[0] + call system('git checkout -b some-feature') + let tmp = 'file-on-this-branch-only.tmp' + call system('echo "hi" > '.tmp.' && git add '.tmp) + execute 'edit '.tmp + let g:gitgutter_diff_base = starting_branch + + " run a successful shell command + silent !echo foobar >/dev/null + + " run gitgutter + GitGutter + + call assert_equal(0, v:shell_error) + + let g:gitgutter_diff_base = '' +endfunction + + function Test_hunk_outside_noop() 5 GitGutterStageHunk diff --git a/sources_non_forked/vim-markdown/README.md b/sources_non_forked/vim-markdown/README.md index 08abbfde..250d3e5a 100644 --- a/sources_non_forked/vim-markdown/README.md +++ b/sources_non_forked/vim-markdown/README.md @@ -349,6 +349,27 @@ The following options control which syntax extensions will be turned on. They ar let g:vim_markdown_edit_url_in = 'tab' +### Borderless tables + +- `g:vim_markdown_borderless_table` + + Add support for borderless tables, such as: + ``` + header 1|header 2 + --|-- + data 1|data 2 + ``` + if set to `1`: + + let g:vim_markdown_borderless_table = 1 + + the table would be formatted as usual: + ``` + | header 1 | header 2 | + |----------|----------| + | data 1 | data 2 | + ``` + ## Mappings The following work on normal and visual modes: diff --git a/sources_non_forked/vim-markdown/doc/vim-markdown.txt b/sources_non_forked/vim-markdown/doc/vim-markdown.txt index 438a23dd..4aa8270c 100644 --- a/sources_non_forked/vim-markdown/doc/vim-markdown.txt +++ b/sources_non_forked/vim-markdown/doc/vim-markdown.txt @@ -490,6 +490,30 @@ Change how to open new files ~ > let g:vim_markdown_edit_url_in = 'tab' < +------------------------------------------------------------------------------- + *vim-markdown-support-borderless-tables* +Support borderless tables ~ + + *g:vim_markdown_borderless_table* +- 'g:vim_markdown_borderless_table' + + Add support for borderless tables, such as: +> + header 1|header 2 + --|-- + data 1|data 2 +< + if set to 1: +> + let g:vim_markdown_borderless_table = 1 +< + the table would be formatted as usual: +> + | header 1 | header 2 | + |----------|----------| + | data 1 | data 2 | +< + =============================================================================== *vim-markdown-mappings* Mappings ~ diff --git a/sources_non_forked/vim-markdown/ftplugin/markdown.vim b/sources_non_forked/vim-markdown/ftplugin/markdown.vim index 60505cd3..de239db4 100644 --- a/sources_non_forked/vim-markdown/ftplugin/markdown.vim +++ b/sources_non_forked/vim-markdown/ftplugin/markdown.vim @@ -1,6 +1,6 @@ "TODO print messages when on visual mode. I only see VISUAL, not the messages. -" Function interface phylosophy: +" Function interface philosophy: " " - functions take arbitrary line numbers as parameters. " Current cursor line is only a suitable default parameter. @@ -56,7 +56,7 @@ let s:levelRegexpDict = { \ 6: '\v^######[^#]@=' \ } -" Maches any header level of any type. +" Matches any header level of any type. " " This could be deduced from `s:levelRegexpDict`, but it is more " efficient to have a single regexp for this. @@ -538,6 +538,19 @@ endfunction " function! s:TableFormat() let l:pos = getpos('.') + + if get(g:, 'vim_markdown_borderless_table', 0) + " add `|` to the beginning of the line if it isn't present + normal! { + call search('|') + execute 'silent .,''}s/\v^(\s{0,})\|?([^\|])/\1|\2/e' + + " add `|` to the end of the line if it isn't present + normal! { + call search('|') + execute 'silent .,''}s/\v([^\|])\|?(\s{0,})$/\1|\2/e' + endif + normal! { " Search instead of `normal! j` because of the table at beginning of file edge case. call search('|') @@ -719,7 +732,7 @@ if !exists('*s:EditUrlUnderCursor') execute l:editmethod l:url endif if l:anchor !=# '' - silent! execute '/'.l:anchor + call search(l:anchor, 's') endif else execute l:editmethod . ' ' @@ -765,7 +778,7 @@ endif command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(, ) command! -buffer -range=% HeaderIncrease call s:HeaderDecrease(, , 1) command! -buffer -range=% SetexToAtx call s:SetexToAtx(, ) -command! -buffer TableFormat call s:TableFormat() +command! -buffer -range TableFormat call s:TableFormat() command! -buffer Toc call s:Toc() command! -buffer Toch call s:Toc('horizontal') command! -buffer Tocv call s:Toc('vertical') diff --git a/sources_non_forked/vim-markdown/syntax/markdown.vim b/sources_non_forked/vim-markdown/syntax/markdown.vim index 4d54d3c3..37494832 100644 --- a/sources_non_forked/vim-markdown/syntax/markdown.vim +++ b/sources_non_forked/vim-markdown/syntax/markdown.vim @@ -86,14 +86,14 @@ syn region mkdLinkTitle matchgroup=mkdDelimiter start=+'+ end=+'+ contained syn region mkdLinkTitle matchgroup=mkdDelimiter start=+(+ end=+)+ contained "HTML headings -syn region htmlH1 matchgroup=mkdHeading start="^\s*#" end="$" contains=mkdLink,mkdInlineURL,@Spell -syn region htmlH2 matchgroup=mkdHeading start="^\s*##" end="$" contains=mkdLink,mkdInlineURL,@Spell -syn region htmlH3 matchgroup=mkdHeading start="^\s*###" end="$" contains=mkdLink,mkdInlineURL,@Spell -syn region htmlH4 matchgroup=mkdHeading start="^\s*####" end="$" contains=mkdLink,mkdInlineURL,@Spell -syn region htmlH5 matchgroup=mkdHeading start="^\s*#####" end="$" contains=mkdLink,mkdInlineURL,@Spell -syn region htmlH6 matchgroup=mkdHeading start="^\s*######" end="$" contains=mkdLink,mkdInlineURL,@Spell -syn match htmlH1 /^.\+\n=\+$/ contains=mkdLink,mkdInlineURL,@Spell -syn match htmlH2 /^.\+\n-\+$/ contains=mkdLink,mkdInlineURL,@Spell +syn region htmlH1 matchgroup=mkdHeading start="^\s*#" end="$" contains=@mkdHeadingContent,@Spell +syn region htmlH2 matchgroup=mkdHeading start="^\s*##" end="$" contains=@mkdHeadingContent,@Spell +syn region htmlH3 matchgroup=mkdHeading start="^\s*###" end="$" contains=@mkdHeadingContent,@Spell +syn region htmlH4 matchgroup=mkdHeading start="^\s*####" end="$" contains=@mkdHeadingContent,@Spell +syn region htmlH5 matchgroup=mkdHeading start="^\s*#####" end="$" contains=@mkdHeadingContent,@Spell +syn region htmlH6 matchgroup=mkdHeading start="^\s*######" end="$" contains=@mkdHeadingContent,@Spell +syn match htmlH1 /^.\+\n=\+$/ contains=@mkdHeadingContent,@Spell +syn match htmlH2 /^.\+\n-\+$/ contains=@mkdHeadingContent,@Spell "define Markdown groups syn match mkdLineBreak / \+$/ @@ -156,6 +156,7 @@ if get(g:, 'vim_markdown_strikethrough', 0) HtmlHiLink mkdStrike htmlStrike endif +syn cluster mkdHeadingContent contains=htmlItalic,htmlBold,htmlBoldItalic,mkdFootnotes,mkdLink,mkdInlineURL,mkdStrike syn cluster mkdNonListItem contains=@htmlTop,htmlItalic,htmlBold,htmlBoldItalic,mkdFootnotes,mkdInlineURL,mkdLink,mkdLinkDef,mkdLineBreak,mkdBlockquote,mkdCode,mkdRule,htmlH1,htmlH2,htmlH3,htmlH4,htmlH5,htmlH6,mkdMath,mkdStrike "highlighting for Markdown groups diff --git a/sources_non_forked/vim-markdown/test/strikethrough.vader b/sources_non_forked/vim-markdown/test/strikethrough.vader new file mode 100644 index 00000000..4fe392ab --- /dev/null +++ b/sources_non_forked/vim-markdown/test/strikethrough.vader @@ -0,0 +1,41 @@ +Before: + let g:vim_markdown_strikethrough = 1 + syn off | syn on + +After: + unlet! g:vim_markdown_strikethrough + +Given markdown; +a ~~b~~ c + +Execute (strikethrough): + AssertNotEqual SyntaxOf('a'), 'mkdStrike' + AssertEqual SyntaxOf('b'), 'mkdStrike' + AssertNotEqual SyntaxOf('c'), 'mkdStrike' + +Given markdown; +# ~~h1~~ +## ~~h2~~ +### ~~h3~~ +#### ~~h4~~ +##### ~~h5~~ +###### ~~h6~~ + +Execute (strikethrough in atx headings): + AssertEqual SyntaxOf('h1'), 'mkdStrike' + AssertEqual SyntaxOf('h2'), 'mkdStrike' + AssertEqual SyntaxOf('h3'), 'mkdStrike' + AssertEqual SyntaxOf('h4'), 'mkdStrike' + AssertEqual SyntaxOf('h5'), 'mkdStrike' + AssertEqual SyntaxOf('h6'), 'mkdStrike' + +Given markdown; +~~h1~~ += + +~~h2~~ +- + +Execute (strikethrough in setext headings): + AssertEqual SyntaxOf('h1'), 'mkdStrike' + AssertEqual SyntaxOf('h2'), 'mkdStrike' diff --git a/sources_non_forked/vim-markdown/test/syntax.vader b/sources_non_forked/vim-markdown/test/syntax.vader index 3d1a9911..b111de0d 100644 --- a/sources_non_forked/vim-markdown/test/syntax.vader +++ b/sources_non_forked/vim-markdown/test/syntax.vader @@ -1302,3 +1302,227 @@ Execute (HTML tag in text): AssertEqual SyntaxOf('span'), 'htmlTagName' AssertEqual SyntaxOf(''), 'htmlTag' AssertEqual SyntaxOf(''), 'htmlEndTag' + +Given markdown; +# _h1_ + +## _h2_ + +### _h3_ + +#### _h4_ + +##### _h5_ + +###### _h6_ + +Execute (underscore italic text in atx headings): + AssertEqual SyntaxOf('h1'), 'htmlItalic' + AssertEqual SyntaxOf('h2'), 'htmlItalic' + AssertEqual SyntaxOf('h3'), 'htmlItalic' + AssertEqual SyntaxOf('h4'), 'htmlItalic' + AssertEqual SyntaxOf('h5'), 'htmlItalic' + AssertEqual SyntaxOf('h6'), 'htmlItalic' + +Given markdown; +# *h1* + +## *h2* + +### *h3* + +#### *h4* + +##### *h5* + +###### *h6* + +Execute (asterisk italic text in atx headings): + AssertEqual SyntaxOf('h1'), 'htmlItalic' + AssertEqual SyntaxOf('h2'), 'htmlItalic' + AssertEqual SyntaxOf('h3'), 'htmlItalic' + AssertEqual SyntaxOf('h4'), 'htmlItalic' + AssertEqual SyntaxOf('h5'), 'htmlItalic' + AssertEqual SyntaxOf('h6'), 'htmlItalic' + +Given markdown; +_h1_ += + +_h2_ +- + +Execute (underscore italic text in setext headings): + AssertEqual SyntaxOf('h1'), 'htmlItalic' + AssertEqual SyntaxOf('h2'), 'htmlItalic' + +Given markdown; +*h1* += + +*h2* +- + +Execute (asterisk italic text in setext headings): + AssertEqual SyntaxOf('h1'), 'htmlItalic' + AssertEqual SyntaxOf('h2'), 'htmlItalic' + +Given markdown; +# __h1__ + +## __h2__ + +### __h3__ + +#### __h4__ + +##### __h5__ + +###### __h6__ + +Execute (underscore bold text in atx headings): + AssertEqual SyntaxOf('h1'), 'htmlBold' + AssertEqual SyntaxOf('h2'), 'htmlBold' + AssertEqual SyntaxOf('h3'), 'htmlBold' + AssertEqual SyntaxOf('h4'), 'htmlBold' + AssertEqual SyntaxOf('h5'), 'htmlBold' + AssertEqual SyntaxOf('h6'), 'htmlBold' + +Given markdown; +# **h1** + +## **h2** + +### **h3** + +#### **h4** + +##### **h5** + +###### **h6** + +Execute (asterisk bold text in atx headings): + AssertEqual SyntaxOf('h1'), 'htmlBold' + AssertEqual SyntaxOf('h2'), 'htmlBold' + AssertEqual SyntaxOf('h3'), 'htmlBold' + AssertEqual SyntaxOf('h4'), 'htmlBold' + AssertEqual SyntaxOf('h5'), 'htmlBold' + AssertEqual SyntaxOf('h6'), 'htmlBold' + +Given markdown; +__h1__ += + +__h2__ +- + +Execute (underscore bold text in setext headings): + AssertEqual SyntaxOf('h1'), 'htmlBold' + AssertEqual SyntaxOf('h2'), 'htmlBold' + +Given markdown; +**h1** += + +**h2** +- + +Execute (asterisk bold text in setext headings): + AssertEqual SyntaxOf('h1'), 'htmlBold' + AssertEqual SyntaxOf('h2'), 'htmlBold' + +Given markdown; +# ___h1___ + +## ___h2___ + +### ___h3___ + +#### ___h4___ + +##### ___h5___ + +###### ___h6___ + +Execute (underscore bold italic text in atx headings): + AssertEqual SyntaxOf('h1'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h2'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h3'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h4'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h5'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h6'), 'htmlBoldItalic' + +Given markdown; +# ***h1*** + +## ***h2*** + +### ***h3*** + +#### ***h4*** + +##### ***h5*** + +###### ***h6*** + +Execute (asterisk bold italic text in atx headings): + AssertEqual SyntaxOf('h1'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h2'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h3'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h4'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h5'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h6'), 'htmlBoldItalic' + +Given markdown; +___h1___ += + +___h2___ +- + +Execute (underscore bold italic text in setext headings): + AssertEqual SyntaxOf('h1'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h2'), 'htmlBoldItalic' + +Given markdown; +***h1*** += + +***h2*** +- + +Execute (asterisk bold italic text in setext headings): + AssertEqual SyntaxOf('h1'), 'htmlBoldItalic' + AssertEqual SyntaxOf('h2'), 'htmlBoldItalic' + +Given markdown; +# [^h1] + +## [^h2] + +### [^h3] + +#### [^h4] + +##### [^h5] + +###### [^h6] + +Execute (footnotes in atx headings): + AssertEqual SyntaxOf('h1'), 'mkdFootnotes' + AssertEqual SyntaxOf('h2'), 'mkdFootnotes' + AssertEqual SyntaxOf('h3'), 'mkdFootnotes' + AssertEqual SyntaxOf('h4'), 'mkdFootnotes' + AssertEqual SyntaxOf('h5'), 'mkdFootnotes' + AssertEqual SyntaxOf('h6'), 'mkdFootnotes' + +Given markdown; +[^h1] += + +[^h2] +- + +Execute (footnotes in setext headings): + AssertEqual SyntaxOf('h1'), 'mkdFootnotes' + AssertEqual SyntaxOf('h2'), 'mkdFootnotes' diff --git a/sources_non_forked/vim-markdown/test/table-format.vader b/sources_non_forked/vim-markdown/test/table-format.vader index 82ce3f80..f7028cb0 100644 --- a/sources_non_forked/vim-markdown/test/table-format.vader +++ b/sources_non_forked/vim-markdown/test/table-format.vader @@ -68,3 +68,18 @@ Expect (preserve colons to align text): | left | right | center | | |:-----|------:|:------:|:--| | left | right | center | | + +Given markdown (borderless table); + left |right| center + :- | --: |:---: + left |right| center + +Execute (format borderless table): + let g:vim_markdown_borderless_table = 1 + TableFormat + unlet g:vim_markdown_borderless_table + +Expect (table with borders): + | left | right | center | + |:-----|------:|:------:| + | left | right | center | diff --git a/sources_non_forked/vim-ruby/autoload/rubycomplete.vim b/sources_non_forked/vim-ruby/autoload/rubycomplete.vim index 8eff8003..d62aa08b 100644 --- a/sources_non_forked/vim-ruby/autoload/rubycomplete.vim +++ b/sources_non_forked/vim-ruby/autoload/rubycomplete.vim @@ -2,7 +2,6 @@ " Language: Ruby " Maintainer: Mark Guzman " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns " ---------------------------------------------------------------------------- " " Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com) @@ -489,7 +488,7 @@ class VimRubyCompletion trail = "%s%s" % [ dir, sub ] tcfg = "%sconfig" % trail - if File.exists?( tcfg ) + if File.exist?( tcfg ) rails_base = trail break end @@ -502,7 +501,7 @@ class VimRubyCompletion bootfile = rails_base + "config/boot.rb" envfile = rails_base + "config/environment.rb" - if File.exists?( bootfile ) && File.exists?( envfile ) + if File.exist?( bootfile ) && File.exist?( envfile ) begin require bootfile require envfile diff --git a/sources_non_forked/vim-ruby/compiler/eruby.vim b/sources_non_forked/vim-ruby/compiler/eruby.vim index cb42a717..64fa2c1d 100644 --- a/sources_non_forked/vim-ruby/compiler/eruby.vim +++ b/sources_non_forked/vim-ruby/compiler/eruby.vim @@ -2,7 +2,6 @@ " Language: eRuby " Maintainer: Doug Kearns " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("current_compiler") finish diff --git a/sources_non_forked/vim-ruby/compiler/rake.vim b/sources_non_forked/vim-ruby/compiler/rake.vim index ba404c87..8dc468aa 100644 --- a/sources_non_forked/vim-ruby/compiler/rake.vim +++ b/sources_non_forked/vim-ruby/compiler/rake.vim @@ -2,7 +2,6 @@ " Language: Rake " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("current_compiler") finish diff --git a/sources_non_forked/vim-ruby/compiler/rspec.vim b/sources_non_forked/vim-ruby/compiler/rspec.vim index 06e4de42..a9b25c83 100644 --- a/sources_non_forked/vim-ruby/compiler/rspec.vim +++ b/sources_non_forked/vim-ruby/compiler/rspec.vim @@ -2,7 +2,6 @@ " Language: RSpec " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("current_compiler") finish diff --git a/sources_non_forked/vim-ruby/compiler/ruby.vim b/sources_non_forked/vim-ruby/compiler/ruby.vim index 64429a21..55c53640 100644 --- a/sources_non_forked/vim-ruby/compiler/ruby.vim +++ b/sources_non_forked/vim-ruby/compiler/ruby.vim @@ -3,7 +3,6 @@ " Function: Syntax check and/or error reporting " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("current_compiler") finish diff --git a/sources_non_forked/vim-ruby/compiler/rubyunit.vim b/sources_non_forked/vim-ruby/compiler/rubyunit.vim index ed0639b5..6d785056 100644 --- a/sources_non_forked/vim-ruby/compiler/rubyunit.vim +++ b/sources_non_forked/vim-ruby/compiler/rubyunit.vim @@ -2,7 +2,6 @@ " Language: Test::Unit - Ruby Unit Testing Framework " Maintainer: Doug Kearns " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("current_compiler") finish diff --git a/sources_non_forked/vim-ruby/ftplugin/eruby.vim b/sources_non_forked/vim-ruby/ftplugin/eruby.vim index f84ed7fe..3581eb8e 100644 --- a/sources_non_forked/vim-ruby/ftplugin/eruby.vim +++ b/sources_non_forked/vim-ruby/ftplugin/eruby.vim @@ -2,7 +2,6 @@ " Language: eRuby " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns " Only do this when not done yet for this buffer if exists("b:did_ftplugin") diff --git a/sources_non_forked/vim-ruby/ftplugin/ruby.vim b/sources_non_forked/vim-ruby/ftplugin/ruby.vim index 07186d1e..841c4ec7 100644 --- a/sources_non_forked/vim-ruby/ftplugin/ruby.vim +++ b/sources_non_forked/vim-ruby/ftplugin/ruby.vim @@ -2,7 +2,6 @@ " Language: Ruby " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if (exists("b:did_ftplugin")) finish @@ -59,24 +58,38 @@ if !exists('g:ruby_version_paths') let g:ruby_version_paths = {} endif +let s:path_split = has('win32') ? ';' : ':' + function! s:query_path(root) abort - let code = "print $:.join %q{,}" - if &shell =~# 'sh' && empty(&shellxquote) - let prefix = 'env PATH='.shellescape($PATH).' ' - else - let prefix = '' + " Disabled by default for security reasons. + if !get(g:, 'ruby_exec', get(g:, 'plugin_exec', 0)) || empty(a:root) + return map(split($RUBYLIB, s:path_split), 'v:val ==# "." ? "" : v:val') endif + let code = "print $:.join %q{,}" if &shellxquote == "'" - let path_check = prefix.'ruby --disable-gems -e "' . code . '"' + let args = ' --disable-gems -e "' . code . '"' else - let path_check = prefix."ruby --disable-gems -e '" . code . "'" + let args = " --disable-gems -e '" . code . "'" endif - let cd = haslocaldir() ? 'lcd' : 'cd' + let cd = haslocaldir() ? 'lcd' : exists(':tcd') && haslocaldir(-1) ? 'tcd' : 'cd' let cwd = fnameescape(getcwd()) try exe cd fnameescape(a:root) - let path = split(system(path_check),',') + for dir in split($PATH, s:path_split) + if dir !=# '.' && executable(dir . '/ruby') == 1 + let exepath = dir . '/ruby' + break + endif + endfor + if exists('l:exepath') + let path = split(system(exepath . args),',') + if v:shell_error + let path = [] + endif + else + let path = [] + endif exe cd cwd return path finally @@ -117,10 +130,8 @@ else if !exists('g:ruby_default_path') if has("ruby") && has("win32") ruby ::VIM::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) ) - elseif executable('ruby') && !empty($HOME) - let g:ruby_default_path = s:query_path($HOME) else - let g:ruby_default_path = map(split($RUBYLIB,':'), 'v:val ==# "." ? "" : v:val') + let g:ruby_default_path = s:query_path($HOME) endif endif let s:ruby_paths = g:ruby_default_path diff --git a/sources_non_forked/vim-ruby/indent/eruby.vim b/sources_non_forked/vim-ruby/indent/eruby.vim index 62cd6cfa..3cb07a44 100644 --- a/sources_non_forked/vim-ruby/indent/eruby.vim +++ b/sources_non_forked/vim-ruby/indent/eruby.vim @@ -2,7 +2,6 @@ " Language: eRuby " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("b:did_indent") finish diff --git a/sources_non_forked/vim-ruby/indent/ruby.vim b/sources_non_forked/vim-ruby/indent/ruby.vim index b65e3fd2..09b92a19 100644 --- a/sources_non_forked/vim-ruby/indent/ruby.vim +++ b/sources_non_forked/vim-ruby/indent/ruby.vim @@ -3,7 +3,6 @@ " Maintainer: Andrew Radev " Previous Maintainer: Nikolai Weibull " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns " 0. Initialization {{{1 " ================= diff --git a/sources_non_forked/vim-ruby/syntax/eruby.vim b/sources_non_forked/vim-ruby/syntax/eruby.vim index ab74c803..c0aed306 100644 --- a/sources_non_forked/vim-ruby/syntax/eruby.vim +++ b/sources_non_forked/vim-ruby/syntax/eruby.vim @@ -2,7 +2,6 @@ " Language: eRuby " Maintainer: Tim Pope " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns if exists("b:current_syntax") finish diff --git a/sources_non_forked/vim-ruby/syntax/ruby.vim b/sources_non_forked/vim-ruby/syntax/ruby.vim index c50cca2e..f52f3afc 100644 --- a/sources_non_forked/vim-ruby/syntax/ruby.vim +++ b/sources_non_forked/vim-ruby/syntax/ruby.vim @@ -2,7 +2,6 @@ " Language: Ruby " Maintainer: Doug Kearns " URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns " ---------------------------------------------------------------------------- " " Previous Maintainer: Mirko Nasato diff --git a/sources_non_forked/vim-snipmate/README.md b/sources_non_forked/vim-snipmate/README.md index 2072d7c5..ea7c9883 100644 --- a/sources_non_forked/vim-snipmate/README.md +++ b/sources_non_forked/vim-snipmate/README.md @@ -14,41 +14,34 @@ Originally authored by [Michael Sanders][msanders], SnipMate was forked in 2011 after a stagnation in development. This fork is currently maintained by [Rok Garbas][garbas], [Marc Weber][marcweber], and [Adnan Zafar][ajzafar]. - ## Installing SnipMate ## -We recommend one of the following methods for installing SnipMate and its -dependencies. SnipMate depends on [vim-addon-mw-utils][mw-utils] and -[tlib][tlib]. +SnipMate can be installed using a package manager or using Vim's built-in +package handling. It does depend on [vim-addon-mw-utils][mw-utils] and +optionally [tlib][tlib]. For example, to use Vim's built-in support, + + % mkdir -p ~/.vim/pack/SnipMate/start + % cd ~/.vim/pack/SnipMate/start + % git clone https://github.com/garbas/vim-snipmate.git + % git clone https://github.com/MarcWeber/vim-addon-mw-utils.git + + # Optional: + % git clone https://github.com/tomtom/tlib_vim.git + % git clone https://github.com/honza/vim-snippets.git > **NOTE:** SnipMate does not ship with any snippets out of the box. We suggest looking at the [vim-snippets][vim-snippets] repository. -* Using [VAM][vam], add `vim-snippets` to the list of packages to be installed. +If tlib is enabled, it is used for multisnip (`:h SnipMate-multisnip`). It's +also required for the `:SnipMateOpenSnippetFiles` command. -* Using [Pathogen][pathogen], run the following commands: - - % cd ~/.vim/bundle - % git clone https://github.com/tomtom/tlib_vim.git - % git clone https://github.com/MarcWeber/vim-addon-mw-utils.git - % git clone https://github.com/garbas/vim-snipmate.git - - # Optional: - % git clone https://github.com/honza/vim-snippets.git - -* Using [Vundle][vundle], add the following to your `vimrc` then run - `:PluginInstall` - - Plugin 'MarcWeber/vim-addon-mw-utils' - Plugin 'tomtom/tlib_vim' - Plugin 'garbas/vim-snipmate' - - " Optional: - Plugin 'honza/vim-snippets' +Remember to run `:helptags ALL` once your Vim has loaded SnipMate! ## Using SnipMate ## -Press and try :SnipMateOpenSnippetFiles for starting. -Also see doc/SnipMate.txt to learn all SnipMate + +Install and create some snippets (see `:h SnipMate-snippets`). Then type in the +trigger for one in the correct filetype and hit the expansion key (by default +bound to ``). ## FAQ ## @@ -116,6 +109,22 @@ be found in the docs at `:h SnipMate-parser-versions`. ## Release Notes ## +Some changes listed here were contributed by non-maintainers. A full list can be +found at [Contributors.md](Contributors.md). + +### Current ### + +- Make tlib an optional dependency. +- Add SnipLookupPre and SnipLookupPost autocommand events +- Make version 1 of the snippet parser the default with no message + +### 0.90 - 2023-12-29 ### + +- Remove empty lines at the end of a `${VISUAL}` expansion +- Fix code for opening folds when expanding a snippet +- Deprecate legacy snippet parser +- Fix jumps when `&sel == 'exclusive'` + ### 0.89 - 2016-05-29 ### * Various regex updates to legacy parser diff --git a/sources_non_forked/vim-snipmate/autoload/snipMate.vim b/sources_non_forked/vim-snipmate/autoload/snipMate.vim index 9affc1d4..bd0276fa 100644 --- a/sources_non_forked/vim-snipmate/autoload/snipMate.vim +++ b/sources_non_forked/vim-snipmate/autoload/snipMate.vim @@ -3,12 +3,6 @@ if !exists('g:snipMate') let g:snipMate = {} endif -try - call tlib#input#List('mi', '', []) -catch /.*/ - echoe "tlib is missing. See install instructions at ".expand(':h:h').'/README.md' -endtry - fun! Filename(...) abort let filename = expand('%:t:r') if filename == '' | return a:0 == 2 ? a:2 : '' | endif @@ -26,6 +20,8 @@ function! snipMate#expandSnip(snip, version, col) abort if a:version == 1 let [snippet, b:snip_state.stops] = snipmate#parse#snippet(a:snip) + " only if zero stop doesn't exist + call s:add_zero_stop(snippet, b:snip_state.stops) " Build stop/mirror info let b:snip_state.stop_count = s:build_stops(snippet, b:snip_state.stops, lnum, col, indent) else @@ -57,6 +53,14 @@ function! snipMate#expandSnip(snip, version, col) abort return b:snip_state.set_stop(0) endfunction +function! s:add_zero_stop(snippet, stops) abort + if !exists("a:stops['0']") + let zero_stop = {'mirrors': [], 'placeholder': []} + call extend(a:snippet[-1], [[0, '', zero_stop]]) + call extend(a:stops, {'0': zero_stop}, 'keep') + endif +endfunction + function! s:insert_snippet_text(snippet, lnum, col, indent) let line = getline(a:lnum) let col = a:col @@ -147,10 +151,6 @@ function! s:build_stops(snippet, stops, lnum, col, indent) abort endif endfor - " add zero tabstop if it doesn't exist and then link it to the highest stop - " number - let stops[0] = get(stops, 0, - \ { 'placeholder' : [], 'line' : lnum, 'col' : col }) let stop_count = max(keys(stops)) + 2 let stops[stop_count - 1] = stops[0] @@ -175,6 +175,7 @@ function! s:build_loc_info(snippet, stops, lnum, col, seen_items) abort let stub.col = col call s:add_update_objects(stub, seen_items) + " if we've found a stop? if len(item) > 2 && type(item[1]) != type({}) let col = s:build_loc_info(item[1:-2], stops, lnum, col, seen_items) else @@ -211,7 +212,7 @@ fun! snipMate#ReadSnippetsFile(file) abort if !filereadable(a:file) | return [result, new_scopes] | endif let inSnip = 0 let line_no = 0 - let snipversion = get(g:snipMate, 'snippet_version', 0) + let snipversion = get(g:snipMate, 'snippet_version', 1) for line in readfile(a:file) + ["\n"] let line_no += 1 @@ -308,7 +309,7 @@ function! s:source_snippet() abort let new_snips = [] if fnamemodify(file, ':e') == 'snippet' call add(new_snips, [trigger, desc, join(readfile(file), "\n"), 0, - \ get(g:snipMate, 'snippet_version', 0)]) + \ get(g:snipMate, 'snippet_version', 1)]) else let [snippets, extends] = s:CachedSnips(file) let new_snips = deepcopy(snippets) @@ -421,6 +422,12 @@ function! s:snippet_dirs() abort endfunction function! snipMate#OpenSnippetFiles() abort + if !exists('g:loaded_tlib') || g:loaded_tlib < 41 + echom 'tlib is required for this command. ' + \ . 'Remember to run :packadd if necessary.' + return + endif + let files = [] let scopes_done = [] let exists = [] @@ -448,15 +455,50 @@ fun! snipMate#ScopesByFile() abort return filter(funcref#Call(g:snipMate.get_scopes), "v:val != ''") endf -" used by both: completion and insert snippet -fun! snipMate#GetSnippetsForWordBelowCursor(word, exact) abort +function! snipMate#flatten_filter_empty(list) abort + let result = [] + for item in a:list + if type(item) == type([]) + call extend(result, snipMate#flatten_filter_empty(item)) + elseif !empty(item) + call extend(result, [item]) + endif + unlet item " Avoid E706 + endfor + return result +endf + +function! s:determine_lookups(word) abort + let b:snip_word = a:word + + " gather any lookups from the Pre au + if exists('#User#SnipLookupPre') + doautocmd User SnipLookupPre + endif + + " If none are found, add the standard lookups + if !exists('b:snip_lookups') || empty(b:snip_lookups) + let b:snip_lookups = s:standard_lookups(b:snip_word) + endif + + " Run the Post au + if exists('#User#SnipLookupPost') + doautocmd User SnipLookupPost + endif + + " return the appropriate data, deleting buffer variables. + let ret = b:snip_lookups + unlet! b:snip_lookups b:snip_word + return ret +endfunction + +function! s:standard_lookups(word) abort " Split non-word characters into their own piece " so 'foo.bar..baz' becomes ['foo', '.', 'bar', '.', '.', 'baz'] " First split just after a \W and then split each resultant string just " before a \W - let parts = filter(tlib#list#Flatten( - \ map(split(a:word, '\W\zs'), 'split(v:val, "\\ze\\W")')), - \ '!empty(v:val)') + let parts = snipMate#flatten_filter_empty( + \ map(split(a:word, '\W\zs'), 'split(v:val, "\\ze\\W")')) " Only look at the last few possibilities. Too many can be slow. if len(parts) > 5 let parts = parts[-5:] @@ -469,7 +511,12 @@ fun! snipMate#GetSnippetsForWordBelowCursor(word, exact) abort call add(lookups, lookup) endif endfor + return lookups +endfunction +" used by both: completion and insert snippet +fun! snipMate#GetSnippetsForWordBelowCursor(word, exact) abort + let lookups = s:determine_lookups(a:word) " Remove empty lookup entries, but only if there are other nonempty lookups if len(lookups) > 1 call filter(lookups, 'v:val != ""') @@ -504,18 +551,17 @@ fun! s:ChooseSnippet(snippets) abort let snippet += [i.'. '.snip] let i += 1 endfor - if len(snippet) == 1 || get(g:snipMate, 'always_choose_first', 0) == 1 - " there's only a single snippet, choose it - let idx = 0 - else - let idx = tlib#input#List('si','select snippet by name',snippet) -1 - if idx == -1 - return '' + let i = 0 + if len(snippet) > 1 && get(g:snipMate, 'always_choose_first', 0) != 1 + if exists('g:loaded_tlib') && g:loaded_tlib >= 41 + let i = tlib#input#List('si','select snippet by name',snippet) - 1 + else + let i = inputlist(snippet + ['Select a snippet by number']) - 1 endif endif " if a:snippets[..] is a String Call returns it " If it's a function or a function string the result is returned - return funcref#Call(a:snippets[keys(a:snippets)[idx]]) + return (i == -1) ? '' : funcref#Call(a:snippets[keys(a:snippets)[i]]) endf fun! snipMate#WordBelowCursor() abort diff --git a/sources_non_forked/vim-snipmate/doc/snipMate.txt b/sources_non_forked/vim-snipmate/doc/snipMate.txt index 42f54a39..584b20bf 100644 --- a/sources_non_forked/vim-snipmate/doc/snipMate.txt +++ b/sources_non_forked/vim-snipmate/doc/snipMate.txt @@ -17,7 +17,7 @@ For Vim version 7.0 or later. This plugin only works if 'compatible' is not set. {Vi does not have any of these features.} -SnipMate depends on vim-addon-mw-utils and tlib. +SnipMate depends on vim-addon-mw-utils and optionally on tlib. ============================================================================== DESCRIPTION *SnipMate-description* @@ -75,6 +75,9 @@ Commands~ files will be shown, with the existing files shown first. + The optional dependency tlib is required for + this command to work. + :SnipMateLoadScope[!] scope [scope ...] Load snippets from additional scopes. Without [!] the additional scopes are loaded only in @@ -221,6 +224,44 @@ The list of possible mappings is as follows: Additionally, is mapped in visual mode in .snippets files for retabbing snippets. + + *SnipMate-autocmds* +Autocommands~ + +Autocommands allow code written by the user to be executed automatically at +certain points within SnipMate's normal execution. Here is a list of events +available to the User. All of these are subject to change. + +SnipTriggerPre *SnipMate-SnipTriggerPre* +SnipTriggerPost *SnipMate-SnipTriggerPost* + + These two events are run when determining what text to use as + the trigger. The Pre version can be used to forgo SnipMate's + normal lookups entirely, and the Post version can be used to + add to whatever lookups already exist. + + Both events have access to b:snip_word, a variable + containining the WORD before the cursor when snippet + triggering began, and b:snip_lookups, a |List| containing all + possible lookups that SnipMate should try as possible + triggers. They are tried in order from the beginning. + + If SnipTriggerPre runs and puts anything in b:snip_lookups, + SnipMate's normal lookups will not be tried. SnipTriggerPost + runs regardless. + + The following example only allows a '.' as a possible trigger + if the WORD before the cursor is not "self.": > + + au User SnipLookupPost call My_func() + + function My_func() abort + if match(b:snip_word, 'self\.$') != -1 + call filter(b:snip_lookups, "v:val !~# '^\\.$'") + endif + endfunction + + ============================================================================== SNIPPETS *SnipMate-snippets* @@ -583,6 +624,14 @@ Perhaps some of these features will be added in a later release. ============================================================================== CHANGELOG *SnipMate-changelog* +0.90 - 2023-12-29 +----------------- + +- Remove empty lines at the end of a `${VISUAL}` expansion +- Fix code for opening folds when expanding a snippet +- Deprecate legacy snippet parser +- Fix jumps when `&sel == 'exclusive'` + 0.89 - 2016-05-29 ----------------- diff --git a/sources_non_forked/vim-snipmate/plugin/snipMate.vim b/sources_non_forked/vim-snipmate/plugin/snipMate.vim index 068791ed..75e74aab 100644 --- a/sources_non_forked/vim-snipmate/plugin/snipMate.vim +++ b/sources_non_forked/vim-snipmate/plugin/snipMate.vim @@ -57,10 +57,6 @@ endif let g:snipMate['no_match_completion_feedkeys_chars'] = \ get(g:snipMate, 'no_match_completion_feedkeys_chars', "\t") -if !exists('g:snipMate.snippet_version') - echom 'The legacy SnipMate parser is deprecated. Please see :h SnipMate-deprecate.' -endif - " Add default scope aliases, without overriding user settings let g:snipMate.scope_aliases = get(g:snipMate, 'scope_aliases', {}) if exists('g:snipMate_no_default_aliases') diff --git a/sources_non_forked/vim-snippets/README.md b/sources_non_forked/vim-snippets/README.md index a54c3134..8cf06c4b 100644 --- a/sources_non_forked/vim-snippets/README.md +++ b/sources_non_forked/vim-snippets/README.md @@ -169,6 +169,9 @@ on the fly adding those. Currently all snippets from UltiSnips have been put into `/UltiSnips` - some work on merging should be done (dropping duplicates etc). Also see engines section above. +Since UltiSnips supports both UltiSnip and vim-snipmate snippets, when +contributing fixes/new snippets, please prefer adding vim-snipmate snippets. + Related repositories -------------------- diff --git a/sources_non_forked/vim-snippets/UltiSnips/java.snippets b/sources_non_forked/vim-snippets/UltiSnips/java.snippets index 55883a36..9c7ed820 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/java.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/java.snippets @@ -21,7 +21,7 @@ def nl(snip): snip.rv += " " def getArgs(group): import re - word = re.compile('[a-zA-Z0-9><.]+ \w+') + word = re.compile(r'[a-zA-Z0-9><.]+ \w+') return [i.split(" ") for i in word.findall(group) ] def camel(word): diff --git a/sources_non_forked/vim-snippets/UltiSnips/php.snippets b/sources_non_forked/vim-snippets/UltiSnips/php.snippets index f27ac8be..def1ca4d 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/php.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/php.snippets @@ -6,7 +6,7 @@ import vim # Set g:ultisnips_php_scalar_types to 1 if you'd like to enable PHP 7's scalar types for return values def isPHPScalarTypesEnabled(): isEnabled = vim.eval("get(g:, 'ultisnips_php_scalar_types', 0)") == "1" - return isEnabled or re.match('<\?php\s+declare\(strict_types=[01]\);', '\n'.join(vim.current.window.buffer)) + return isEnabled or re.match(r'<\?php\s+declare\(strict_types=[01]\);', '\n'.join(vim.current.window.buffer)) endglobal ## Snippets from SnipMate, taken from diff --git a/sources_non_forked/vim-snippets/UltiSnips/rst.snippets b/sources_non_forked/vim-snippets/UltiSnips/rst.snippets index da9bc75e..6e31e616 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/rst.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/rst.snippets @@ -285,7 +285,7 @@ snippet fnt "Footnote or Citation" i .. [$1] ${2:Reference} endsnippet -# Only for Nikola - Static Site Generator +# Only for Nikola — Static Site Generator snippet chart "Pygal chart for Nikola" b .. chart:: $1`!p snip.rv=complete(t[1], CHART_TYPES)` :title: '${2:Browser usage evolution (in %)}' diff --git a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets index 393b3eee..69d86f44 100644 --- a/sources_non_forked/vim-snippets/UltiSnips/tex.snippets +++ b/sources_non_forked/vim-snippets/UltiSnips/tex.snippets @@ -36,24 +36,6 @@ endglobal # ENVIRONMENT # ############### -snippet beg "begin{} / end{}" bi -\begin{$1} - ${0:${VISUAL}} -\end{$1} -endsnippet - -snippet cnt "Center" bi -\begin{center} - ${0:${VISUAL}} -\end{center} -endsnippet - -snippet desc "Description" bi -\begin{description} - \item[${1:${VISUAL}}] $0 -\end{description} -endsnippet - snippet lemma "Lemma" bi \begin{lemma} ${0:${VISUAL}} @@ -135,24 +117,6 @@ snippet fig "Figure environment" bi \end{figure} endsnippet -snippet enum "Enumerate" bi -\begin{enumerate} - \item ${0:${VISUAL}} -\end{enumerate} -endsnippet - -snippet item "Itemize" bi -\begin{itemize} - \item ${0:${VISUAL}} -\end{itemize} -endsnippet - -snippet case "cases" bi -\begin{cases} - ${0:${VISUAL}} -\end{cases} -endsnippet - snippet abs "abstract environment" b \begin{abstract} ${0:${VISUAL}} @@ -247,26 +211,6 @@ snippet srto "... Root" wi \sqrt[$1]{${2:${VISUAL}}}$0 endsnippet -snippet bf "Bold" wi -\bf{${1:${VISUAL}}}$0 -endsnippet - -snippet it "Italic" wi -\it{${1:${VISUAL}}}$0 -endsnippet - -snippet un "Underline" wi -\un{${1:${VISUAL}}}$0 -endsnippet - -snippet rm "Text" wi -\rm{${1:${VISUAL}}}$0 -endsnippet - -snippet itm "Item" wi -\item ${0:${VISUAL}} -endsnippet - snippet ceil "Ceil" w \left\lceil $1 \right\rceil $0 endsnippet @@ -283,34 +227,10 @@ snippet bmat "Bmat" w \begin{bmatrix} $1 \end{bmatrix} $0 endsnippet -snippet () "Left( right)" w -\left( ${1:${VISUAL}} \right) $0 -endsnippet - -snippet lr "left( right)" i -\left( ${1:${VISUAL}} \right) $0 -endsnippet - -snippet lr( "left( right)" i -\left( ${1:${VISUAL}} \right) $0 -endsnippet - -snippet lr| "left| right|" i -\left| ${1:${VISUAL}} \right| $0 -endsnippet - -snippet lr{ "left\{ right\}" i -\left\\{ ${1:${VISUAL}} \right\\} $0 -endsnippet - snippet lrb "left\{ right\}" i \left\\{ ${1:${VISUAL}} \right\\} $0 endsnippet -snippet lr[ "left[ right]" i -\left[ ${1:${VISUAL}} \right] $0 -endsnippet - snippet lra "leftangle rightangle" wi \left<${1:${VISUAL}} \right>$0 endsnippet @@ -467,112 +387,4 @@ snippet ac "Acroynm normal" bi \ac{${1:acronym}} endsnippet -snippet ni "Non-indented paragraph" bi -\noindent -endsnippet - - -############ -# SECTIONS # -############ - -snippet chap "Chapter" wi -\chapter{$1${VISUAL}} -endsnippet - -snippet sec "Section" wi -\section{$1${VISUAL}} -endsnippet - -snippet sec* "Section*" wi -\section*{$1${VISUAL}} -endsnippet - -snippet sub "Subsection" wi -\subsection{$1${VISUAL}} -endsnippet - -snippet sub* "Subsection*" wi -\subsection*{$1${VISUAL}} -endsnippet - -snippet subsub "Subsection" wi -\subsubsection{$1${VISUAL}} -endsnippet - -snippet subsub* "Subsubsection" wi -\subsubsection*{$1${VISUAL}} -endsnippet - -snippet par "Paragraph" wi -\paragraph{$1${VISUAL}} -endsnippet - -snippet par* "Paragraph*" wi -\paragraph*{$1${VISUAL}} -endsnippet - -snippet subpar "Sub Paragraph" wi -\subparagraph{$1${VISUAL}} -endsnippet - -snippet subpar* "Sub Paragraph*" wi -\subparagraph*{$1${VISUAL}} -endsnippet - -snippet chapl "Chapter with label" wi -\chapter{$1${VISUAL}} -\label{cha:${2:${1/\W+/-/g}}} -endsnippet - -snippet secl "Section with label" wi -\section{$1${VISUAL}} -\label{sec:${2:${1/\W+/-/g}}} -endsnippet - -snippet sec*l "Section* with label" wi -\section*{$1${VISUAL}} -\label{sec:${2:${1/\W+/-/g}}} -endsnippet - -snippet subl "Subsection with label" wi -\subsection{$1${VISUAL}} -\label{sub:${2:${1/\W+/-/g}}} -endsnippet - -snippet sub*l "Subsection* with label" wi -\subsection*{$1${VISUAL}} -\label{sub:${2:${1/\W+/-/g}}} -endsnippet - -snippet subsubl "Subsection with label" wi -\subsubsection{$1${VISUAL}} -\label{ssub:${2:${1/\W+/-/g}}} -endsnippet - -snippet subsub*l "Subsubsection with label" wi -\subsubsection*{$1${VISUAL}} -\label{ssub:${2:${1/\W+/-/g}}} -endsnippet - -snippet parl "Paragraph with label" wi -\paragraph{$1${VISUAL}} -\label{par:${2:${1/\W+/-/g}}} -endsnippet - -snippet par*l "Paragraph* with label" wi -\paragraph*{$1${VISUAL}} -\label{par:${2:${1/\W+/-/g}}} -endsnippet - -snippet subparl "Sub Paragraph with label" wi -\subparagraph{$1${VISUAL}} -\label{subp:${2:${1/\W+/-/g}}} -endsnippet - -snippet subpar*l "Sub Paragraph* with label" wi -\subparagraph*{$1${VISUAL}} -\label{subp:${2:${1/\W+/-/g}}} -endsnippet - # vim:ft=snippets: diff --git a/sources_non_forked/vim-snippets/pythonx/vimsnippets.py b/sources_non_forked/vim-snippets/pythonx/vimsnippets.py index eceb83c5..68b430e4 100644 --- a/sources_non_forked/vim-snippets/pythonx/vimsnippets.py +++ b/sources_non_forked/vim-snippets/pythonx/vimsnippets.py @@ -14,7 +14,7 @@ def complete(tab, opts): :return: a string that match with tab """ el = [x for x in tab] - pat = "".join(list(map(lambda x: x + "\w*" if re.match("\w", x) else x, + pat = "".join(list(map(lambda x: x + r"\w*" if re.match(r"\w", x) else x, el))) try: opts = [x for x in opts if re.search(pat, x, re.IGNORECASE)] diff --git a/sources_non_forked/vim-snippets/snippets/c.snippets b/sources_non_forked/vim-snippets/snippets/c.snippets index df5595b9..a3f4d5c9 100644 --- a/sources_non_forked/vim-snippets/snippets/c.snippets +++ b/sources_non_forked/vim-snippets/snippets/c.snippets @@ -16,11 +16,9 @@ snippet mainn # #include <...> snippet inc #include <${1:stdio}.h> - $0 # #include "..." snippet Inc #include "${1:`vim_snippets#Filename("$1.h")`}" - $0 # ifndef...define...endif snippet ndef #ifndef $1 diff --git a/sources_non_forked/vim-snippets/snippets/cpp.snippets b/sources_non_forked/vim-snippets/snippets/cpp.snippets index 3bd1f001..bb9528a6 100644 --- a/sources_non_forked/vim-snippets/snippets/cpp.snippets +++ b/sources_non_forked/vim-snippets/snippets/cpp.snippets @@ -251,3 +251,29 @@ snippet sr "std::ranges::" # STL std::views:: snippet sv "std::views::" std::views:: +## +## Tests +# GTest:add main +snippet gtemain "GTest:add main" + int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); + } +# GTest:add test +snippet gtetest "GTest:add test" + TEST(${1:SuiteName}, ${2:TestName}) { + ${0} + } +# GTest:add fixture +snippet gtefix "GTest:add fixture" + TEST_F(${1:SuiteName}, ${2:TestName}) { + ${0} + } +# GTest:add parameterized test +snippet gtepar "GTest:add parameterized test" + TEST_P(${1:SuiteName}, ${2:TestName}) { + ${0} + } +# GTest:instantiate parameterized test +snippet gteparins "GTest:instantiate parameterized test" + INSTANTIATE_TEST_SUITE_P(${1:InstantiationName}, ${2:SuiteName}, ${0}); diff --git a/sources_non_forked/vim-snippets/snippets/dart.snippets b/sources_non_forked/vim-snippets/snippets/dart.snippets index f4fd4f13..30ab3d5d 100644 --- a/sources_non_forked/vim-snippets/snippets/dart.snippets +++ b/sources_non_forked/vim-snippets/snippets/dart.snippets @@ -1,3 +1,10 @@ +snippet af + (${1}) {${2}}${0} +snippet pr + print(${1}); +snippet deb + debugger(); + ${0} snippet lib library ${1}; ${0} diff --git a/sources_non_forked/vim-snippets/snippets/scheme.snippets b/sources_non_forked/vim-snippets/snippets/scheme.snippets index 4c0c78a0..0aa13794 100644 --- a/sources_non_forked/vim-snippets/snippets/scheme.snippets +++ b/sources_non_forked/vim-snippets/snippets/scheme.snippets @@ -17,7 +17,7 @@ snippet * # Definition snippet def (define (${1:name}) - ${0:definition}) + ${0:definition}) # Definition with lambda snippet defl diff --git a/sources_non_forked/vim-snippets/snippets/tex.snippets b/sources_non_forked/vim-snippets/snippets/tex.snippets index 3dddd184..4d54fe01 100644 --- a/sources_non_forked/vim-snippets/snippets/tex.snippets +++ b/sources_non_forked/vim-snippets/snippets/tex.snippets @@ -195,11 +195,21 @@ snippet par \paragraph \\paragraph{${1:paragraph name}}% \\label{par:${2:$1}} ${0} +# Paragraph* +snippet par* \paragraph* + \\paragraph*{${1:paragraph name}}% + \\label{par:${2:$1}} + ${0} # Sub Paragraph snippet subp \subparagraph \\subparagraph{${1:subparagraph name}}% \\label{subp:${2:$1}} ${0} +# Sub Paragraph* +snippet subp* \subparagraph* + \\subparagraph*{${1:subparagraph name}}% + \\label{subp:${2:$1}} + ${0} snippet ni \noindent \\noindent ${0} diff --git a/sources_non_forked/vim-surround/README.markdown b/sources_non_forked/vim-surround/README.markdown index 3deb96a5..d2a5c298 100644 --- a/sources_non_forked/vim-surround/README.markdown +++ b/sources_non_forked/vim-surround/README.markdown @@ -74,7 +74,7 @@ support: > How do I surround without adding a space? -Only the opening brackets (`[`, `{`, and `(`) add a space. Use a closing +Only the opening brackets—`[`, `{`, and `(`—add a space. Use a closing bracket, or the `b` (`(`) and `B` (`{`) aliases. ## Contributing