From 800c7976a1a7556de76a856373c7dd1eec7662c7 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Wed, 25 Mar 2026 12:19:28 -0500 Subject: [PATCH] Initial commit --- .cspell/words.txt | 450 +++++ .dockerignore | 3 + .gitignore | 7 + Dockerfile | 275 ++++ build_all.sh | 26 + build_common.sh | 34 + build_nvim.sh | 30 + build_nvim2.sh | 30 + common.sh | 97 ++ create_tarballs.sh | 55 + dviml.sh | 27 + dviml2.sh | 27 + dviml_common.sh | 45 + entrypoint.sh | 37 + icons/COblivion.ico | Bin 0 -> 130535 bytes icons/Oblivion.ico | Bin 0 -> 174304 bytes icons/dracula.ico | Bin 0 -> 158230 bytes nvim/coc-settings.unix.json | 4 + nvim/coc-settings.windows.json | 4 + nvim/init.lua | 34 + nvim/lua/darcula/autocmds.lua | 229 +++ nvim/lua/darcula/config/init.lua | 230 +++ nvim/lua/darcula/cspell/init.lua | 211 +++ nvim/lua/darcula/flutter/init.lua | 369 +++++ nvim/lua/darcula/haven/init.lua | 718 ++++++++ nvim/lua/darcula/keymaps.lua | 1460 +++++++++++++++++ nvim/lua/darcula/options.lua | 113 ++ nvim/lua/darcula/plugins.lua | 168 ++ nvim/lua/darcula/setup.lua | 26 + nvim/lua/darcula/setup/100_coc.lua | 168 ++ nvim/lua/darcula/setup/100_mason.lua | 103 ++ nvim/lua/darcula/setup/200_lsp.lua | 89 + nvim/lua/darcula/setup/300_mini_fuzzy.lua | 20 + nvim/lua/darcula/setup/300_mini_icons.lua | 22 + nvim/lua/darcula/setup/300_mini_keymap.lua | 20 + nvim/lua/darcula/setup/300_mini_misc.lua | 20 + nvim/lua/darcula/setup/400_mini_ai.lua | 33 + nvim/lua/darcula/setup/400_mini_comment.lua | 20 + .../lua/darcula/setup/400_mini_completion.lua | 41 + nvim/lua/darcula/setup/400_mini_move.lua | 34 + nvim/lua/darcula/setup/400_mini_notify.lua | 43 + nvim/lua/darcula/setup/400_mini_pairs.lua | 20 + nvim/lua/darcula/setup/400_mini_snippets.lua | 60 + nvim/lua/darcula/setup/400_mini_starter.lua | 147 ++ .../lua/darcula/setup/400_mini_statusline.lua | 20 + nvim/lua/darcula/setup/400_mini_surround.lua | 37 + nvim/lua/darcula/setup/500_colorizer.lua | 20 + nvim/lua/darcula/setup/500_cppman.lua | 20 + nvim/lua/darcula/setup/500_dap.lua | 177 ++ nvim/lua/darcula/setup/500_dispatch.lua | 20 + nvim/lua/darcula/setup/500_dressing.lua | 30 + nvim/lua/darcula/setup/500_flutter.lua | 20 + nvim/lua/darcula/setup/500_flutter_tools.lua | 24 + nvim/lua/darcula/setup/500_formatter.lua | 69 + nvim/lua/darcula/setup/500_gitsigns.lua | 41 + nvim/lua/darcula/setup/500_haven.lua | 36 + nvim/lua/darcula/setup/500_lightbulb.lua | 56 + nvim/lua/darcula/setup/500_nvim_tree.lua | 77 + nvim/lua/darcula/setup/500_scrollview.lua | 28 + nvim/lua/darcula/setup/500_telescope.lua | 101 ++ nvim/lua/darcula/setup/500_treesitter.lua | 24 + .../lua/darcula/setup/500_vim_dart_plugin.lua | 24 + nvim/lua/darcula/setup/500_window_picker.lua | 27 + nvim/lua/darcula/usercmds.lua | 80 + nvim/lua/darcula/utils/fortune.lua | 883 ++++++++++ nvim/lua/darcula/utils/globals.lua | 315 ++++ nvim/lua/darcula/utils/init.lua | 233 +++ nvim/lua/darcula/utils/keymap.lua | 76 + nvim/lua/darcula/utils/os/init.lua | 23 + nvim/lua/darcula/utils/path/init.lua | 49 + nvim/lua/darcula/utils/string/init.lua | 44 + nvim/lua/darcula/utils/symbols.lua | 104 ++ nvim/lua/darcula/utils/table/init.lua | 42 + nvim/lua/darcula/utils/ui/init.lua | 26 + viml.sh | 30 + viml2.sh | 30 + viml_common.sh | 38 + 77 files changed, 8373 insertions(+) create mode 100644 .cspell/words.txt create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100755 build_all.sh create mode 100755 build_common.sh create mode 100755 build_nvim.sh create mode 100755 build_nvim2.sh create mode 100755 common.sh create mode 100755 create_tarballs.sh create mode 100755 dviml.sh create mode 100755 dviml2.sh create mode 100755 dviml_common.sh create mode 100755 entrypoint.sh create mode 100644 icons/COblivion.ico create mode 100644 icons/Oblivion.ico create mode 100644 icons/dracula.ico create mode 100644 nvim/coc-settings.unix.json create mode 100644 nvim/coc-settings.windows.json create mode 100644 nvim/init.lua create mode 100644 nvim/lua/darcula/autocmds.lua create mode 100644 nvim/lua/darcula/config/init.lua create mode 100644 nvim/lua/darcula/cspell/init.lua create mode 100644 nvim/lua/darcula/flutter/init.lua create mode 100644 nvim/lua/darcula/haven/init.lua create mode 100644 nvim/lua/darcula/keymaps.lua create mode 100644 nvim/lua/darcula/options.lua create mode 100644 nvim/lua/darcula/plugins.lua create mode 100644 nvim/lua/darcula/setup.lua create mode 100644 nvim/lua/darcula/setup/100_coc.lua create mode 100644 nvim/lua/darcula/setup/100_mason.lua create mode 100644 nvim/lua/darcula/setup/200_lsp.lua create mode 100644 nvim/lua/darcula/setup/300_mini_fuzzy.lua create mode 100644 nvim/lua/darcula/setup/300_mini_icons.lua create mode 100644 nvim/lua/darcula/setup/300_mini_keymap.lua create mode 100644 nvim/lua/darcula/setup/300_mini_misc.lua create mode 100644 nvim/lua/darcula/setup/400_mini_ai.lua create mode 100644 nvim/lua/darcula/setup/400_mini_comment.lua create mode 100644 nvim/lua/darcula/setup/400_mini_completion.lua create mode 100644 nvim/lua/darcula/setup/400_mini_move.lua create mode 100644 nvim/lua/darcula/setup/400_mini_notify.lua create mode 100644 nvim/lua/darcula/setup/400_mini_pairs.lua create mode 100644 nvim/lua/darcula/setup/400_mini_snippets.lua create mode 100644 nvim/lua/darcula/setup/400_mini_starter.lua create mode 100644 nvim/lua/darcula/setup/400_mini_statusline.lua create mode 100644 nvim/lua/darcula/setup/400_mini_surround.lua create mode 100644 nvim/lua/darcula/setup/500_colorizer.lua create mode 100644 nvim/lua/darcula/setup/500_cppman.lua create mode 100644 nvim/lua/darcula/setup/500_dap.lua create mode 100644 nvim/lua/darcula/setup/500_dispatch.lua create mode 100644 nvim/lua/darcula/setup/500_dressing.lua create mode 100644 nvim/lua/darcula/setup/500_flutter.lua create mode 100644 nvim/lua/darcula/setup/500_flutter_tools.lua create mode 100644 nvim/lua/darcula/setup/500_formatter.lua create mode 100644 nvim/lua/darcula/setup/500_gitsigns.lua create mode 100644 nvim/lua/darcula/setup/500_haven.lua create mode 100644 nvim/lua/darcula/setup/500_lightbulb.lua create mode 100644 nvim/lua/darcula/setup/500_nvim_tree.lua create mode 100644 nvim/lua/darcula/setup/500_scrollview.lua create mode 100644 nvim/lua/darcula/setup/500_telescope.lua create mode 100644 nvim/lua/darcula/setup/500_treesitter.lua create mode 100644 nvim/lua/darcula/setup/500_vim_dart_plugin.lua create mode 100644 nvim/lua/darcula/setup/500_window_picker.lua create mode 100644 nvim/lua/darcula/usercmds.lua create mode 100644 nvim/lua/darcula/utils/fortune.lua create mode 100644 nvim/lua/darcula/utils/globals.lua create mode 100644 nvim/lua/darcula/utils/init.lua create mode 100644 nvim/lua/darcula/utils/keymap.lua create mode 100644 nvim/lua/darcula/utils/os/init.lua create mode 100644 nvim/lua/darcula/utils/path/init.lua create mode 100644 nvim/lua/darcula/utils/string/init.lua create mode 100644 nvim/lua/darcula/utils/symbols.lua create mode 100644 nvim/lua/darcula/utils/table/init.lua create mode 100644 nvim/lua/darcula/utils/ui/init.lua create mode 100755 viml.sh create mode 100755 viml2.sh create mode 100755 viml_common.sh diff --git a/.cspell/words.txt b/.cspell/words.txt new file mode 100644 index 0000000..327285b --- /dev/null +++ b/.cspell/words.txt @@ -0,0 +1,450 @@ +--dearmor +--userns +-declipse +-dlog +-dosgi +1nh1shungry +_mbcs +abap +abaqus +acpiasl +ahdl +ahmedkhalf +aidl +airblade +akinsho +alacritty +ale_virtualtext_cursor +alepez +alsaconf +alskdjfhgwoeiruty +ampl +antoinemadec +apachestyle +applescript +appname +aptconf +astyle +augroup +autocmd +autocmds +autogen +autoload +autopairs +autotrigger +barbar +bashls +bbuild +belowright +blankline +blinkoff400 +blinkon +blinkwait700 +block-blinkwait175-blinkoff150-blinkon175 +blockwise +borderchars +briones +bufhidden +buflisted +bufname +bufnr +bufs +buftype +buildifier +builtins +catgoose +cclose +cflags +changedelete +chatgpt +chdir +checktime +choosewin +clangd +clangformat +clangtidy +classobj +closeoff +cmake +cmap +cmdheight +cmdline +cmp_luasnip +cnext +cnoreabbrev +codeaction +codefmt +codespell +colorcolumn +colorterm +commandline +completefunc +completeopt +conceallevel +copen +cowsay +cppcheck +cppdbg +cpplint +cppman +cpptools +cppvsdbg +cprev +ctermbg +ctermfg +cursorcolumn +cursorline +cust_ +cword +dapui +darcula +dartfmt +dartformat +dartls +datapath +dcmake_build_type +delims +deluser +devicons +diffoff +diffopt +diffutils +dotfiles +doums +dpkg +dstein64 +dsun +dviml +dviml2 +dviml_common +easymotion +echohl +editmsg +enable_autosnippets +enabledelayedexpansion +enableextensions +endfunction +endlocal +equalalways +errorbells +eslint +eval +executable +expandtab +extmark +fannheyward +fernflower +fifthgrid +fileencoding +fileformat +filereadable +fillchars +findstr +findutils +fname +fnamemodify +focusable +foldcolumn +folke +force_twostep +freepos +fs_copyfile +fs_scandir +fs_scandir_next +ftplugin +funcobj +getbufinfo +getcmdline +getcmdtype +getcwd +getreg +gettype +gitsigns +globalstatus +gname +gofmt +gofumpt +gopls +gos +gpath +gradlew +gruvbox +gtest +guibg +guicursor +guifg +guifont +guioptions +guipopupmenu +helpclose +hlsearch +homedrive +homepath +honza +hrsh7th +hrtime +ignorecase +imap +incsearch +indentexpr +invrelativenumber +invwrap +isdirectory +iskeyword +javaagent +javaw +jdtls +joinpath +jsdoc +kanagawa +keycodes +keymap +keymaps +keyrings +keywordprg +kosayoda +kyazdani42 +kylechui +laststatus +lclose +leoluz +linehl +linematch +listchars +lldb +lnext +localappdata +localedef +loclist +lopen +lprev +lspconfig +luadev +luadoc +luafmt +luaformat +luaformatter +luaformatterfiveone +lualine +luap +luaparenerror +luasnip +lukas +madskjeldgaard +maktaba +malloc +map_multistep +mapleader +maplocalleader +markdownlint +matchpairs +matchparen +matchparenforeground +maxmempattern +menuone +messagesopt +mfussenegger +mhartington +mhinz +minipairs +minipairs_cr +minisnippets +minisnippets_expand +minisnippets_next +mkdir +mousehide +msgsep +multigrid +muniftanjim +mvdan +mvnw +nbsp +neoclide +neodev +neomake +neotest +neovide +neovim +nmakeprg +nmap +nobackup +nocp +noequalalways +nofile +nohl +noice +noinsert +nokernelcrypto +nomousehide +nopasswd +norcalli +noremap +noselect +noshowmode +notificationss +nowait +nowrap +nowritebackup +numberwidth +numhl +nv_darcula_open_nvim_tree +nvim +nvim_feedkeys +nvimrc +olivercederborg +omnifunc +omnisharp +openai_params +opleader +outputresource +packadd +packloadall +pcbp +phaazon +phpdoc +pmenu +poimandres +popd +popupmenu +precondit +proto +pubspec +pumborder +pumvisible +puremourning +pushd +python3-venv +pythonpath +qall +qflist +quickfix +rcarriga +readfile +readlink +rebelot +redrawtime +reflog +reindent_linewise +reineke +relativenumber +ringbuf +rktjmp +rustfmt +saadparwaiz1 +sainnhe +sbar +scrolloff +scrollview +setlocal +setloclist +setreg +setup_jsonls +sgraves +shada +sheerun +shellcheck +shellcmdflag +shfmt +shiftwidth +shortmess +show_autosnippets +showbreak +showmatch +showmode +sidescrolloff +signcolumn +skynet_mount +smartcase +softtabstop +splitbelow +splitright +starlark +statox +statusline +stdpath +stevearc +stlnc +struct +stsewd +sumhexa +sumneko +swapfile +sysname +systemlist +tabclose +tabfirst +tablast +tabline +tabnew +tabnext +tabprevious +termcodes +termguicolors +texthl +textobjects +thirdparty +tmap +to_vimscript +topdelete +tpope +treesitter +truecolor +tspunctbracket +tspunctdelimiter +tspunctspecial +tsuri +ttimeoutlen +ultisnips +undodir +undofile +unittests +unnamedplus +unstaged +updatetime +usercmds +userprofile +utctime +utils +vala +valac +venv +vim_startify +vimc +vimdoc +vimfiles +vimgrep +viminfo +vimls +vimlsp +vimo +vimrc +vimruntime +vimspector +vimspectorballooneval +vimspectorbpcond +vimspectoreval +virt +vmap +vmargs +vsdbg +vsplit +wildmenu +wildmode +williamboman +winblend +winborder +wincmd +windwp +winfixheight +winfixwidth +winhighlight +wmdocker +writebackup +writefile +xbootclasspath +xiyaowong +xlog +xmap +xvzf +yapf +yaps \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..eef6906 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +# .dockerignore +nvim/coc-settings.json +nvim/nvim-pack-lock.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eee97eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.git/ +coc-settings.json +cspell.json +dap/ +nvim-pack-lock.json +nvim/lua/darcula/custom.lua +pkg/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..13b40b8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,275 @@ +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +FROM ubuntu:noble +MAINTAINER Scott E. Graves + +USER root + +ARG NVIM_ARCH +ARG NVIM_ARCH2 +ARG NVIM_OS +ARG NV_DARCULA_ENABLE_COC + +ENV \ + GID="1000" \ + GNAME="neovim" \ + LANG=en_US.utf8 \ + NVIM_APPNAME=nvim \ + NV_DARCULA_APPS="/home/neovim/.local/share/nvim/" \ + NV_DARCULA_ENABLE_COC=${NV_DARCULA_ENABLE_COC} \ + PATH="/nvim-${NVIM_OS}-${NVIM_ARCH}/bin:/python/bin:/home/neovim/go/bin:/home/neovim/.local/bin:/home/neovim/flutter/bin:/home/neovim/.pub-cache/bin:/usr/bin/core_perl:${PATH}" \ + PYTHONPATH="/python" \ + SHELL="/bin/bash" \ + TMPDIR=/tmp \ + UID="1000" \ + UNAME="neovim" + +RUN \ + apt-get update -y && apt-get upgrade -y && \ + apt-get install -y curl locales software-properties-common && \ + localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 && \ + curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \ + install -m 0755 -d /etc/apt/keyrings && \ + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && \ + chmod a+r /etc/apt/keyrings/docker.gpg && \ + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \ + add-apt-repository ppa:unit193/encryption -y && \ + apt-get update -y && \ + apt-get install -y \ + android-sdk \ + android-sdk-build-tools \ + autoconf \ + automake \ + bash \ + bzip2 \ + clang \ + cmake \ + codespell \ + containerd.io \ + cppcheck \ + curl \ + diffutils \ + docker-buildx-plugin \ + docker-ce \ + docker-ce-cli \ + docker-compose-plugin \ + findutils \ + fuse3 \ + fzf \ + gcc \ + git \ + gnupg \ + golang \ + grep \ + gzip \ + jq \ + less \ + libtool \ + llvm \ + m4 \ + make \ + nano \ + ninja-build \ + nodejs \ + openjdk-21-jdk \ + openssh-client \ + openssh-server \ + patch \ + perl \ + pkgconf \ + python3 \ + python3-pip \ + python3-venv \ + ripgrep \ + rsync \ + shellcheck \ + sed \ + tar \ + tidy \ + unrar \ + unzip \ + valac \ + valgrind \ + veracrypt \ + vlc \ + wget \ + wmdocker \ + zip && \ + apt clean && \ + rm -rf /var/lib/apt/lists/* && \ + deluser ubuntu && \ + rm -rf /home/ubuntu && \ + groupadd -g ${GID} "${GNAME}" && \ + useradd -m -u ${UID} -g ${GNAME} -s ${SHELL} ${UNAME} && \ + echo "${UNAME} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + groupmod -g 962 docker && \ + groupmod -a -U ${UNAME} docker + +COPY \ + entrypoint.sh /entrypoint.sh + +RUN \ + chmod +x /entrypoint.sh && \ + chown ${UNAME}:${GNAME} /entrypoint.sh + +RUN \ + git clone https://github.com/LuaLS/lua-language-server && \ + cd lua-language-server && \ + chmod +x ./make.sh && \ + ./make.sh && \ + mv lua-language-server /usr/bin && \ + chmod +x /usr/bin/lua-language-server && \ + cd - && \ + rm -rf lua-language-server + +RUN \ + npm i -g cspell && \ + npm i -g eslint && \ + npm i -g js-beautify && \ + npm i -g lua-fmt && \ + npm i -g neovim && \ + npm i -g npm && \ + npm i -g prettier && \ + npm i -g tree-sitter-cli + +RUN \ + python3 -m venv /python && \ + pip3 install -U pip && \ + pip3 install -U cmake-language-server && \ + pip3 install -U coverage && \ + pip3 install -U cpplint && \ + pip3 install -U jedi && \ + pip3 install -U jedi-language-server && \ + pip3 install -U neovim && \ + pip3 install -U pylint && \ + CFLAGS=-Wno-incompatible-pointer-types pip3 install -U cppman + +COPY \ + nvim/ /root/.config/nvim/ + +COPY \ + dap/ /root/.config/nvim/dap/ + +COPY \ + pkg/ /root/.config/nvim/pkg/ + +RUN \ + tar xvzf /root/.config/nvim/pkg/nvim-${NVIM_OS}-${NVIM_ARCH}.tar.gz -C / + +RUN \ + mkdir -p "${NV_DARCULA_APPS}/dap/cpp" && \ + unzip /root/.config/nvim/dap/cpptools-${NVIM_OS}-${NVIM_ARCH2}.vsix -d "${NV_DARCULA_APPS}/dap/cpp" && \ + chmod +x "${NV_DARCULA_APPS}/dap/cpp/extension/debugAdapters/bin/OpenDebugAD7" && \ + cd "${NV_DARCULA_APPS}" && \ + git clone https://github.com/Dart-Code/Dart-Code.git && \ + cd "${NV_DARCULA_APPS}/Dart-Code" && \ + npm i && \ + npx webpack --mode production + +RUN \ + nvim --headless "+qall" + +RUN \ + if [ "$NV_DARCULA_ENABLE_COC" = "true" ]; then \ + nvim --headless "+CocInstall -sync coc-calc" "+qall" && \ + nvim --headless "+CocInstall -sync coc-clang-format-style-options" "+qall" && \ + nvim --headless "+CocInstall -sync coc-clangd" "+qall" && \ + nvim --headless "+CocInstall -sync coc-cmake" "+qall" && \ + nvim --headless "+CocInstall -sync coc-css" "+qall" && \ + nvim --headless "+CocInstall -sync coc-eslint" "+qall" && \ + nvim --headless "+CocInstall -sync coc-flutter" "+qall" && \ + nvim --headless "+CocInstall -sync coc-go" "+qall" && \ + nvim --headless "+CocInstall -sync coc-highlight" "+qall" && \ + nvim --headless "+CocInstall -sync coc-html" "+qall" && \ + nvim --headless "+CocInstall -sync coc-java" "+qall" && \ + nvim --headless "+CocInstall -sync coc-jedi" "+qall" && \ + nvim --headless "+CocInstall -sync coc-jest" "+qall" && \ + nvim --headless "+CocInstall -sync coc-json" "+qall" && \ + nvim --headless "+CocInstall -sync coc-lightbulb" "+qall" && \ + nvim --headless "+CocInstall -sync coc-markdownlint" "+qall" && \ + nvim --headless "+CocInstall -sync coc-omnisharp" "+qall" && \ + nvim --headless "+CocInstall -sync coc-powershell" "+qall" && \ + nvim --headless "+CocInstall -sync coc-react-refactor" "+qall" && \ + nvim --headless "+CocInstall -sync coc-sh" "+qall" && \ + nvim --headless "+CocInstall -sync coc-snippets" "+qall" && \ + nvim --headless "+CocInstall -sync coc-spell-checker" "+qall" && \ + nvim --headless "+CocInstall -sync coc-sumneko-lua" "+qall" && \ + nvim --headless "+CocInstall -sync coc-tsserver" "+qall" && \ + nvim --headless "+CocInstall -sync coc-vimlsp" "+qall" && \ + nvim --headless init.lua +CocStart \ + "+lua vim.defer_fn(function() vim.cmd('CocCommand sumneko-lua.install') end, 5000)" \ + "+lua vim.defer_fn(function() vim.cmd('qall') end, 15000)" && \ + nvim --headless init.lua +CocStart \ + "+lua vim.defer_fn(function() vim.cmd('CocCommand sumneko-lua.downloadNvimLuaTypes') end, 5000)" \ + "+lua vim.defer_fn(function() vim.cmd('qall') end, 15000)"; \ + fi + +RUN \ + nvim --headless "+TSUpdate" \ + "+lua vim.defer_fn(function() vim.cmd('qall') end, 60000)" + +RUN \ + rsync -av --progress --delete /root/.config/ /home/${UNAME}/.config/ && \ + rsync -av --progress --delete /root/.local/ /home/${UNAME}/.local/ + +RUN \ + chown -R ${UNAME}:${GNAME} /home/${UNAME} + +USER ${UNAME} + +ENV \ + GID="1000" \ + GNAME="neovim" \ + LANG=en_US.utf8 \ + NVIM_APPNAME=nvim \ + NV_DARCULA_APPS="/home/neovim/.local/share/nvim/" \ + NV_DARCULA_ENABLE_COC=${NV_DARCULA_ENABLE_COC} \ + PATH="/nvim-${NVIM_OS}-${NVIM_ARCH}/bin:/python/bin:/home/neovim/go/bin:/home/neovim/.local/bin:/home/neovim/flutter/bin:/home/neovim/.pub-cache/bin:/usr/bin/core_perl:${PATH}" \ + PYTHONPATH="/python" \ + SHELL="/bin/bash" \ + TMPDIR=/tmp \ + UID="1000" \ + UNAME="neovim" + +RUN \ + cd "/home/${UNAME}" && \ + git clone https://github.com/flutter/flutter.git -b stable flutter && \ + cd - && \ + flutter && \ + flutter doctor && \ + flutter pub global activate dart_style + +RUN \ + if [ "$NV_DARCULA_ENABLE_COC" = "false" ]; then \ + nvim --headless "+MasonToolsInstallSync" "+qall" && \ + nvim --headless "+LspInstall bashls" "+qall" && \ + nvim --headless "+LspInstall clangd" "+qall" && \ + nvim --headless "+LspInstall cspell_ls" "+qall" && \ + nvim --headless "+LspInstall gopls" "+qall" && \ + nvim --headless "+LspInstall lua_ls" "+qall" && \ + nvim --headless "+LspInstall vimls" "+qall"; \ + fi + +RUN \ + go install mvdan.cc/sh/v3/cmd/shfmt@latest + +ENTRYPOINT ["/entrypoint.sh"] + +# vim:filetype=dockerfile diff --git a/build_all.sh b/build_all.sh new file mode 100755 index 0000000..860787e --- /dev/null +++ b/build_all.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +docker system prune -a -f +"${SCRIPT_DIR}/build_nvim.sh" +"${SCRIPT_DIR}/build_nvim2.sh" diff --git a/build_common.sh b/build_common.sh new file mode 100755 index 0000000..31df5f7 --- /dev/null +++ b/build_common.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "${SCRIPT_DIR}/common.sh" + +pushd "${SCRIPT_DIR}" 1>/dev/null 2>&1 || error_exit "failed to pushd: ${SCRIPT_DIR}" +docker build \ + --build-arg NVIM_ARCH="${NVIM_ARCH}" \ + --build-arg NVIM_ARCH2="${NVIM_ARCH2}" \ + --build-arg NVIM_OS="${NVIM_OS}" \ + --build-arg NV_DARCULA_ENABLE_COC="${NV_DARCULA_ENABLE_COC}" \ + --no-cache \ + -f "Dockerfile" \ + -t "darcula:${NVIM_APPNAME}" . +popd 1>/dev/null 2>&1 || error_exit "failed to popd: ${SCRIPT_DIR}" diff --git a/build_nvim.sh b/build_nvim.sh new file mode 100755 index 0000000..fd95a8e --- /dev/null +++ b/build_nvim.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_APPNAME=nvim +export NVIM_APPNAME + +NV_DARCULA_ENABLE_COC=true +export NV_DARCULA_ENABLE_COC + +"${SCRIPT_DIR}/build_common.sh" "$@" diff --git a/build_nvim2.sh b/build_nvim2.sh new file mode 100755 index 0000000..cd96fcd --- /dev/null +++ b/build_nvim2.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_APPNAME=nvim2 +export NVIM_APPNAME + +NV_DARCULA_ENABLE_COC=false +export NV_DARCULA_ENABLE_COC + +"${SCRIPT_DIR}/build_common.sh" "$@" diff --git a/common.sh b/common.sh new file mode 100755 index 0000000..e8e4071 --- /dev/null +++ b/common.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_CPPTOOLS_VERSION=1.30.5 +NVIM_VERSION=nightly + +NVIM_ARCH=x86_64 +NVIM_ARCH2=x64 +if uname -m | grep arm; then + NVIM_ARCH=arm64 + NVIM_ARCH2=arm64 +fi + +if uname | grep 'Darwin'; then + NVIM_OS="macOS" +else + NVIM_OS="linux" +fi + +function create_link() { + local cur + local res + + cur=$(readlink -f "$2") + res=$(readlink -f "$1") + if [ ! -L "$2" ] || [ "${cur}" != "${res}" ]; then + echo "linking $1->$2" + rm -f "$2" 1>/dev/null 2>&1 + ln -sf "$1" "$2" + fi +} + +function error_exit() { + echo "$1" + exit 1 +} + +pushd "${SCRIPT_DIR}" 1>/dev/null 2>&1 || error_exit "failed to push: ${SCRIPT_DIR}" +FNAME=cpptools-${NVIM_OS}-${NVIM_ARCH2}.vsix +if [ ! -f "dap/${FNAME}" ]; then + mkdir -p dap/ + wget "https://github.com/microsoft/vscode-cpptools/releases/download/v${NVIM_CPPTOOLS_VERSION}/${FNAME}" \ + -O "dap/${FNAME}" +fi + +if [ ! -d "${HOME}/.local/share/${NVIM_APPNAME}/dap/cpp/extension" ]; then + mkdir -p "${HOME}/.local/share/${NVIM_APPNAME}/dap/cpp" + unzip "dap/${FNAME}" -d "${HOME}/.local/share/${NVIM_APPNAME}/dap/cpp" +fi + +mkdir -p pkg/ +if [ ! -f "/tmp/nvim-${NVIM_OS}-${NVIM_ARCH}/bin/nvim" ]; then + FNAME=nvim-${NVIM_OS}-${NVIM_ARCH}.tar.gz + [[ -f "pkg/${FNAME}" ]] && rm -f "pkg/${FNAME}" + + wget "https://github.com/neovim/neovim/releases/download/${NVIM_VERSION}/${FNAME}" \ + -O "pkg/${FNAME}" +fi + +if [ ! -d "${HOME}/.local/share/${NVIM_APPNAME}/Dart-Code" ]; then + mkdir -p "${HOME}/.local/share/${NVIM_APPNAME}" + pushd "${HOME}/.local/share/${NVIM_APPNAME}" 1>/dev/null 2>&1 || + error_exit "failed to pushd: ${HOME}/.local/share/${NVIM_APPNAME}" + git clone https://github.com/Dart-Code/Dart-Code.git + pushd "Dart-Code" 1>/dev/null 2>&1 || error_exit "failed to pushd: Dart-Code" + npm i + npx webpack --mode production + popd 1>/dev/null 2>&1 || error_exit "failed to popd: Dart-Code" + popd 1>/dev/null 2>&1 || error_exit "failed to popd: ${HOME}/.local/share/${NVIM_APPNAME}" +fi +popd 1>/dev/null 2>&1 || error_exit "failed to popd: ${SCRIPT_DIR}" + +export NVIM_ARCH +export NVIM_ARCH2 +export NVIM_CPPTOOLS_VERSION +export NVIM_VERSION +export NVIM_OS diff --git a/create_tarballs.sh b/create_tarballs.sh new file mode 100755 index 0000000..a52dc77 --- /dev/null +++ b/create_tarballs.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +# shellcheck source=../../.desktop/scripts/functions.sh +. "${HOME}/.desktop/scripts/functions.sh" + +CUR_DIR=$(pwd) + +HOME_FILE="${CUR_DIR}/home.tar.gz" +NEOVIM_FILE="${CUR_DIR}/neovim.tar.gz" + +TAR_EXCLUDES=( + --exclude=.android + --exclude=.bash* + --exclude=.cache + --exclude=.config/go + --exclude=.config/nvim/dap + --exclude=.config/nvim/pkg + --exclude=.dart-tool + --exclude=.flutter + --exclude=.npm + --exclude=.profile + --exclude=.pub-cache + --exclude=flutter + --exclude=go/pkg + --exclude=go/src +) + +pushd "${HOME}" 1>/dev/null 2>&1 || error_exit "failed to pushd: ${HOME}" +rm -f "${HOME_FILE}" +tar czvf "${HOME_FILE}" "${TAR_EXCLUDES[@]}" . +popd 1>/dev/null 2>&1 || error_exit "failed to popd: ${HOME}" + +rm -f "${NEOVIM_FILE}" +tar czvf "${NEOVIM_FILE}" \ + "$(npm root -g)/neovim/" \ + "$(npm prefix -g)/bin/neovim-node-host" diff --git a/dviml.sh b/dviml.sh new file mode 100755 index 0000000..4e57d3e --- /dev/null +++ b/dviml.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_APPNAME=nvim +export NVIM_APPNAME + +"${SCRIPT_DIR}/dviml_common.sh" "$@" diff --git a/dviml2.sh b/dviml2.sh new file mode 100755 index 0000000..23c27fa --- /dev/null +++ b/dviml2.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_APPNAME=nvim2 +export NVIM_APPNAME + +"${SCRIPT_DIR}/dviml_common.sh" "$@" diff --git a/dviml_common.sh b/dviml_common.sh new file mode 100755 index 0000000..412735f --- /dev/null +++ b/dviml_common.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +APP_DIR="${HOME}/.nv_darcula/${NVIM_APPNAME}" +APP_PERSIST_DIR="${APP_DIR}/persist" + +# SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +# -v "${SCRIPT_DIR}/${NVIM_APPNAME}":/home/neovim/.config/nvim:z \ + +mkdir -p "${APP_PERSIST_DIR}/cache" +mkdir -p "${APP_PERSIST_DIR}/nvim-haven" +mkdir -p "${APP_PERSIST_DIR}/shada" +mkdir -p "${APP_PERSIST_DIR}/swap" +mkdir -p "${APP_PERSIST_DIR}/undo" + +docker run --rm -it \ + --device /dev/fuse \ + --privileged=true \ + -v "${APP_PERSIST_DIR}/cache":/home/neovim/.cache:z \ + -v "${APP_PERSIST_DIR}/nvim-haven":/home/neovim/.local/share/nvim/nvim-haven:z \ + -v "${APP_PERSIST_DIR}/shada":/home/neovim/.local/state/nvim/shada:z \ + -v "${APP_PERSIST_DIR}/swap":/home/neovim/.local/state/nvim/swap:z \ + -v "${APP_PERSIST_DIR}/undo":/home/neovim/.local/share/nvim/.undo:z \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v "$(pwd)":"$(pwd)" \ + -w "$(pwd)" \ + darcula:"${NVIM_APPNAME}" "$@" diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..c168262 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +export PATH + +if [ -f "/data" ]; then + mkdir -p ~/mnt/data + veracrypt -t -m=nokernelcrypto /data ~/mnt/data || exit 1 +fi + +if [[ -z $* ]]; then + /bin/bash +else + /bin/bash -c 'exec nvim "$@"' /bin/bash "$@" +fi + +if [ -f "/data" ]; then + veracrypt -d ~/mnt/data || (echo "sleeping" && sleep 5 && veracrypt -d ~/mnt/data) +fi diff --git a/icons/COblivion.ico b/icons/COblivion.ico new file mode 100644 index 0000000000000000000000000000000000000000..160fe65a9cb896ccb942407a6806fa0411d31eaa GIT binary patch literal 130535 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�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

hArzTh{=)q*_vZPNO4nqz& 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 +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("darcula.config") +require("darcula.plugins") + +require("darcula.utils.globals") + +require("darcula.options") +require("darcula.cspell") + +require("darcula.setup") + +require("darcula.keymaps") +require("darcula.autocmds") +require("darcula.usercmds") + +pcall(require, "darcula.custom") diff --git a/nvim/lua/darcula/autocmds.lua b/nvim/lua/darcula/autocmds.lua new file mode 100644 index 0000000..3eb29b2 --- /dev/null +++ b/nvim/lua/darcula/autocmds.lua @@ -0,0 +1,229 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local utils = require("darcula.utils") + +local group = + utils.augroup_with_autocmd( + "DarculaAutoCommands", + "BufReadPost", + "*", + function() + local pos = vim.fn.line('\'"') + if + pos >= 1 and pos <= vim.fn.line("$") and vim.bo.filetype ~= "commit" and + vim.bo.filetype ~= "rebase" + then + vim.cmd('normal! g`"') + end + end +) + +utils.autocmd( + group, + "FileChangedShellPost", + "*", + function() + local filename = utils.get_current_filename() + vim.notify("File changed on disk:\n" .. filename, vim.log.levels.WARN) + end +) + +utils.autocmd( + group, + {"FocusGained", "BufEnter", "CursorHold", "CursorHoldI"}, + "*", + function() + local m = vim.fn.mode(0) + if m ~= "c" and m ~= "cv" and m ~= "t" and vim.o.buftype ~= "nofile" then + vim.cmd("silent! checktime") + end + end +) + +utils.autocmd( + group, + "TextYankPost", + "*", + function() + vim.highlight.on_yank({timeout = 250}) + end +) + +utils.autocmd( + group, + "FileType", + "lua", + function() + vim.cmd("hi luaParenError guibg=NONE") + end +) + +utils.autocmd( + group, + "ColorScheme", + "*", + function() + NV_DARCULA_COLOR_SCHEME = + vim.api.nvim_exec2("colorscheme", {output = true}).output + end +) + +utils.autocmd( + group, + "VimEnter", + "*", + function() + NV_Darcula_Set_Gui_Font(0) + NV_Darcula_Set_Gui_Popup(false) + end +) + +utils.autocmd(group, "DirChanged", "*", NV_Darcula_Load_RC) +utils.autocmd(group, "VimEnter", "*", NV_Darcula_Load_RC) + +utils.autocmd( + group, + "FileType", + "help", + function() + vim.opt_local.signcolumn = "no" + end +) + +utils.autocmd( + group, + "User", + {"FugitiveChanged", "GitSignsUpdate"}, + function() + local api = require("nvim-tree.api") + if api.tree.is_visible() then + pcall(api.tree.reload) + end + end +) + +utils.autocmd( + group, + "FileType", + "*", + function(args) + pcall(vim.treesitter.start, args.buf) + end +) + +if not NV_DARCULA_ENABLE_COC then + utils.autocmd( + group, + "User", + { + "MiniCompletionWindowOpen", + "MiniCompletionWindowUpdate" + }, + function(args) + local data = args.data + if not data or not data.win_id then + return + end + + if data.kind ~= "info" and data.kind ~= "signature" then + return + end + + if vim.api.nvim_win_is_valid(data.win_id) then + vim.api.nvim_win_set_config( + data.win_id, + { + title = "" + } + ) + end + end + ) +end + +utils.autocmd( + group, + "BufEnter", + "*", + function() + if vim.bo.filetype == "fugitive" or vim.bo.filetype == "gitcommit" then + vim.cmd("resize 15") + end + end +) + +utils.autocmd( + group, + "BufWritePost", + "*", + function() + if NV_DARCULA_ENABLE_FORMATTING then + vim.cmd("FormatWriteLock") + end + end +) + +if not NV_DARCULA_ENABLE_COC then + utils.autocmd( + group, + {"CursorHold"}, + "*", + function() + vim.diagnostic.open_float(nil, {focus = false}) + end + ) +end + +if NV_DARCULA_ENABLE_COC then + local show_signature_help = function() + if vim.bo.buftype ~= "prompt" and vim.bo.buftype ~= "nofile" then + vim.fn.CocActionAsync("showSignatureHelp") + end + end + + utils.autocmd(group, "User", "CocJumpPlaceholder", show_signature_help) + + utils.autocmd( + group, + {"InsertEnter", "TextChangedI"}, + "*", + show_signature_help + ) + + utils.autocmd( + group, + "CursorHold", + "*", + function() + if vim.bo.buftype ~= "prompt" and vim.bo.buftype ~= "nofile" then + vim.fn.CocActionAsync("highlight") + end + end + ) + + utils.autocmd( + group, + "User", + "CocNvimInit", + function() + vim.notify("Initialized coc.nvim for LSP support", vim.log.levels.INFO) + end + ) +end diff --git a/nvim/lua/darcula/config/init.lua b/nvim/lua/darcula/config/init.lua new file mode 100644 index 0000000..5135de5 --- /dev/null +++ b/nvim/lua/darcula/config/init.lua @@ -0,0 +1,230 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local utils = require("darcula.utils") + +NV_DARCULA_COLOR_COLUMN = utils.parse_env("NV_DARCULA_COLOR_COLUMN", "80") +NV_DARCULA_COLOR_SCHEME = + utils.parse_env("NV_DARCULA_COLOR_SCHEME", "darcula_lush") +NV_DARCULA_ENABLE_COC = utils.parse_env("NV_DARCULA_ENABLE_COC", true) +NV_DARCULA_ENABLE_CODE_LENS = + utils.parse_env("NV_DARCULA_ENABLE_CODE_LENS", false) +NV_DARCULA_ENABLE_DAP = utils.parse_env("NV_DARCULA_ENABLE_DAP", true) +NV_DARCULA_ENABLE_FORMATTING = + utils.parse_env("NV_DARCULA_ENABLE_FORMATTING", true) +NV_DARCULA_ENABLE_GIT_LINE_BLAME = + utils.parse_env("NV_DARCULA_ENABLE_GIT_LINE_BLAME", false) +NV_DARCULA_ENABLE_HIDDEN_FILES = + utils.parse_env("NV_DARCULA_ENABLE_HIDDEN_FILES", false) +NV_DARCULA_ENABLE_INLAY_HINTS = + utils.parse_env("NV_DARCULA_ENABLE_INLAY_HINTS", false) +NV_DARCULA_ENABLE_VIRTUAL_TEXT = + utils.parse_env("NV_DARCULA_ENABLE_VIRTUAL_TEXT", false) + +NV_DARCULA_CLANGD_ARGS = + utils.parse_env_list( + "NV_DARCULA_CLANGD_ARGS", + { + "--all-scopes-completion", + "--background-index", + "--clang-tidy", + "--completion-style=detailed", + "--cross-file-rename", + "--enable-config", + "--header-insertion-decorators", + "--log=info", + "--pch-storage=disk", + "--suggest-missing-includes", + "-j=4" + } +) + +NV_DARCULA_COC_EXTENSIONS = + utils.parse_env_list( + "NV_DARCULA_COC_EXTENSIONS", + { + "coc-calc", + "coc-clang-format-style-options", + "coc-clangd", + "coc-cmake", + "coc-css", + "coc-eslint", + "coc-flutter", + "coc-go", + "coc-highlight", + "coc-html", + "coc-java", + "coc-jedi", + "coc-jest", + "coc-json", + "coc-lightbulb", + "coc-markdownlint", + "coc-omnisharp", + "coc-powershell", + "coc-react-refactor", + "coc-sh", + "coc-snippets", + "coc-spell-checker", + "coc-sumneko-lua", + "coc-tsserver", + "coc-vimlsp" + } +) + +NV_DARCULA_CSPELL_LANGUAGES = + utils.parse_env_list( + "NV_DARCULA_CSPELL_LANGUAGES", + { + "asciidoc", + "c", + "cmake", + "cpp", + "csharp", + "css", + "dart", + "git-commit", + "go", + "handlebars", + "haskell", + "html", + "jade", + "java", + "javascript", + "javascriptreact", + "json", + "jsonc", + "latex", + "less", + "lua", + "markdown", + "php", + "plaintext", + "pug", + "python", + "restructuredtext", + "rust", + "scala", + "scss", + "text", + "typescript", + "typescriptreact", + "vim", + "yaml", + "yml" + } +) + +NV_DARCULA_LUA_GLOBALS = + utils.parse_env_list( + "NV_DARCULA_LUA_GLOBALS", + { + "MiniIcons", + "MiniNotify", + "MiniSnippets", + "MiniStarter", + "_G", + "vim" + } +) + +NV_DARCULA_MASON_INST_LIST = + utils.parse_env_list( + "NV_DARCULA_MASON_INST_LIST", + { + "bashls", + "clangd", + "cspell_ls", + "gopls", + "lua_ls", + "vimls" + } +) + +NV_DARCULA_MASON_LSP_LIST = + utils.parse_env_list( + "NV_DARCULA_MASON_LSP_LIST", + { + "bashls", + "clangd", + "cmake", + "cspell_ls", + "gopls", + "lua_ls", + "vimls" + } +) + +NV_DARCULA_MASON_TOOL_LIST = + utils.parse_env_list( + "NV_DARCULA_MASON_TOOL_LIST", + { + "clang-format", + "gofumpt", + "google-java-format", + "prettier", + "shellcheck", + "shfmt", + "yapf" + } +) + +NV_DARCULA_TREESITTER_LIST = + utils.parse_env_list( + "NV_DARCULA_TREESITTER_LIST", + { + "angular", + "awk", + "bash", + "cmake", + "cpp", + "css", + "dockerfile", + "git_config", + "git_rebase", + "gitattributes", + "gitcommit", + "gitignore", + "html", + "http", + "ini", + "java", + "javascript", + "jsdoc", + "json", + "lua", + "luadoc", + "luap", + "luau", + "markdown", + "markdown_inline", + "meson", + "ninja", + "pug", + "python", + "query", + "rust", + "starlark", + "toml", + "typescript", + "vim", + "vimdoc", + "xml", + "yaml" + } +) diff --git a/nvim/lua/darcula/cspell/init.lua b/nvim/lua/darcula/cspell/init.lua new file mode 100644 index 0000000..17e7270 --- /dev/null +++ b/nvim/lua/darcula/cspell/init.lua @@ -0,0 +1,211 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local utils = require("darcula.utils") +local utils_os = require("darcula.utils.os") + +local user_directory = + vim.fs.joinpath( + utils.iff(utils_os.is_windows, vim.env.NV_DARCULA_DRIVE, vim.env.HOME), + ".desktop" +) + +local user_dictionary = + vim.fs.joinpath(user_directory, ".cspell", "user_words.txt") + +local config_data = { + "{", + ' "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",', + ' "version": "0.2",', + ' "dictionaries": ["workspace-words", "user-words"],', + ' "dictionaryDefinitions": [{', + ' "name": "workspace-words",', + ' "path": "./.cspell/words.txt",', + ' "addWords": true', + " },", + " {", + ' "name": "user-words",', + ' "path": "' .. user_dictionary .. '",', + ' "addWords": true', + " }", + " ]", + "}" +} + +local get_workspace_directory = function() + return vim.fs.joinpath(NV_Darcula_Git_Root(vim.fn.getcwd())) +end + +local get_workspace_dictionary = function() + return vim.fs.joinpath(get_workspace_directory(), ".cspell", "words.txt") +end + +local create_config_file = function(force) + force = force and true + + if + force or vim.fn.filereadable(get_workspace_dictionary()) ~= 0 or + vim.fn.filereadable(user_dictionary) ~= 0 + then + local config_file = + vim.fs.joinpath(get_workspace_directory(), "cspell.json") + if vim.fn.filereadable(config_file) == 0 then + vim.fn.writefile(config_data, config_file, "b") + end + end +end + +local refresh_buffer = function() + -- NV_Darcula_Refresh_Buffer() + NV_Darcula_LSP_Restart() +end + +local group = + utils.augroup_with_autocmd( + "cspell_cfg", + "User", + "RooterChDir", + function() + create_config_file(false) + end +) + +utils.autocmd( + group, + "VimEnter", + "*", + function() + create_config_file(false) + end +) + +NV_Darcula_Cspell_Cleanup = function() + local get_lines = function(location) + if vim.fn.filereadable(location) ~= 0 then + return vim.fn.readfile(location, "") + end + + return {} + end + + local cleanup = function(lines) + local clean_lines = {} + for _, word in pairs(lines) do + word = vim.fn.trim(word:lower()) + if #word > 0 and not table.contains(clean_lines, word) then + table.insert(clean_lines, word) + end + end + + return clean_lines + end + + local user_lines = cleanup(get_lines(user_dictionary)) + local workspace_lines = cleanup(get_lines(get_workspace_dictionary())) + if vim.fn.filereadable(user_dictionary) ~= 0 then + table.sort(user_lines) + + vim.fn.writefile(user_lines, user_dictionary, "b") + if vim.fn.filereadable(get_workspace_dictionary()) ~= 0 then + local unique_lines = {} + for _, word in pairs(workspace_lines) do + if not table.contains(user_lines, word) then + table.insert(unique_lines, word) + end + end + + table.sort(unique_lines) + vim.fn.writefile(unique_lines, get_workspace_dictionary(), "b") + refresh_buffer() + end + end + + vim.notify("Cleaned cspell dictionaries", vim.log.levels.INFO) +end + +local cspell_read_file = function(user) + user = user or false + + local spell_directory = + vim.fs.joinpath( + utils.iff(user, user_directory, get_workspace_directory()), + ".cspell" + ) + + local is_directory = vim.fn.isdirectory(spell_directory) + if is_directory == 0 then + vim.fn.mkdir(spell_directory, "p") + end + + create_config_file(true) + + local spell_file = vim.fs.joinpath(spell_directory, "words.txt") + local lines = (function() + if vim.fn.filereadable(spell_file) ~= 0 then + return vim.fn.readfile(spell_file, "") + end + + return {} + end)() + + return lines, spell_file +end + +local cspell_write_word = function(user, lines, spell_file, word) + user = user or false + + word = vim.fn.trim(word) + if word ~= nil and #word > 0 and lines ~= nil then + for _, value in pairs(lines) do + if word:lower() == value:lower() then + return + end + end + table.insert(lines, word:lower()) + table.sort(lines) + vim.fn.writefile(lines, spell_file, "b") + + vim.notify( + "Added '" .. + word .. "' to " .. utils.iff(user, "user", "workspace") .. " dictionary", + vim.log.levels.INFO + ) + + refresh_buffer() + end +end + +NV_Darcula_Cspell_Add_Selected_Word = function(user) + user = user or false + + local lines, spell_file = cspell_read_file(user) + NV_Darcula_Grab_Selection( + function(word) + cspell_write_word(user, lines, spell_file, word) + end + ) +end + +NV_Darcula_Cspell_Add_Word = function(user) + user = user or false + + local lines, spell_file = cspell_read_file(user) + local word = utils.cword() or "" + cspell_write_word(user, lines, spell_file, word) +end diff --git a/nvim/lua/darcula/flutter/init.lua b/nvim/lua/darcula/flutter/init.lua new file mode 100644 index 0000000..b5fda7a --- /dev/null +++ b/nvim/lua/darcula/flutter/init.lua @@ -0,0 +1,369 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local Job = require("plenary.job") +local action_state = require "telescope.actions.state" +local actions = require "telescope.actions" +local conf = require("telescope.config").values +local finders = require("telescope.finders") +local global_state = require("telescope.state") +local pickers = require("telescope.pickers") +local utils = require("darcula.utils") +local utils_os = require("darcula.utils.os") + +local M = {} +local companion_title = "Flutter Companion" +local config = { + use_coc = true +} + +local callbacks = {nil, nil} +local flutter_busy = false +local spinner_frames = {"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"} + +local EMULATOR = 1 +local DEVICE = 2 + +local get_config_path = function() + return vim.fs.joinpath(vim.fn.getcwd(), ".flutter-companion") +end + +local get_flutter_command = function() + local cmd = "flutter" .. utils.iff(utils_os.is_windows, ".bat", "") + return cmd +end + +local flutter_run_device = function(id) + if config.use_coc then + vim.api.nvim_command("CocCommand flutter.run -d " .. id) + return + end + + if vim.fn.exists(":FlutterRun") ~= 0 then + vim.api.nvim_command("FlutterRun -d " .. id) + return + end + vim.notify( + { + "Run device requires 'coc-flutter/coc-flutter-tools' if using CoC or 'flutter-tools.nvim' if using native LSP." + }, + "error", + { + title = companion_title + } + ) +end + +local load_table = function(path) + local file, err = io.open(path, "r") + if err or file == nil then + return {} + end + + local lines = file:read("a") + file:close() + + local ok, json = + pcall( + function() + return vim.json.decode(lines) + end + ) + return utils.iff(ok, json, {}) +end + +local parse = function(line, device_type) + local parts = vim.split(line, "•") + local is_emulator = device_type == EMULATOR + local name_index = not is_emulator and 1 or 2 + local id_index = not is_emulator and 2 or 1 + if #parts == 4 then + return { + name = vim.trim(parts[name_index]), + id = vim.trim(parts[id_index]), + platform = vim.trim(parts[3]), + system = vim.trim(parts[4]), + type = device_type + } + end +end + +local save_table = function(data, filename) + local file, err = io.open(filename, "wb") + if err or file == nil then + return err + end + + file:write(vim.json.encode(data)) + file:close() +end + +local get_devices = function(result, type) + local devices = {} + for _, line in pairs(result) do + local device = parse(line, type) + if device then + table.insert(devices, device) + end + end + return devices +end + +local extract_device_props = function(result, device_type) + device_type = device_type or DEVICE + local devices = {} + local device_list = get_devices(result, device_type) + if #device_list > 0 then + for _, device in pairs(device_list) do + table.insert(devices, device) + end + end + return devices +end + +local parse_devices_output = function(job, callback) + local result = job:result() + local devices = extract_device_props(result, DEVICE) + callback(devices) +end + +local list_devices = function(callback) + local job = Job:new({command = get_flutter_command(), args = {"devices"}}) + job:after_success( + vim.schedule_wrap( + function() + parse_devices_output(job, callback) + end + ) + ) + job:start() +end + +local function list_emulators(callback) + local job = Job:new({command = get_flutter_command(), args = {"emulators"}}) + job:after_success( + vim.schedule_wrap( + function() + local emulators = extract_device_props(job:result(), EMULATOR) + callback(emulators) + end + ) + ) + job:start() +end + +local start_spinner = function(name, get_active) + local spinner = 0 + local record + + local function update_spinner() + if get_active() then + local next_record = + vim.notify( + "Detecting " .. name .. "...", + "info", + { + title = companion_title, + hide_from_history = true, + icon = spinner_frames[(spinner % #spinner_frames) + 1], + replace = record + } + ) + record = next_record + spinner = spinner + 1 + vim.defer_fn(update_spinner, 100) + end + end + update_spinner() +end + +local stop_spinner = function(set_inactive) + set_inactive() + vim.notify.dismiss() +end + +function M.flutter_clear(is_emulator) + local config_path = get_config_path() + local config_data = load_table(config_path) + if is_emulator then + if config_data.emulator ~= nil then + config_data.emulator = nil + save_table(config_data, config_path) + end + else + if config_data.device ~= nil then + config_data.device = nil + save_table(config_data, config_path) + end + end +end + +function M.flutter_list(is_emulators) + if flutter_busy == true then + return + end + flutter_busy = true + + local config_path = get_config_path() + local config_data = load_table(config_path) + + local callback_index = utils.iff(is_emulators, 2, 1) + local list_function = utils.iff(is_emulators, list_emulators, list_devices) + local name = utils.iff(is_emulators, "Emulators", "Devices") + + local completed_callback + if callbacks[callback_index] ~= nil then + completed_callback = callbacks[callback_index] + callbacks[callback_index] = nil + end + + local active = true + start_spinner( + name, + function() + return active + end + ) + + list_function( + function(items) + stop_spinner( + function() + active = false + end + ) + + if #items == 0 then + vim.notify( + "No " .. name .. " were found", + "error", + {title = companion_title} + ) + else + global_state.set_global_key("selected_entry", nil) + + local opts = {} + pickers.new( + opts, + { + prompt_title = "Flutter " .. name, + sorter = conf.generic_sorter(opts), + finder = finders.new_table( + { + results = items, + entry_maker = function(item) + return { + value = item, + ordinal = item.name, + display = item.name + } + end + } + ), + attach_mappings = function(prompt_bufnr --[[, map ]]) + actions.select_default:replace( + function() + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + if is_emulators then + config_data.emulator = selection.value + else + config_data.device = selection.value + end + save_table(config_data, config_path) + if completed_callback ~= nil then + completed_callback() + end + end + ) + return true + end + } + ):find() + end + flutter_busy = false + end + ) +end + +M.flutter_run = function(is_emulator) + local config_path = get_config_path() + local config_data = load_table(config_path) + if is_emulator then + if config_data.emulator == nil then + if callbacks[2] == nil then + callbacks[2] = function() + M.flutter_run(is_emulator) + end + M.flutter_list(true) + end + else + local job = + Job:new( + { + command = get_flutter_command(), + args = {"emulators", "--launch", config_data.emulator.id} + } + ) + job:start() + end + else + if config_data.device == nil then + if callbacks[1] == nil then + callbacks[1] = function() + M.flutter_run(is_emulator) + end + M.flutter_list(false) + end + else + flutter_run_device(config_data.device.id) + end + end +end + +M.setup = function(opts) + opts = opts or {} + config.use_coc = vim.F.if_nil(opts.use_coc, config.use_coc) +end + +_G.Flutter_Companion_Clear_Selected_Device = function() + M.flutter_clear(false) +end + +_G.Flutter_Companion_Run_Selected_Device = function() + M.flutter_run(false) +end + +_G.Flutter_Companion_Select_Device = function() + M.flutter_list(false) +end + +_G.Flutter_Companion_Clear_Selected_Emulator = function() + M.flutter_clear(true) +end + +_G.Flutter_Companion_Run_Selected_Emulator = function() + M.flutter_run(true) +end + +_G.Flutter_Companion_Select_Emulator = function() + M.flutter_list(true) +end + +return M diff --git a/nvim/lua/darcula/haven/init.lua b/nvim/lua/darcula/haven/init.lua new file mode 100644 index 0000000..0855e10 --- /dev/null +++ b/nvim/lua/darcula/haven/init.lua @@ -0,0 +1,718 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("darcula.utils.string") +require("darcula.utils.table") + +local Path = require("plenary.path") +local action_state = require("telescope.actions.state") +local actions = require("telescope.actions") +local conf = require("telescope.config").values +local finders = require("telescope.finders") +local utils = require("darcula.utils") +local global_state = require("telescope.state") +local utils_os = require("darcula.utils.os") +local utils_path = require("darcula.utils.path") +local pickers = require("telescope.pickers") +local plenary_filetype = require("plenary.filetype") +local previewer_utils = require("telescope.previewers.utils") +local previewers = require("telescope.previewers") +local scan = require("plenary.scandir") + +local M = {} + +local active_saves = {} +local changed_lookup = {} +local haven_config = { + enabled = true, + exclusions = { + function(path, _) + if utils_os.is_windows then + return path:lower():starts_with( + (vim.fn.eval("$VIMRUNTIME") .. utils_path.directory_sep):lower() + ) + end + return path:starts_with( + vim.fn.eval("$VIMRUNTIME") .. utils_path.directory_sep + ) + end, + function(path, _) + if utils_os.is_windows then + return path:lower():starts_with( + (vim.fn.stdpath("data") .. utils_path.directory_sep):lower() + ) + end + return path:starts_with( + vim.fn.stdpath("data") .. utils_path.directory_sep + ) + end, + function(path, _) + if utils_os.is_windows then + return path:lower():starts_with( + (vim.fs.joinpath(vim.fn.eval("$XDG_CONFIG_HOME"), "coc") .. + utils_path.directory_sep):lower() + ) + end + return path:starts_with( + vim.fs.joinpath(vim.fn.eval("$XDG_CONFIG_HOME"), "coc") .. + utils_path.directory_sep + ) + end, + function(path, _) + if utils_os.is_windows then + return path:lower():ends_with( + (utils_path.directory_sep .. + ".git" .. utils_path.directory_sep .. "COMMIT_EDITMSG"):lower() + ) + end + return path:ends_with( + utils_path.directory_sep .. + ".git" .. utils_path.directory_sep .. "COMMIT_EDITMSG" + ) + end, + function(path, config) + if utils_os.is_windows then + return path:lower():starts_with( + (config.haven_path .. utils_path.directory_sep):lower() + ) + end + return path:starts_with(config.haven_path .. utils_path.directory_sep) + end + }, + haven_path = vim.fs.joinpath(vim.fn.stdpath("data"), "nvim-haven"), + inclusions = {}, + max_history_count = 200, + save_timeout = 10000 +} +local line_ending = utils.iff(utils_os.is_windows, "\r\n", "\n") +local ns_previewer = vim.api.nvim_create_namespace("telescope.previewers") + +local print_message = function(is_error, msg) + vim.notify( + msg, + utils.iff(is_error, "error", "info"), + { + title = "nvim-haven" + } + ) +end + +local diff_strings = function(a, b) + return vim.text.diff(a, b, {algorithm = "minimal"}) +end + +local create_save_file_path = function(buf_info) + local encode = function(str) + return str:gsub("\r?\n", "\r\n"):gsub( + "([^%w%-%.%_%~ ])", + function(c) + return string.format("%%%02X", string.byte(c)) + end + ):gsub(" ", "+") + end + + return vim.fs.joinpath( + haven_config.haven_path, + encode(buf_info.name) .. ".save" + ) +end + +local save_change_file = function(buf_info, lines, save_file) + active_saves[save_file] = nil + + local file, err = io.open(save_file, "a") + if file == nil then + print_message(true, err) + return + end + + local file_entry = + vim.json.encode( + { + date = os.time(), + ft = plenary_filetype.detect(buf_info.name, {}), + lines = lines + } + ) + _, err = file:write(file_entry .. line_ending) + if err ~= nil then + print_message(true, err) + end + file:close() +end + +local save_change_file_entries = function(entries, save_file) + active_saves[save_file] = nil + + local file, err = io.open(save_file, "w+") + if file == nil then + print_message(true, err) + return + end + + for _, entry in pairs(entries) do + _, err = file:write(vim.json.encode(entry) .. line_ending) + if err ~= nil then + print_message(true, err) + end + end + file:close() +end + +local read_change_file = function(save_file) + local file, err = io.open(save_file, "r") + if file == nil then + return nil, err + end + + local save_data + save_data, err = file:read("a") + if err ~= nil then + return nil, err + end + file:close() + + local entries = + vim.json.decode( + "[" .. table.concat(save_data:split(line_ending), ",") .. "]" + ) + if #entries > haven_config.max_history_count then + while #entries > haven_config.max_history_count do + table.remove(entries, 1) + end + save_change_file_entries(entries, save_file) + end + + return entries +end + +local process_file_changed = function(buf_info) + local save_file = create_save_file_path(buf_info) + local changed_data = changed_lookup[save_file] + local immediate = vim.fn.filereadable(save_file) == 0 + + local update_changed_lookup = function() + changed_lookup[save_file] = { + changed = buf_info.changed, + changedtick = buf_info.changedtick + } + end + + if + not immediate and + (changed_data == nil or + (buf_info.changed == 0 and changed_data.changed == 0) or + buf_info.changedtick == changed_data.changedtick) + then + update_changed_lookup() + return + end + + if active_saves[save_file] ~= nil then + active_saves[save_file].timer:stop() + active_saves[save_file] = nil + end + + update_changed_lookup() + + local lines = vim.api.nvim_buf_get_lines(buf_info.bufnr, 0, -1, true) + + local entries, _ = read_change_file(save_file) + if entries ~= nil then + if + diff_strings( + table.concat(entries[#entries].lines, line_ending), + table.concat(lines, line_ending) + ):len() == 0 + then + return + end + entries = nil + end + + local saved = false + local do_save = function() + if not saved then + saved = true + save_change_file(buf_info, lines, save_file) + end + end + + if immediate then + do_save() + else + active_saves[save_file] = { + timer = vim.defer_fn(do_save, haven_config.save_timeout), + do_save = do_save + } + end +end + +local check_requirements = function() + if vim.o.modifiable ~= 0 and vim.o.buftype ~= "nofile" then + local buf_info = vim.fn.getbufinfo(vim.fn.bufname()) + if buf_info ~= nil and #buf_info > 0 then + buf_info = buf_info[1] + if buf_info.name:len() ~= 0 and vim.fn.filereadable(buf_info.name) ~= 0 then + if changed_lookup[create_save_file_path(buf_info)] == nil then + for _, is_included in pairs(haven_config.inclusions) do + if is_included(buf_info.name, haven_config) then + return true, buf_info + end + end + + for _, is_excluded in pairs(haven_config.exclusions) do + if is_excluded(buf_info.name, haven_config) then + return false + end + end + end + return true, buf_info + end + end + end + return false +end + +local handle_buffer_changed = function() + local ok, buf_info = check_requirements() + if ok and buf_info ~= nil then + process_file_changed(buf_info) + end +end + +local handle_vim_leave = function() + for _, active in pairs(active_saves) do + if active.timer ~= nil then + active.timer:stop() + end + active.do_save() + end + active_saves = {} + changed_lookup = {} +end + +local setup_autocmds = function() + local group_id = + vim.api.nvim_create_augroup("nvim-haven-internal", {clear = true}) + if haven_config.enabled then + vim.api.nvim_create_autocmd( + "BufEnter", + { + group = group_id, + pattern = "*", + callback = handle_buffer_changed + } + ) + vim.api.nvim_create_autocmd( + "BufWritePost", + { + group = group_id, + pattern = "*", + callback = handle_buffer_changed + } + ) + vim.api.nvim_create_autocmd( + "InsertLeave", + { + group = group_id, + pattern = "*", + callback = handle_buffer_changed + } + ) + vim.api.nvim_create_autocmd( + "TextChanged", + { + group = group_id, + pattern = "*", + callback = handle_buffer_changed + } + ) + vim.api.nvim_create_autocmd( + "VimLeave", + { + group = group_id, + pattern = "*", + callback = handle_vim_leave + } + ) + else + vim.api.nvim_del_augroup_by_id(group_id) + end +end + +local apply_diff_to_lines = function(diff, source_lines) + local diff_lines = diff:split(line_ending) + local changes = {} + local current_diff + + for _, line in pairs(diff_lines) do + if line:len() > 0 then + if line:starts_with("@@") and line:ends_with("@@") then + local diff_range = line:sub(3, -1):sub(1, -3):split(" ")[1]:split(",") + if #diff_range == 1 then + table.insert(diff_range, "1") + end + + local diff_start = math.abs(tonumber(diff_range[1], 10)) + local diff_count = tonumber(diff_range[2], 10) + if diff_count == 0 then + diff_start = diff_start + 1 + end + + current_diff = { + diff = {line}, + next = diff_start + diff_count, + start = diff_start + } + table.insert(changes, current_diff) + elseif current_diff ~= nil then + table.insert(current_diff.diff, line) + end + else + current_diff = nil + end + end + + local actual_line = 1 + local buffer_lines = {} + local diff_rows = {} + local source_line = 1 + for _, change in pairs(changes) do + while source_line < change.start do + table.insert(buffer_lines, source_lines[source_line]) + actual_line = actual_line + 1 + source_line = source_line + 1 + end + + table.insert(diff_rows, actual_line) + for _, change_diff_lines in pairs(change.diff) do + table.insert(buffer_lines, change_diff_lines) + actual_line = actual_line + 1 + end + + source_line = change.next + end + + while source_line <= #source_lines do + table.insert(buffer_lines, source_lines[source_line]) + actual_line = actual_line + 1 + source_line = source_line + 1 + end + + return buffer_lines, diff_rows +end + +local show_picker = function(entries) + global_state.set_global_key("selected_entry", nil) + + local jump_state + + local jump_to_line = function(self, bufnr, lnum) + pcall(vim.api.nvim_buf_clear_namespace, bufnr, ns_previewer, 0, -1) + if lnum and lnum > 0 then + pcall( + vim.api.nvim_buf_add_highlight, + bufnr, + ns_previewer, + "TelescopePreviewLine", + lnum - 1, + 0, + -1 + ) + pcall(vim.api.nvim_win_set_cursor, self.state.winid, {lnum, 0}) + vim.api.nvim_buf_call( + bufnr, + function() + vim.cmd "norm! zz" + end + ) + end + end + + local do_forward_jump = function() + if jump_state ~= nil and #jump_state.diff_rows > 0 then + jump_state.cur = + utils.iff( + (jump_state.cur + 1) <= #jump_state.diff_rows, + jump_state.cur + 1, + #jump_state.diff_rows + ) + jump_to_line( + jump_state.self, + jump_state.self.state.bufnr, + jump_state.diff_rows[jump_state.cur] + ) + end + end + + local do_reverse_jump = function() + if jump_state ~= nil and #jump_state.diff_rows > 0 then + jump_state.cur = + utils.iff((jump_state.cur - 1) > 0, jump_state.cur - 1, 1) + jump_to_line( + jump_state.self, + jump_state.self.state.bufnr, + jump_state.diff_rows[jump_state.cur] + ) + end + end + + pickers.new( + {}, + { + prompt_title = "File History", + previewer = previewers.new_buffer_previewer( + { + define_preview = function(self, entry) + jump_state = nil + if entry.index < #entries then + local previous_lines = entries[entry.index + 1].lines + local buffer_lines, diff_rows = + apply_diff_to_lines( + diff_strings( + table.concat(previous_lines, line_ending), + table.concat(entry.value.lines, line_ending) + ), + previous_lines + ) + previous_lines = nil + + vim.api.nvim_buf_set_lines( + self.state.bufnr, + 0, + -1, + false, + buffer_lines + ) + previewer_utils.regex_highlighter(self.state.bufnr, "diff") + + jump_state = {self = self, cur = 0, diff_rows = diff_rows} + vim.schedule( + function() + do_forward_jump() + end + ) + else + vim.api.nvim_buf_set_lines( + self.state.bufnr, + 0, + -1, + false, + entry.value.lines + ) + previewer_utils.highlighter(self.state.bufnr, entry.value.ft, {}) + end + end + } + ), + sorter = conf.generic_sorter({}), + finder = finders.new_table( + { + results = entries, + entry_maker = function(item) + return { + value = item, + ordinal = tostring(item.date), + display = os.date("%m-%d-%Y %H:%M:%S", item.date) + } + end + } + ), + attach_mappings = function(prompt_bufnr, map) + actions.select_default:replace( + function() + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + if selection ~= nil then + vim.api.nvim_buf_set_lines(0, 0, -1, false, selection.value.lines) + end + end + ) + map("i", "", do_forward_jump) + map("n", "", do_forward_jump) + map("i", "", do_reverse_jump) + map("n", "", do_reverse_jump) + return true + end + } + ):find() +end + +M.setup = function(config) + if config == nil then + config = {} + end + + if config.exclusions ~= nil then + for _, e in pairs(config.exclusions) do + if type(e) ~= "function" then + print_message( + true, + "'exclusions' contains an entry that is not a function. Skipping all exclusions until this is corrected:" + ) + table.print_table(e) + break + end + table.insert(haven_config.exclusions, e) + end + end + haven_config.enabled = vim.F.if_nil(config.enabled, haven_config.enabled) + haven_config.haven_path = + vim.F.if_nil(config.haven_path, haven_config.haven_path) + + if config.inclusions ~= nil then + for _, e in pairs(config.inclusions) do + if type(e) ~= "function" then + print_message( + true, + "'inclusions' contains an entry that is not a function. Skipping this inclusion until it is corrected:" + ) + table.print_table(e) + end + table.insert(haven_config.inclusions, e) + end + end + + haven_config.max_history_count = + vim.F.if_nil(config.max_history_count, haven_config.max_history_count) + if haven_config.max_history_count < 10 then + print_message( + true, + "'max_history_count' too low: " .. haven_config.max_history_count + ) + haven_config.max_history_count = 100 + print_message( + true, + "reset 'max_history_count': " .. haven_config.max_history_count + ) + elseif haven_config.max_history_count > 500 then + print_message( + true, + "'max_history_count' too high: " .. haven_config.max_history_count + ) + haven_config.max_history_count = 500 + print_message( + true, + "reset 'max_history_count': " .. haven_config.max_history_count + ) + end + + haven_config.save_timeout = + vim.F.if_nil(config.save_timeout, haven_config.save_timeout) + if haven_config.save_timeout < 135 then + print_message(true, "'save_timeout' too low: " .. haven_config.save_timeout) + haven_config.save_timeout = 135 + print_message(true, "reset 'save_timeout': " .. haven_config.save_timeout) + elseif haven_config.save_timeout > 10000 then + print_message( + true, + "'save_timeout' too high: " .. haven_config.save_timeout + ) + haven_config.save_timeout = 10000 + print_message(true, "reset 'save_timeout': " .. haven_config.save_timeout) + end + + if vim.fn.mkdir(haven_config.haven_path, "p") == 0 then + print_message(true, "directory create failed: " .. haven_config.haven_path) + haven_config.enabled = false + return + end + + if vim.fn.isdirectory(haven_config.haven_path) == 0 then + print_message(true, "directory not found: " .. haven_config.haven_path) + haven_config.enabled = false + return + end + + setup_autocmds() +end + +M.clean = function() + local decode = function(str) + if str == nil then + return "" + end + + return str:gsub("+", " "):gsub( + "%%(%x%x)", + function(x) + return string.char(tonumber(x, 16)) + end + ) + end + + local history_files = + scan.scan_dir(haven_config.haven_path, {hidden = true, depth = 1}) + for _, history_file in ipairs(history_files) do + local source_path = + Path:new( + decode(Path:new(history_file):make_relative(haven_config.haven_path)):sub( + 1, + -6 + ) + ) + if not source_path:exists() then + local history_path = Path:new(history_file) + print("removing: " .. history_path:absolute()) + history_path:rm() + end + end +end + +M.disable = function() + if haven_config.enabled then + haven_config.enabled = false + setup_autocmds() + handle_vim_leave() + end +end + +M.enable = function() + if not haven_config.enabled then + haven_config.enabled = true + handle_buffer_changed() + setup_autocmds() + end +end + +M.history = function(bufname) + bufname = vim.F.if_nil(bufname, vim.fn.bufname()) + local buf_info = vim.fn.getbufinfo(bufname) + if buf_info ~= nil and #buf_info > 0 then + buf_info = buf_info[1] + local save_file = create_save_file_path(buf_info) + if vim.fn.filereadable(save_file) ~= 0 then + local entries, err = read_change_file(save_file) + if entries == nil then + print_message(true, err) + return + end + + show_picker(table.reverse(entries)) + end + end +end + +_G.Nvim_Haven_Clean = M.clean +_G.Nvim_Haven_Disable = M.disable +_G.Nvim_Haven_Enable = M.enable +_G.Nvim_Haven_History = M.history + +return M diff --git a/nvim/lua/darcula/keymaps.lua b/nvim/lua/darcula/keymaps.lua new file mode 100644 index 0000000..27f9d42 --- /dev/null +++ b/nvim/lua/darcula/keymaps.lua @@ -0,0 +1,1460 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local M = {} + +require("darcula.utils.string") + +local km = require("darcula.utils.keymap") +local telescope_builtin = require("telescope.builtin") +local utils = require("darcula.utils") +local utils_ui = require("darcula.utils.ui") + +if NV_DARCULA_ENABLE_COC then + local coc_command = function(command) + vim.cmd("CocCommand " .. command) + end + + local telescope_coc_command = function(command) + vim.cmd("Telescope coc " .. command) + end + + function M.coc() + local opts = {remap = true, silent = true} + km.vmap( + km.leader "gs", + function() + vim.cmd("CocSearch -F " .. vim.fn.escape(utils.get_visual_text(), " ")) + end, + opts + ) + + km.nmap( + km.leader "gs", + function() + vim.cmd("CocSearch -F " .. vim.fn.escape(utils.cword(), " ")) + end, + opts + ) + + opts = {expr = true, nowait = true, remap = false, silent = true} + + km.set( + "i", + "", + function() + vim.fn.CocActionAsync("showSignatureHelp") + end, + opts + ) + + km.map( + km.leader "ii", + function() + vim.cmd("CocInfo") + end, + {remap = false, silent = true} + ) + + km.map( + km.leader "is", + function() + vim.notify( + utils.iff( + vim.g.coc_status ~= nil and #vim.g.coc_status > 0, + vim.g.coc_status, + "None" + ), + vim.log.levels.INFO + ) + end, + {remap = false, silent = true} + ) + + km.set( + {"n", "v"}, + "", + function() + return NV_Darcula_Coc_Float_Scroll(true) + end, + opts + ) + + km.set( + {"n", "v"}, + "", + function() + return NV_Darcula_Coc_Float_Scroll(false) + end, + opts + ) + + km.imap( + "", + function() + return NV_Darcula_Coc_Float_Scroll_Insert_Mode(true) + end, + opts + ) + + km.imap( + "", + function() + return NV_Darcula_Coc_Float_Scroll_Insert_Mode(false) + end, + opts + ) + + km.imap( + "", + function() + if vim.bo.buftype ~= "nofile" and vim.fn["coc#pum#visible"]() ~= 0 then + return "=coc#start()" + end + return "" + end, + {expr = true, remap = false, silent = true} + ) + + opts = {remap = true, silent = true} + km.imap( + "", + NV_Darcula_Coc_Shift_Tab_Complete, + {remap = false, expr = true} + ) + km.imap( + "", + NV_Darcula_Coc_Tab_Complete, + {remap = false, expr = true, silent = true} + ) + km.imap( + "", + NV_Darcula_Coc_Completion_Confirm, + {remap = false, silent = true, expr = true} + ) + km.nmap(km.leader "cl", "(coc-codelens-action)", opts) + km.nmap(km.leader "gn", "(coc-diagnostic-next)", opts) + km.nmap(km.leader "gp", "(coc-diagnostic-prev)", opts) + km.nmap(km.leader "qf", "(coc-fix-current)", opts) + km.nmap(km.leader "rn", "(coc-rename)", opts) + km.xmap(km.leader "rs", "(coc-range-select)", opts) + km.set({"n", "v"}, km.leader "rs", "(coc-range-select)", opts) + km.set({"n", "x"}, km.leader "a", "(coc-codeaction-selected)", opts) + + km.nmap( + km.leader "ac", + function() + telescope_coc_command("code_actions") + end, + opts + ) + + km.nmap( + km.leader "ca", + function() + telescope_coc_command("code_actions") + end, + opts + ) + + km.nmap( + km.leader "dl", + function() + vim.cmd("CocDiagnostics") + end, + opts + ) + + km.nmap( + km.leader "di", + function() + telescope_coc_command("diagnostics") + end, + opts + ) + + km.nmap( + km.leader "dw", + function() + telescope_coc_command("workspace_diagnostics") + end, + opts + ) + + km.nmap( + km.leader "fs", + function() + telescope_coc_command("document_symbols") + end, + opts + ) + + km.nmap( + km.leader "fw", + function() + telescope_coc_command("workspace_symbols") + end, + opts + ) + + km.nmap( + km.leader "gd", + function() + telescope_coc_command("definitions") + end, + opts + ) + + km.nmap( + km.leader "gD", + function() + telescope_coc_command("declarations") + end, + opts + ) + + km.nmap( + km.leader "gh", + function() + coc_command("clangd.switchSourceHeader") + end, + {silent = true, remap = false, nowait = true} + ) + + km.nmap( + km.leader "gi", + function() + telescope_coc_command("implementations") + end, + opts + ) + + km.nmap( + km.leader "gr", + function() + telescope_coc_command("references") + end, + opts + ) + + km.nmap( + km.leader "gy", + function() + telescope_coc_command("type_definitions") + end, + opts + ) + end +end + +function M.commenting() + local opts = {remap = true, silent = true} + + km.nmap(km.leader "ub", "gcc", opts) + km.nmap(km.leader "uu", "gcc", opts) + km.vmap(km.leader "ub", "gcc", opts) + km.vmap(km.leader "uu", "gcc", opts) +end + +function M.cppman() + local opts = {silent = true} + km.nmap(km.leader "dM", require("cppman").search, opts) +end + +function M.cspell() + local opts = {silent = true} + + km.nmap(km.leader2 "sc", NV_Darcula_Cspell_Cleanup, opts) + + km.nmap( + km.leader2 "su", + function() + NV_Darcula_Cspell_Add_Word(true) + end, + opts + ) + + km.vmap( + km.leader2 "su", + function() + NV_Darcula_Cspell_Add_Selected_Word(true) + end, + opts + ) + + km.nmap( + km.leader2 "sw", + function() + NV_Darcula_Cspell_Add_Word(false) + end, + opts + ) + + km.vmap( + km.leader2 "sw", + function() + NV_Darcula_Cspell_Add_Selected_Word(false) + end, + opts + ) +end + +function M.diff() + km.nmap(km.leader "dn", "]c", {remap = false}) + km.nmap(km.leader "do", ":diffoff", {silent = true, remap = false}) + km.nmap(km.leader "dp", "[c", {remap = false}) +end + +function M.editing() + local opts = {remap = false, silent = true} + + km.nmap("J", "mzJ`z", opts) + + km.nmap(km.leader "O", "O", opts) + km.nmap(km.leader "o", "o", opts) + + km.vmap("<", "", ">gv", opts) +end + +function M.flutter() + local companion = require("darcula.flutter") + local opts = {remap = false, silent = true} + + if NV_DARCULA_ENABLE_COC then + local coc_command = function(command) + vim.cmd("CocCommand " .. command) + end + + km.nmap( + km.leader "fld", + function() + companion.flutter_list(false) + end, + opts + ) + + km.nmap( + km.leader "flv", + function() + companion.flutter_list(false) + end, + opts + ) + + km.nmap( + km.leader "fle", + function() + companion.flutter_list(true) + end, + opts + ) + + km.nmap( + km.leader "flm", + function() + companion.flutter_run(true) + end, + opts + ) + + km.nmap( + km.leader "flx", + function() + companion.flutter_run(false) + end, + opts + ) + + km.nmap( + km.leader "flc", + function() + coc_command("flutter.dev.clearDevLog") + end, + opts + ) + + km.nmap( + km.leader "flg", + function() + coc_command("flutter.pub.get") + end, + opts + ) + km.nmap( + km.leader "fll", + function() + coc_command("flutter.dev.openDevLog") + end, + opts + ) + + km.nmap( + km.leader "flo", + function() + coc_command("flutter.toggleOutline") + end, + opts + ) + + km.nmap( + km.leader "flp", + function() + coc_command("flutter.dev.openDevToolsProfiler") + end, + opts + ) + + km.nmap( + km.leader "flq", + function() + coc_command("flutter.dev.quit") + end, + opts + ) + + km.nmap( + km.leader "flr", + function() + coc_command("flutter.dev.hotReload") + end, + opts + ) + + km.nmap( + km.leader "fls", + function() + coc_command("flutter.dev.hotRestart") + end, + opts + ) + else + km.nmap( + km.leader "flc", + function() + vim.cmd("Telescope flutter commands") + end, + opts + ) + km.nmap( + km.leader "fld", + function() + companion.flutter_list(false) + end, + opts + ) + km.nmap( + km.leader "fle", + function() + companion.flutter_list(true) + end, + opts + ) + km.nmap( + km.leader "flm", + function() + companion.flutter_run(true) + end, + opts + ) + km.nmap( + km.leader "flv", + function() + companion.flutter_list(false) + end, + opts + ) + km.nmap( + km.leader "flx", + function() + companion.flutter_run(false) + end, + opts + ) + end +end + +function M.gitsigns(bufnr) + local opts = {remap = false, silent = true, buffer = bufnr} + + km.nmap( + km.leader2 "tb", + function() + NV_DARCULA_ENABLE_GIT_LINE_BLAME = not NV_DARCULA_ENABLE_GIT_LINE_BLAME + require("gitsigns").toggle_current_line_blame( + NV_DARCULA_ENABLE_GIT_LINE_BLAME + ) + utils.notify_setting_enabled( + "Git line blame", + NV_DARCULA_ENABLE_GIT_LINE_BLAME + ) + end, + opts + ) + + km.nmap( + km.leader "bl", + function() + vim.cmd("Gitsigns blame_line") + end, + opts + ) +end + +function M.gui() + if utils_ui.is_gui() then + km.cmap("", "+", {remap = true}) + km.cmap("", "+", {remap = true}) + km.imap("", "+", {remap = true}) + km.imap("", "+", {remap = true}) + km.map("", "p", {remap = true}) + km.map("", "p", {remap = true}) + + local opts = {remap = true, silent = true} + km.nmap( + km.leader2 "gd", + function() + NV_Darcula_Set_Gui_Font(0) + end, + opts + ) + + km.nmap( + km.leader2 "gl", + function() + NV_Darcula_Set_Gui_Font(3) + end, + opts + ) + + km.nmap( + km.leader2 "gm", + function() + NV_Darcula_Set_Gui_Font(2) + end, + opts + ) + + km.nmap( + km.leader2 "gs", + function() + NV_Darcula_Set_Gui_Font(1) + end, + opts + ) + end +end + +if not NV_DARCULA_ENABLE_COC then + function M.lsp() + local opts = {remap = false, silent = true} + + km.nmap(km.leader "dl", vim.diagnostic.setloclist, opts) + km.nmap(km.leader "dw", telescope_builtin.diagnostics, opts) + km.nmap(km.leader "fs", telescope_builtin.lsp_document_symbols, opts) + km.nmap(km.leader "fw", telescope_builtin.lsp_workspace_symbols, opts) + km.nmap( + km.leader "gn", + function() + vim.diagnostic.jump({count = 1, float = true}) + end, + opts + ) + km.nmap( + km.leader "gp", + function() + vim.diagnostic.jump({count = -1, float = true}) + end, + opts + ) + + km.nmap( + km.leader "di", + function() + telescope_builtin.diagnostics({bufnr = 0}) + end, + opts + ) + + km.nmap( + km.leader "df", + function() + vim.diagnostic.open_float(nil, {focus = false}) + end, + opts + ) + + km.map( + km.leader "ii", + function() + vim.cmd("LspInfo") + end, + opts + ) + + km.set( + {"i", "n"}, + "", + function() + vim.lsp.buf.signature_help({border = "rounded"}) + end + ) + end +end + +if not NV_DARCULA_ENABLE_COC then + function M.lsp_on_attach(ev) + local client = vim.lsp.get_client_by_id(ev.data.client_id) + if not client then + return + end + + local opts = {remap = false, silent = true, buffer = ev.buf} + + km.nmap(km.leader "aw", vim.lsp.buf.code_action, opts) + km.nmap(km.leader "ca", vim.lsp.buf.code_action, opts) + km.nmap(km.leader "gD", vim.lsp.buf.declaration, opts) + km.nmap(km.leader "gd", telescope_builtin.lsp_definitions, opts) + km.nmap(km.leader "gi", telescope_builtin.lsp_implementations, opts) + km.nmap(km.leader "gr", telescope_builtin.lsp_references, opts) + km.nmap(km.leader "gy", telescope_builtin.lsp_type_definitions, opts) + km.nmap(km.leader "rn", vim.lsp.buf.rename, opts) + + km.vmap( + km.leader "ac", + function() + vim.lsp.buf.range_code_action(nil, nil, nil) + end, + opts + ) + + km.vmap( + km.leader "aw", + function() + vim.lsp.buf.range_code_action(nil, nil, nil) + end, + opts + ) + + km.vmap( + km.leader "ca", + function() + vim.lsp.buf.range_code_action(nil, nil, nil) + end, + opts + ) + end +end + +if not NV_DARCULA_ENABLE_COC then + function M.mason() + km.map(km.leader "in", ":Mason", {remap = true, silent = true}) + end +end + +function M.mini() + if not NV_DARCULA_ENABLE_COC then + local map_multistep = require("mini.keymap").map_multistep + + map_multistep( + "i", + "", + { + "minisnippets_next", + "minisnippets_expand", + "pmenu_next" + } + ) + + map_multistep( + "i", + "", + { + "minisnippets_prev", + "pmenu_prev" + } + ) + + map_multistep( + "i", + "", + { + "pmenu_accept", + "minipairs_cr" + } + ) + + map_multistep( + "i", + "", + { + "minipairs_bs" + } + ) + end +end + +function M.navigation() + km.nmap( + "", + '"vertical resize -" . v:count1 . ""', + {expr = true, replace_keycodes = false} + ) + km.nmap( + "", + '"resize -" . v:count1 . ""', + {expr = true, replace_keycodes = false} + ) + km.nmap( + "", + '"resize +" . v:count1 . ""', + {expr = true, replace_keycodes = false} + ) + km.nmap( + "", + '"vertical resize +" . v:count1 . ""', + {expr = true, replace_keycodes = false} + ) + + km.cmap("", "", {silent = false}) + km.cmap("", "", {silent = false}) + + km.imap("", "", {remap = true}) + km.imap("", "", {remap = true}) + + km.tmap("", "") + km.tmap("", "") + + km.map(km.leader "0", "", {remap = false}) + km.map(km.leader "8", "", {remap = false}) + km.map(km.leader "9", "", {remap = false}) + km.map(km.leader "h", "h", {remap = true, silent = true}) + km.map(km.leader "j", "j", {remap = true, silent = true}) + km.map(km.leader "k", "k", {remap = true, silent = true}) + km.map(km.leader "l", "l", {remap = true, silent = true}) + + km.map(km.leader "mh", "H", {remap = false}) + km.map(km.leader "mj", "J", {remap = false}) + km.map(km.leader "mk", "K", {remap = false}) + km.map(km.leader "ml", "L", {remap = false}) + + km.nmap("", "Nzz", {remap = false}) + km.nmap("n", "nzz", {remap = false}) + + km.nmap("j", "gj") + km.nmap("k", "gk") +end + +function M.nvim_dap() + local dap = require("dap") + km.nmap("", dap.continue, {remap = true, silent = true}) + km.nmap("", dap.toggle_breakpoint, {remap = true, silent = true}) + km.nmap("", dap.step_over, {remap = true, silent = true}) + km.nmap("", dap.step_into, {remap = true, silent = true}) + km.nmap("", dap.step_out, {remap = true, silent = true}) + km.set( + {"n", "v", "x"}, + km.leader "vi", + function() + require("dapui").eval() + require("dapui").eval() + end, + {remap = true, silent = true} + ) +end + +function M.nvim_haven() + km.nmap( + km.leader "fy", + require("darcula.haven").history, + {remap = true, silent = true} + ) + + km.nmap( + km.leader "ch", + require("darcula.haven").clean, + {remap = true, silent = true} + ) +end + +function M.nvim_tree() + local opts = {remap = false, silent = true} + + km.map( + km.leader "ns", + function() + NV_Darcula_Open_Nvim_Tree(true) + end, + opts + ) + + km.map( + km.leader "nt", + function() + NV_Darcula_Open_Nvim_Tree(false) + end, + opts + ) +end + +function M.nvim_tree_on_attach(bufnr) + local api = require("nvim-tree.api") + + local opts = function(desc) + return { + desc = "nvim-tree: " .. desc, + buffer = bufnr, + noremap = true, + silent = true, + nowait = true + } + end + + -- Default mappings. Feel free to modify or remove as you wish. + -- + -- BEGIN_DEFAULT_ON_ATTACH + vim.keymap.set("n", "", api.tree.change_root_to_node, opts("CD")) + vim.keymap.set( + "n", + "", + api.node.open.replace_tree_buffer, + opts("Open: In Place") + ) + vim.keymap.set("n", "", api.node.show_info_popup, opts("Info")) + vim.keymap.set("n", "", api.fs.rename_sub, opts("Rename: Omit Filename")) + vim.keymap.set("n", "", api.node.open.tab, opts("Open: New Tab")) + vim.keymap.set( + "n", + "", + api.node.open.vertical, + opts("Open: Vertical Split") + ) + vim.keymap.set( + "n", + "", + api.node.open.horizontal, + opts("Open: Horizontal Split") + ) + vim.keymap.set( + "n", + "", + api.node.navigate.parent_close, + opts("Close Directory") + ) + vim.keymap.set("n", "", api.node.open.edit, opts("Open")) + vim.keymap.set("n", "", api.node.open.preview, opts("Open Preview")) + vim.keymap.set("n", ">", api.node.navigate.sibling.next, opts("Next Sibling")) + vim.keymap.set( + "n", + "<", + api.node.navigate.sibling.prev, + opts("Previous Sibling") + ) + vim.keymap.set("n", ".", api.node.run.cmd, opts("Run Command")) + vim.keymap.set("n", "-", api.tree.change_root_to_parent, opts("Up")) + vim.keymap.set("n", "a", api.fs.create, opts("Create")) + vim.keymap.set("n", "bmv", api.marks.bulk.move, opts("Move Bookmarked")) + vim.keymap.set( + "n", + "B", + api.tree.toggle_no_buffer_filter, + opts("Toggle No Buffer") + ) + vim.keymap.set("n", "c", api.fs.copy.node, opts("Copy")) + vim.keymap.set( + "n", + "C", + api.tree.toggle_git_clean_filter, + opts("Toggle Git Clean") + ) + vim.keymap.set("n", "[c", api.node.navigate.git.prev, opts("Prev Git")) + vim.keymap.set("n", "]c", api.node.navigate.git.next, opts("Next Git")) + vim.keymap.set("n", "d", api.fs.remove, opts("Delete")) + vim.keymap.set("n", "D", api.fs.trash, opts("Trash")) + vim.keymap.set("n", "E", api.tree.expand_all, opts("Expand All")) + vim.keymap.set("n", "e", api.fs.rename_basename, opts("Rename: Basename")) + vim.keymap.set( + "n", + "]e", + api.node.navigate.diagnostics.next, + opts("Next Diagnostic") + ) + vim.keymap.set( + "n", + "[e", + api.node.navigate.diagnostics.prev, + opts("Prev Diagnostic") + ) + vim.keymap.set("n", "F", api.live_filter.clear, opts("Clean Filter")) + vim.keymap.set("n", "f", api.live_filter.start, opts("Filter")) + vim.keymap.set("n", "g?", api.tree.toggle_help, opts("Help")) + vim.keymap.set( + "n", + "gy", + api.fs.copy.absolute_path, + opts("Copy Absolute Path") + ) + vim.keymap.set( + "n", + "H", + api.tree.toggle_hidden_filter, + opts("Toggle Dotfiles") + ) + vim.keymap.set( + "n", + "I", + api.tree.toggle_gitignore_filter, + opts("Toggle Git Ignore") + ) + vim.keymap.set("n", "J", api.node.navigate.sibling.last, opts("Last Sibling")) + vim.keymap.set( + "n", + "K", + api.node.navigate.sibling.first, + opts("First Sibling") + ) + vim.keymap.set("n", "m", api.marks.toggle, opts("Toggle Bookmark")) + vim.keymap.set("n", "o", api.node.open.edit, opts("Open")) + vim.keymap.set( + "n", + "O", + api.node.open.no_window_picker, + opts("Open: No Window Picker") + ) + vim.keymap.set("n", "p", api.fs.paste, opts("Paste")) + vim.keymap.set("n", "P", api.node.navigate.parent, opts("Parent Directory")) + vim.keymap.set("n", "q", api.tree.close, opts("Close")) + vim.keymap.set("n", "r", api.fs.rename, opts("Rename")) + vim.keymap.set("n", "R", api.tree.reload, opts("Refresh")) + -- vim.keymap.set("n", "s", api.node.run.system, opts("Run System")) + vim.keymap.set("n", "S", api.tree.search_node, opts("Search")) + vim.keymap.set("n", "U", api.tree.toggle_custom_filter, opts("Toggle Hidden")) + vim.keymap.set("n", "W", api.tree.collapse_all, opts("Collapse")) + vim.keymap.set("n", "x", api.fs.cut, opts("Cut")) + vim.keymap.set("n", "y", api.fs.copy.filename, opts("Copy Name")) + vim.keymap.set( + "n", + "Y", + api.fs.copy.relative_path, + opts("Copy Relative Path") + ) + vim.keymap.set("n", "<2-LeftMouse>", api.node.open.edit, opts("Open")) + vim.keymap.set( + "n", + "<2-RightMouse>", + api.tree.change_root_to_node, + opts("CD") + ) + -- END_DEFAULT_ON_ATTACH + + -- Mappings migrated from view.mappings.list + -- + -- You will need to insert "your code goes here" for any mappings with a custom action_cb + vim.keymap.set("n", "-", api.tree.change_root_to_parent, opts("Up")) + vim.keymap.set( + "n", + "<", + api.node.navigate.sibling.prev, + opts("Previous Sibling") + ) + vim.keymap.set("n", "", api.node.open.edit, opts("Open")) + vim.keymap.set("n", "o", api.node.open.edit, opts("Open")) + vim.keymap.set("n", "<2-LeftMouse>", api.node.open.edit, opts("Open")) + vim.keymap.set( + "n", + "<2-RightMouse>", + api.tree.change_root_to_node, + opts("CD") + ) + vim.keymap.set("n", "CC", api.tree.change_root_to_node, opts("CD")) + vim.keymap.set( + "n", + "", + api.node.navigate.parent_close, + opts("Close Directory") + ) + vim.keymap.set("n", "", api.fs.rename_sub, opts("Rename: Omit Filename")) + vim.keymap.set("n", ">", api.node.navigate.sibling.next, opts("Next Sibling")) + vim.keymap.set( + "n", + "I", + api.tree.toggle_hidden_filter, + opts("Toggle Dotfiles") + ) + vim.keymap.set("n", "P", api.node.open.preview, opts("Open Preview")) + vim.keymap.set( + "n", + "Y", + api.fs.copy.relative_path, + opts("Copy Relative Path") + ) + vim.keymap.set("n", "a", api.fs.create, opts("Create")) + vim.keymap.set("n", "c", api.fs.copy.node, opts("Copy")) + vim.keymap.set( + "n", + "gy", + api.fs.copy.absolute_path, + opts("Copy Absolute Path") + ) + vim.keymap.set( + "n", + "i", + api.node.open.horizontal, + opts("Open: Horizontal Split") + ) + vim.keymap.set("n", "d", api.fs.remove, opts("Delete")) + vim.keymap.set("n", "r", api.fs.rename, opts("Rename")) + vim.keymap.set("n", "p", api.fs.paste, opts("Paste")) + vim.keymap.set("n", "q", api.tree.close, opts("Close")) + vim.keymap.set("n", "R", api.tree.reload, opts("Refresh")) + vim.keymap.set("n", "s", api.node.open.vertical, opts("Open: Vertical Split")) + vim.keymap.set("n", "x", api.fs.cut, opts("Cut")) + vim.keymap.set("n", "y", api.fs.copy.filename, opts("Copy Name")) + vim.keymap.set("n", "", api.node.open.tab, opts("Open: New Tab")) + vim.keymap.set("n", "f", api.node.navigate.parent, opts("Parent Directory")) + vim.keymap.set( + "n", + "K", + api.node.navigate.sibling.first, + opts("First Sibling") + ) + vim.keymap.set("n", "J", api.node.navigate.sibling.last, opts("Last Sibling")) + vim.keymap.set("n", "[c", api.node.navigate.git.prev, opts("Prev Git")) + vim.keymap.set("n", "]c", api.node.navigate.git.next, opts("Next Git")) + vim.keymap.set("n", "?", api.tree.toggle_help, opts("Help")) +end + +function M.nvim_window_picker() + local opts = {remap = true, silent = true} + km.map(km.leader "sw", ":WindowPick", opts) + km.map(km.leader "sW", ":WindowSwap", opts) +end + +function M.quickfix() + local opts = {remap = false, silent = true} + + km.nmap(km.leader "co", NV_Darcula_Copen, opts) + km.nmap(km.leader "qc", ":cclose", opts) + km.nmap(km.leader "qn", ":cn", opts) + km.nmap(km.leader "qo", ":copen", opts) + km.nmap(km.leader "qp", ":cp", opts) + + km.nmap(km.leader2 "lc", ":lclose", opts) + km.nmap(km.leader2 "ln", ":lnext", opts) + km.nmap(km.leader2 "lo", ":lopen", opts) + km.nmap(km.leader2 "lp", ":lprevious", opts) +end + +function M.starter() + km.nmap( + km.leader "st", + function() + if vim.fn.bufname("%"):starts_with("NvimTree") then + vim.cmd("wincmd l") + end + + vim.cmd("NvimTreeClose") + MiniStarter.open() + end, + {remap = false, silent = true} + ) +end + +function M.tab() + local opts = {remap = false, silent = true} + + km.nmap(km.leader2 "bb", ":tabnext #", opts) + km.nmap(km.leader2 "bc", ":tabnew", opts) + km.nmap(km.leader2 "bf", ":tabfirst", opts) + km.nmap(km.leader2 "bl", ":tablast", opts) + km.nmap(km.leader2 "bn", ":tabnext", opts) + km.nmap(km.leader2 "bp", ":tabprevious", opts) + km.nmap(km.leader2 "bq", ":tabclose", opts) + km.nmap(km.leader2 "bs", ":tab split", opts) +end + +function M.telescope() + local opts = {remap = false, silent = true} + + km.nmap(km.leader "es", telescope_builtin.grep_string, opts) + km.vmap( + km.leader "es", + function() + NV_Darcula_Grab_Selection( + function(word) + telescope_builtin.grep_string({search = word}) + end + ) + end, + opts + ) + + km.nmap(km.leader "fb", telescope_builtin.buffers, opts) + km.nmap(km.leader "fc", telescope_builtin.colorscheme, opts) + km.nmap(km.leader "fg", telescope_builtin.git_files, opts) + km.nmap(km.leader "fh", telescope_builtin.help_tags, opts) + km.nmap(km.leader "fi", telescope_builtin.command_history, opts) + km.nmap(km.leader "fm", telescope_builtin.man_pages, opts) + km.nmap(km.leader "fp", telescope_builtin.keymaps, opts) + km.nmap(km.leader "ft", telescope_builtin.git_status, opts) + km.nmap(km.leader "fz", telescope_builtin.current_buffer_fuzzy_find, opts) + km.nmap(km.leader "rg", telescope_builtin.live_grep, opts) + + km.nmap( + km.leader "ff", + function() + telescope_builtin.find_files({hidden = true}) + end, + opts + ) +end + +function M.toggle() + local opts = {remap = false, silent = true} + + -- Fixed height + km.nmap( + km.leader2 "fh", + function() + vim.cmd("setlocal winfixheight!") + utils.notify_setting_enabled("Fixed height", vim.opt.winfixheight:get()) + end, + opts + ) + + -- Fixed width + km.nmap( + km.leader2 "fw", + function() + vim.cmd("setlocal winfixwidth!") + utils.notify_setting_enabled("Fixed width", vim.opt.winfixwidth:get()) + end, + opts + ) + + -- Colorizer + km.nmap( + km.leader2 "tc", + function() + vim.cmd("ColorizerToggle") + end, + opts + ) + + -- Document Formatting + km.nmap( + km.leader2 "tf", + function() + NV_DARCULA_ENABLE_FORMATTING = not NV_DARCULA_ENABLE_FORMATTING + utils.notify_setting_enabled( + "Text formatting", + NV_DARCULA_ENABLE_FORMATTING + ) + end, + opts + ) + + km.nmap( + km.leader2 "tF", + function() + utils.notify_setting_enabled( + "Text formatting", + NV_DARCULA_ENABLE_FORMATTING + ) + end, + opts + ) + + -- List mode + km.map( + km.leader2 "tl", + function() + vim.cmd("set list!") + utils.notify_setting_enabled("List mode", vim.opt.list:get()) + end, + opts + ) + + km.map( + km.leader2 "tL", + function() + utils.notify_setting_enabled("List mode", vim.opt.list:get()) + end, + opts + ) + + -- Relative line numbers + km.nmap( + km.leader2 "tr", + function() + vim.cmd("set invrelativenumber") + utils.notify_setting_enabled( + "Relative numbers", + vim.opt.relativenumber:get() + ) + end, + opts + ) + + km.nmap( + km.leader2 "tR", + function() + utils.notify_setting_enabled( + "Relative numbers", + vim.opt.relativenumber:get() + ) + end, + opts + ) + + -- Line wrapping + km.nmap( + km.leader2 "tw", + function() + vim.cmd("set invwrap") + utils.notify_setting_enabled("Line wrapping", vim.opt.wrap:get()) + end, + opts + ) + + km.nmap( + km.leader2 "tW", + function() + utils.notify_setting_enabled("Line wrapping", vim.opt.wrap:get()) + end, + opts + ) +end + +function M.treesitter() + local swap = require("nvim-treesitter-textobjects.swap") + + km.nmap( + "mar", + function() + swap.swap_next "@parameter.inner" + end + ) + + km.nmap( + "mal", + function() + swap.swap_previous "@parameter.inner" + end + ) +end + +function M.vim() + local opts = {remap = false, silent = true} + + km.tmap("", "", opts) + + km.map(km.leader "wa", NV_Darcula_Write_All, opts) + km.nmap("K", NV_Darcula_Show_Documentation, opts) + km.nmap(km.leader "=", "=", opts) + km.nmap( + km.leader "bq", + function() + local buffer_name = vim.fn.bufname() + if buffer_name ~= nil then + if buffer_name:starts_with("NvimTree") then + vim.cmd("wincmd l") + end + + for _, value in pairs(vim.api.nvim_list_bufs()) do + if value ~= vim.fn.bufnr() then + buffer_name = vim.fn.bufname(value) + if + buffer_name ~= nil and not buffer_name:starts_with("NvimTree") and + not buffer_name:starts_with("term:") + then + vim.cmd("silent! bd! " .. value) + end + end + end + end + end, + opts + ) + km.nmap(km.leader2 "m", ":Messages", opts) + km.nmap( + km.leader2 "n", + function() + vim.cmd("vert new") + vim.opt_local.wrap = true + MiniNotify.show_history() + end, + opts + ) + km.nmap(km.leader "cf", ":echo expand('%:p')", opts) + km.nmap(km.leader "ci", NV_Darcula_Close_Invalid, opts) + km.nmap(km.leader "cn", ":echo expand('%:t')", opts) + km.nmap(km.leader "cp", ":echo expand('%:p')", opts) + km.nmap(km.leader "cr", ":echo @%", opts) + km.nmap(km.leader "ee", NV_Darcula_Refresh_Buffer, opts) + km.nmap(km.leader "nh", ":noh", opts) + km.nmap(km.leader "nm", "]m", opts) + km.nmap(km.leader "pm", "[m", opts) + km.nmap( + km.leader "sla", + ":%s/\\ /\\r/g:noh", + {remap = true, silent = true} + ) + km.nmap( + km.leader "sll", + ":s/\\ /\\r/g:noh", + {remap = true, silent = true} + ) + km.nmap(km.leader "sp", ":sp", opts) + km.nmap(km.leader "te", ":term", opts) + km.nmap(km.leader "v", "", opts) + km.nmap(km.leader "vs", ":vs", opts) + km.vmap("p", '"_dP', opts) + km.vmap(km.leader "ss", ":sort", opts) + + km.set( + {"n", "v"}, + km.leader "dd", + NV_Darcula_Show_Documentation, + {remap = true, silent = true} + ) + km.set( + {"n", "v"}, + km.leader "dh", + NV_Darcula_Show_Documentation, + {remap = true, silent = true} + ) + + km.nmap( + km.leader "dm", + function() + NV_Darcula_Show_Man_Documentation(false) + end, + opts + ) + + km.vmap( + km.leader "dm", + function() + NV_Darcula_Show_Man_Documentation(true) + end, + opts + ) + + km.map( + km.leader "qa", + function() + NV_Darcula_Close_All(false) + end, + opts + ) + + km.map( + km.leader "qq", + function() + if vim.bo.buftype == "prompt" then + vim.api.nvim_input("") + return + end + vim.cmd("q") + end, + opts + ) + + km.map( + km.leader "wqa", + function() + NV_Darcula_Close_All(true) + end, + opts + ) + + km.map( + km.leader "ww", + function() + if vim.bo.buftype ~= "prompt" then + vim.cmd("w") + end + end, + opts + ) + + km.nmap( + km.leader "dv", + function() + NV_Darcula_Show_Vim_Documentation(false) + end, + opts + ) + + km.vmap( + km.leader "dv", + function() + NV_Darcula_Show_Vim_Documentation(true) + end, + opts + ) +end + +function M.vim_fugitive() + local opts = {remap = false, silent = true} + + km.nmap(km.leader "tc", ":Git commit", opts) + km.nmap(km.leader "tp", ":Git push", opts) + km.nmap(km.leader "ts", ":Git", opts) + km.nmap(km.leader "tu", ":Git pull", opts) + km.nmap(km.leader "tl", ":Telescope git_commits", opts) + km.nmap(km.leader "ttl", ":Git reflog", opts) + km.nmap(km.leader "ttL", ":GcLog", opts) +end + +(function() + if NV_DARCULA_ENABLE_COC then + M.coc() + end + M.commenting() + M.cppman() + M.cspell() + M.diff() + M.editing() + M.flutter() + M.gui() + if not NV_DARCULA_ENABLE_COC then + M.lsp() + end + if not NV_DARCULA_ENABLE_COC then + M.mason() + end + M.mini() + M.navigation() + M.nvim_dap() + M.nvim_haven() + M.nvim_tree() + M.nvim_window_picker() + M.quickfix() + M.starter() + M.tab() + M.telescope() + M.toggle() + M.treesitter() + M.vim() + M.vim_fugitive() +end)() + +return M diff --git a/nvim/lua/darcula/options.lua b/nvim/lua/darcula/options.lua new file mode 100644 index 0000000..55d1430 --- /dev/null +++ b/nvim/lua/darcula/options.lua @@ -0,0 +1,113 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local symbols = require("darcula.utils.symbols") + +vim.g.mapleader = " " +vim.g.maplocalleader = " " +if require("darcula.utils.os").is_mac then + vim.g.python3_host_prog = "/usr/bin/python3" +end +vim.g.viminfo = "100,n" .. vim.fs.joinpath(vim.fn.stdpath("state"), "viminfo") + +vim.opt.background = "dark" +vim.opt.backspace = "indent,eol,start" +vim.opt.backup = false +vim.opt.clipboard = "unnamedplus" +vim.opt.cmdheight = 1 +vim.opt.colorcolumn = NV_DARCULA_COLOR_COLUMN +vim.opt.completeopt = "menu,menuone,noselect,fuzzy" +vim.opt.cursorline = true +vim.opt.diffopt = { + "internal", + "filler", + "closeoff", + "context:6", + "algorithm:histogram", + "indent-heuristic", + "linematch:60" +} +vim.opt.encoding = "UTF-8" +vim.opt.equalalways = false +vim.opt.errorbells = false +vim.opt.expandtab = true +vim.opt.fileencoding = "UTF-8" +vim.opt.fillchars = "vert: ,eob: ,stl: ,stlnc: " +vim.opt.foldcolumn = "0" +vim.opt.guicursor = + "n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor,sm:block-blinkwait175-blinkoff150-blinkon175" +vim.opt.hidden = true +vim.opt.hlsearch = true +vim.opt.ignorecase = true +vim.opt.incsearch = true +vim.opt.iskeyword:append("-") +vim.opt.laststatus = 2 +vim.opt.listchars = + "tab:" .. + symbols.listchars.tab .. + ",space:" .. + symbols.listchars.space .. + ",nbsp:" .. + symbols.listchars.nbsp .. + ",trail:" .. + symbols.listchars.trail .. + ",eol:" .. + symbols.listchars.eol .. + ",precedes:" .. + symbols.listchars.precedes .. + ",extends:" .. symbols.listchars.extends +vim.opt.matchpairs:append("<:>") +vim.opt.maxmempattern = 20000 +vim.opt.more = false +vim.opt.mouse = "" +vim.opt.mousehide = false +vim.opt.number = true +vim.opt.numberwidth = 4 +if not NV_DARCULA_ENABLE_COC then + vim.opt.pumborder = "rounded" +end +vim.opt.redrawtime = 10000 +vim.opt.relativenumber = true +vim.opt.rtp:append(vim.fn.fnamemodify(vim.fn.stdpath("data") .. "/site", ":p")) +vim.opt.scrolloff = 8 +vim.opt.selection = "inclusive" +vim.opt.shell = "bash" +vim.opt.shellcmdflag = "-lc" +vim.opt.shiftwidth = 2 +vim.opt.shortmess = vim.o.shortmess .. "cI" +vim.opt.showmatch = true +vim.opt.showmode = false +vim.opt.sidescrolloff = 8 +vim.opt.signcolumn = "yes" +vim.opt.smartcase = true +vim.opt.softtabstop = 2 +vim.opt.splitbelow = true +vim.opt.splitright = true +vim.opt.syntax = "enable" +vim.opt.tabstop = 2 +vim.opt.termguicolors = true +vim.opt.undodir = vim.fs.joinpath(vim.fn.stdpath("data"), ".undo") +vim.opt.undofile = true +vim.opt.updatetime = 250 +vim.opt.wildmode = "longest:full,full" +if not NV_DARCULA_ENABLE_COC then + vim.opt.winborder = "rounded" +end +vim.opt.wrap = false +vim.opt.writebackup = false diff --git a/nvim/lua/darcula/plugins.lua b/nvim/lua/darcula/plugins.lua new file mode 100644 index 0000000..b69f284 --- /dev/null +++ b/nvim/lua/darcula/plugins.lua @@ -0,0 +1,168 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("darcula.config") + +vim.api.nvim_create_autocmd( + "PackChanged", + { + callback = function(ev) + local kind = ev.data.kind + if (ev.data.kind ~= "install" and kind ~= "update") then + return + end + + local name = ev.data.spec.name + if NV_DARCULA_ENABLE_COC then + if name == "coc.nvim" then + vim.system( + {"npm", "i"}, + { + cwd = vim.fs.joinpath( + vim.fn.stdpath("data"), + "site", + "pack", + "core", + "opt", + "coc.nvim" + ) + } + ):wait() + return + end + end + + if name == "nvim-treesitter" then + require("darcula.setup.500_treesitter") + vim.cmd("TSUpdate") + return + end + end + } +) + +vim.pack.add( + { + {src = "https://git.fifthgrid.com/sgraves/darcula_lush"}, + { + src = "https://github.com/catgoose/nvim-colorizer.lua", + version = "85a5e83cd4daa258cf95c3204e277991d6fbe747" + }, + {src = "https://github.com/dart-lang/dart-vim-plugin"}, + {src = "https://github.com/dstein64/nvim-scrollview"}, + {src = "https://github.com/kyazdani42/nvim-tree.lua"}, + {src = "https://github.com/leoluz/nvim-dap-go"}, + {src = "https://github.com/lewis6991/gitsigns.nvim"}, + {src = "https://github.com/mfussenegger/nvim-dap"}, + {src = "https://github.com/mhartington/formatter.nvim"}, + {src = "https://github.com/nvim-lua/plenary.nvim"}, + {src = "https://github.com/nvim-mini/mini.nvim"}, + {src = "https://github.com/nvim-neotest/nvim-nio"}, + {src = "https://github.com/nvim-telescope/telescope-ui-select.nvim"}, + {src = "https://github.com/nvim-telescope/telescope.nvim"}, + {src = "https://github.com/nvim-treesitter/nvim-treesitter"}, + {src = "https://github.com/nvim-treesitter/nvim-treesitter-textobjects"}, + {src = "https://github.com/rcarriga/nvim-dap-ui"}, + {src = "https://github.com/rktjmp/lush.nvim"}, + {src = "https://github.com/rktjmp/shipwright.nvim"}, + {src = "https://github.com/sgraves76/cppman.nvim"}, + {src = "https://github.com/stevearc/dressing.nvim"}, + {src = "https://github.com/ten3roberts/window-picker.nvim"}, + {src = "https://github.com/tpope/vim-dispatch"}, + {src = "https://github.com/tpope/vim-fugitive"} + }, + {confirm = false} +) + +if NV_DARCULA_ENABLE_COC then + vim.pack.add( + { + {src = "https://github.com/fannheyward/telescope-coc.nvim"}, + {src = "https://github.com/neoclide/coc.nvim", {version = "release"}}, + {src = "https://github.com/honza/vim-snippets"} + }, + {confirm = false} + ) +else + vim.pack.add( + { + {src = "https://github.com/WhoIsSethDaniel/mason-tool-installer.nvim"}, + {src = "https://github.com/akinsho/flutter-tools.nvim"}, + {src = "https://github.com/kosayoda/nvim-lightbulb"}, + {src = "https://github.com/mason-org/mason-lspconfig.nvim"}, + {src = "https://github.com/mason-org/mason.nvim"}, + {src = "https://github.com/neovim/nvim-lspconfig"} + }, + {confirm = false} + ) +end + +vim.cmd("packadd! plenary.nvim") + +vim.cmd("packadd! lush.nvim") +vim.cmd("packadd! darcula_lush") +vim.cmd("colorscheme " .. NV_DARCULA_COLOR_SCHEME) + +if NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! coc.nvim") +else + vim.cmd("packadd! nvim-lspconfig") +end + +vim.cmd("packadd! cppman.nvim") +if NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! dart-vim-plugin") +end +vim.cmd("packadd! dressing.nvim") +if not NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! flutter-tools.nvim") +end +vim.cmd("packadd! formatter.nvim") +vim.cmd("packadd! gitsigns.nvim") +if not NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! mason-lspconfig.nvim") +end +if not NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! mason.nvim") +end +vim.cmd("packadd! mini.nvim") +vim.cmd("packadd! nvim-colorizer.lua") +vim.cmd("packadd! nvim-dap") +vim.cmd("packadd! nvim-dap-go") +vim.cmd("packadd! nvim-dap-ui") +if not NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! nvim-lightbulb") +end +vim.cmd("packadd! nvim-nio") +vim.cmd("packadd! nvim-scrollview") +vim.cmd("packadd! nvim-tree.lua") +vim.cmd("packadd! nvim-treesitter") +vim.cmd("packadd! nvim-treesitter-textobjects") +vim.cmd("packadd! shipwright.nvim") +if NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! telescope-coc.nvim") +end +vim.cmd("packadd! telescope-ui-select.nvim") +vim.cmd("packadd! telescope.nvim") +vim.cmd("packadd! vim-dispatch") +vim.cmd("packadd! vim-fugitive") +if NV_DARCULA_ENABLE_COC then + vim.cmd("packadd! vim-snippets") +end +vim.cmd("packadd! window-picker.nvim") diff --git a/nvim/lua/darcula/setup.lua b/nvim/lua/darcula/setup.lua new file mode 100644 index 0000000..a3d1b59 --- /dev/null +++ b/nvim/lua/darcula/setup.lua @@ -0,0 +1,26 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local setup_list = + require("darcula.utils").get_files_sorted_without_extension( + vim.fs.joinpath(vim.fn.stdpath("config"), "lua", "darcula", "setup") +) +for _, name in pairs(setup_list) do + require("darcula.setup." .. name) +end diff --git a/nvim/lua/darcula/setup/100_coc.lua b/nvim/lua/darcula/setup/100_coc.lua new file mode 100644 index 0000000..ac96826 --- /dev/null +++ b/nvim/lua/darcula/setup/100_coc.lua @@ -0,0 +1,168 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if not NV_DARCULA_ENABLE_COC then + return +end + +require("darcula.utils.table") + +local coc_config = vim.fn["coc#config"] +local utils = require("darcula.utils") +local utils_os = require("darcula.utils.os") + +utils.copy_file( + utils.iff( + utils_os.is_windows, + vim.fs.joinpath(vim.fn.stdpath("config"), "coc-settings.windows.json"), + vim.fs.joinpath(vim.fn.stdpath("config"), "coc-settings.unix.json") + ), + vim.fs.joinpath(vim.fn.stdpath("config"), "coc-settings.json") +) + +vim.g.coc_data_home = vim.fs.joinpath(vim.fn.stdpath("data"), "coc") + +-- local coc_get_config = vim.fn["coc#util#get_config"] +-- M.plug_end = function(lua_library_list) +-- utils.augroup_with_autocmd( +-- "coc_config_lua_cfg", +-- "User", +-- "CocNvimInit", +-- function() +-- local workspace = coc_get_config("Lua").workspace or {} +-- local library = workspace.library or {} +-- +-- for _, name in pairs(lua_library_list) do +-- local lib = vim.fs.joinpath(vim.g.plug_home, name, "lua") +-- if not table.contains(library, lib) then +-- table.insert(library, lib) +-- end +-- end +-- +-- table.insert(library, "/usr/share/awesome/lib") +-- +-- coc_config("Lua.workspace", {library = library}) +-- end +-- ) +-- end + +local symbols = require("darcula.utils.symbols") + +vim.g.coc_global_extensions = NV_DARCULA_COC_EXTENSIONS +vim.g.coc_snippet_next = "" +vim.g.coc_snippet_prev = "" + +local float_config = { + winblend = 0, + border = true, + rounded = true, + maxWidth = 120 +} +coc_config("Lua.codeLens.enable", NV_DARCULA_ENABLE_CODE_LENS) +coc_config("Lua.completion.callSnippet", "Replace") +coc_config("Lua.diagnostics.globals", NV_DARCULA_LUA_GLOBALS) +coc_config("Lua.diagnostics.workspaceDelay", 30000) +coc_config("Lua.hint.enable", NV_DARCULA_ENABLE_INLAY_HINTS) +coc_config("Lua.telemetry.enable", false) +coc_config("Lua.workspace.checkThirdParty", false) +coc_config("Lua.workspace.maxPreload", 10000) +coc_config("Lua.workspace.preloadFileSize", 3000) +coc_config("cSpell.enabledLanguageIds", NV_DARCULA_CSPELL_LANGUAGES) +coc_config("cSpell.import", {"./"}) +coc_config("clangd.arguments", NV_DARCULA_CLANGD_ARGS) +if utils_os.is_windows then + coc_config("clangd.path", "c:\\bin\\clangd.cmd") +end +coc_config("clangd.inlayHint.enable", NV_DARCULA_ENABLE_INLAY_HINTS) +coc_config("coc.preferences.colorSupport", false) +coc_config("coc.preferences.maxFileSize", "10MB") +coc_config("codeLens.enable", NV_DARCULA_ENABLE_CODE_LENS) +coc_config("diagnostic.enableHighlightLineNumber", true) +coc_config("diagnostic.errorSign", symbols.line.errors) +coc_config("diagnostic.floatConfig", float_config) +coc_config("diagnostic.hintSign", symbols.line.hints) +coc_config("diagnostic.infoSign", symbols.line.info) +coc_config("diagnostic.level", "hint") +coc_config("diagnostic.virtualText", NV_DARCULA_ENABLE_VIRTUAL_TEXT) +coc_config("diagnostic.virtualTextPrefix", symbols.line.info .. " ") +coc_config("diagnostic.warningSign", symbols.line.warnings) +coc_config("highlight.colorNames.enable", false) +coc_config("highlight.colors.enable", false) +coc_config("highlight.document.enable", false) +coc_config("hover.autoHide", false) +coc_config("hover.floatConfig", float_config) +coc_config("inlayHint.display", NV_DARCULA_ENABLE_INLAY_HINTS) +coc_config("inlayHint.enable", NV_DARCULA_ENABLE_INLAY_HINTS) +coc_config("inlayHint.enableParameter", NV_DARCULA_ENABLE_INLAY_HINTS) +coc_config("inlayHint.refreshOnInsertMode", NV_DARCULA_ENABLE_INLAY_HINTS) +if not utils_os.is_windows then + coc_config("jedi.executable.command", "jedi-language-server") +end +coc_config("java.import.maven.enabled", true) +coc_config("java.jdt.ls.lombokSupport.enabled", true) +coc_config( + "java.jdt.ls.vmargs", + "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms4G -Xlog:disable" +) +coc_config("java.maven.downloadSources", false) +coc_config("java.maven.updateSnapshots", true) +coc_config("java.referencesCodeLens.enabled", NV_DARCULA_ENABLE_CODE_LENS) +coc_config("java.trace.server", "verbose") +coc_config("lightbulb.enableSign", not NV_DARCULA_ENABLE_VIRTUAL_TEXT) +coc_config("lightbulb.enableVirtualText", NV_DARCULA_ENABLE_VIRTUAL_TEXT) +coc_config( + "lightbulb.text", + {default = symbols.status.info, quickfix = symbols.status.fix} +) +coc_config("notification.border", true) +coc_config("notification.highlightGroup", "CocFloating") +coc_config("notification.statusLineProgress", true) +coc_config("notification.winblend", 0) +coc_config("signature.floatConfig", float_config) +coc_config("signature.hideOnTextChange", false) +coc_config("suggest.floatConfig", float_config) +coc_config("suggest.keepCompleteopt", true) +coc_config("suggest.noselect", true) +coc_config("suggest.virtualText", NV_DARCULA_ENABLE_VIRTUAL_TEXT) +coc_config("sumneko-lua.enableNvimLuaDev", true) + +coc_config( + "languageserver", + { + vala = { + command = "vala-language-server", + filetypes = {"vala", "genie"} + } + } +) + +if utils_os.is_windows then + coc_config( + "sh.commandPath", + vim.fs.joinpath( + vim.g.coc_data_home, + "extensions", + "node_modules", + "coc-sh", + "node_modules", + ".bin", + "bash-language-server.cmd" + ) + ) +end diff --git a/nvim/lua/darcula/setup/100_mason.lua b/nvim/lua/darcula/setup/100_mason.lua new file mode 100644 index 0000000..a701bed --- /dev/null +++ b/nvim/lua/darcula/setup/100_mason.lua @@ -0,0 +1,103 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if NV_DARCULA_ENABLE_COC then + return +end + +local symbols = require("darcula.utils.symbols") + +require("mason").setup { + ui = { + border = "rounded", + icons = { + package_installed = symbols.status.ok, + package_pending = symbols.status.checking, + package_uninstalled = symbols.status.uninstalled + } + } +} + +require("mason-lspconfig").setup { + automatic_enable = NV_DARCULA_MASON_LSP_LIST, + ensure_installed = NV_DARCULA_MASON_INST_LIST +} + +require("mason-tool-installer").setup { + ensure_installed = NV_DARCULA_MASON_TOOL_LIST, + run_on_start = true +} + +vim.lsp.config( + "*", + { + capabilities = require("mini.completion").get_lsp_capabilities() + } +) + +for _, name in pairs(NV_DARCULA_MASON_LSP_LIST) do + if name == "clangd" then + vim.lsp.config( + "clangd", + { + cmd = { + "clangd", + table.unpack(NV_DARCULA_CLANGD_ARGS) + } + } + ) + elseif name == "lua_ls" then + vim.lsp.config( + name, + { + settings = { + Lua = { + completion = { + callSnippet = "Both", + keywordSnippet = "Both" + }, + diagnostics = {globals = NV_DARCULA_LUA_GLOBALS}, + runtime = { + version = "LuaJIT" + }, + telemetry = {enable = false}, + workspace = { + checkThirdParty = false, + library = { + vim.env.VIMRUNTIME, + vim.fn.stdpath("config") + -- vim.fs.joinpath( + -- vim.fn.stdpath("data"), + -- "site", + -- "pack", + -- "core", + -- "opt" + -- ) + } + -- maxPreload = 1000, + -- preloadFileSize = 200 + } + } + } + } + ) + else + vim.lsp.config(name, {}) + end +end diff --git a/nvim/lua/darcula/setup/200_lsp.lua b/nvim/lua/darcula/setup/200_lsp.lua new file mode 100644 index 0000000..1a24c6c --- /dev/null +++ b/nvim/lua/darcula/setup/200_lsp.lua @@ -0,0 +1,89 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if NV_DARCULA_ENABLE_COC then + return +end + +local symbols = require("darcula.utils.symbols") +local utils = require("darcula.utils") + +vim.diagnostic.config( + { + float = { + border = "rounded", + source = "if_many" + }, + signs = { + max = 1, + text = { + [vim.diagnostic.severity.ERROR] = symbols.line.errors, + [vim.diagnostic.severity.WARN] = symbols.line.warnings, + [vim.diagnostic.severity.INFO] = symbols.line.hints, + [vim.diagnostic.severity.HINT] = symbols.line.hints + }, + numhl = { + [vim.diagnostic.severity.ERROR] = "DiagnosticLineNrError", + [vim.diagnostic.severity.WARN] = "DiagnosticLineNrWarn", + [vim.diagnostic.severity.INFO] = "DiagnosticLineNrInfo", + [vim.diagnostic.severity.HINT] = "DiagnosticLineNrHint" + } + }, + virtual_text = NV_DARCULA_ENABLE_VIRTUAL_TEXT + } +) + +utils.augroup_with_autocmd( + "DarculaLspAutoCommands", + "LspAttach", + "*", + function(ev) + local client = vim.lsp.get_client_by_id(ev.data.client_id) + if not client then + return + end + + if client:supports_method("textDocument/codeLens") then + vim.lsp.codelens.enable(NV_DARCULA_ENABLE_CODE_LENS, {bufnr = ev.buf}) + end + + if client:supports_method("textDocument/documentHighlight") then + local group = + utils.augroup_with_autocmd_buffer( + "DarculaLspBufferAutoCommands", + {"CursorHold", "CursorHoldI"}, + ev.buf, + vim.lsp.buf.document_highlight + ) + + utils.autocmd_buffer( + group, + {"CursorMoved", "CursorMovedI"}, + ev.buf, + vim.lsp.buf.clear_references + ) + end + + if client:supports_method("textDocument/inlayHint") then + vim.lsp.inlay_hint.enable(NV_DARCULA_ENABLE_INLAY_HINTS) + end + + require("darcula.keymaps").lsp_on_attach(ev) + end +) diff --git a/nvim/lua/darcula/setup/300_mini_fuzzy.lua b/nvim/lua/darcula/setup/300_mini_fuzzy.lua new file mode 100644 index 0000000..0465e43 --- /dev/null +++ b/nvim/lua/darcula/setup/300_mini_fuzzy.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.fuzzy").setup() diff --git a/nvim/lua/darcula/setup/300_mini_icons.lua b/nvim/lua/darcula/setup/300_mini_icons.lua new file mode 100644 index 0000000..c5394d3 --- /dev/null +++ b/nvim/lua/darcula/setup/300_mini_icons.lua @@ -0,0 +1,22 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.icons").setup() +MiniIcons.mock_nvim_web_devicons() +MiniIcons.tweak_lsp_kind() diff --git a/nvim/lua/darcula/setup/300_mini_keymap.lua b/nvim/lua/darcula/setup/300_mini_keymap.lua new file mode 100644 index 0000000..191f138 --- /dev/null +++ b/nvim/lua/darcula/setup/300_mini_keymap.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.keymap").setup() diff --git a/nvim/lua/darcula/setup/300_mini_misc.lua b/nvim/lua/darcula/setup/300_mini_misc.lua new file mode 100644 index 0000000..105a606 --- /dev/null +++ b/nvim/lua/darcula/setup/300_mini_misc.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.misc").setup_auto_root() diff --git a/nvim/lua/darcula/setup/400_mini_ai.lua b/nvim/lua/darcula/setup/400_mini_ai.lua new file mode 100644 index 0000000..e8e1fa3 --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_ai.lua @@ -0,0 +1,33 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local spec_treesitter = require("mini.ai").gen_spec.treesitter +require("mini.ai").setup { + mappings = { + around_last = "", -- disable + inside_last = "" -- disable + }, + custom_textobjects = { + c = spec_treesitter({a = "@class.outer", i = "@class.inner"}), + i = spec_treesitter({a = "@conditional.outer", i = "@conditional.inner"}), + l = spec_treesitter({a = "@loop.outer", i = "@loop.inner"}), + m = spec_treesitter({a = "@function.outer", i = "@function.inner"}), + B = spec_treesitter({a = "@block.outer", i = "@block.inner"}) + } +} diff --git a/nvim/lua/darcula/setup/400_mini_comment.lua b/nvim/lua/darcula/setup/400_mini_comment.lua new file mode 100644 index 0000000..1b0f8c4 --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_comment.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.comment").setup() diff --git a/nvim/lua/darcula/setup/400_mini_completion.lua b/nvim/lua/darcula/setup/400_mini_completion.lua new file mode 100644 index 0000000..0a8d1ec --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_completion.lua @@ -0,0 +1,41 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if NV_DARCULA_ENABLE_COC then + return +end + +require("mini.completion").setup { + delay = {completion = 100, info = 100, signature = 50}, + window = { + info = {height = 25, width = 80, border = "rounded"}, + signature = {height = 25, width = 80, border = "rounded"} + }, + lsp_completion = { + auto_setup = true, + source_func = "omnifunc" + }, + fallback_action = "", + mappings = { + force_twostep = "", + force_fallback = "", + scroll_down = "", + scroll_up = "" + } +} diff --git a/nvim/lua/darcula/setup/400_mini_move.lua b/nvim/lua/darcula/setup/400_mini_move.lua new file mode 100644 index 0000000..a2c03cf --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_move.lua @@ -0,0 +1,34 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.move").setup { + mappings = { + left = "", + right = "", + down = "", + up = "", + line_left = "", + line_right = "", + line_down = "", + line_up = "" + }, + options = { + reindent_linewise = true + } +} diff --git a/nvim/lua/darcula/setup/400_mini_notify.lua b/nvim/lua/darcula/setup/400_mini_notify.lua new file mode 100644 index 0000000..09906c4 --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_notify.lua @@ -0,0 +1,43 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.notify").setup { + window = { + config = { + row = vim.o.lines - 4, + col = vim.o.columns - 4, + anchor = "SE" + } + } +} + +vim.notify = + MiniNotify.make_notify( + { + DEBUG = {duration = 0}, + ERROR = {duration = 3500, hl_group = "DiagnosticFloatingError"}, + INFO = {duration = 3500, hl_group = "DiagnosticFloatingInfo"}, + OFF = {duration = 0}, + TRACE = {duration = 0}, + WARN = {duration = 3500, hl_group = "DiagnosticFloatingWarn"} + } +) + +vim.cmd("hi! link MiniNotifyNormal NotifyINFOBody") +vim.cmd("hi! link MiniNotifyBorder NotifyINFOBorder") diff --git a/nvim/lua/darcula/setup/400_mini_pairs.lua b/nvim/lua/darcula/setup/400_mini_pairs.lua new file mode 100644 index 0000000..250a5a6 --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_pairs.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.pairs").setup() diff --git a/nvim/lua/darcula/setup/400_mini_snippets.lua b/nvim/lua/darcula/setup/400_mini_snippets.lua new file mode 100644 index 0000000..47adfcb --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_snippets.lua @@ -0,0 +1,60 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if NV_DARCULA_ENABLE_COC then + return +end + +local snippets = require("mini.snippets") +local gen_loader = snippets.gen_loader +local match_strict = function(snips) + return snippets.default_match(snips, {pattern_fuzzy = "%S+"}) +end + +snippets.setup { + mappings = { + expand = "", + jump_next = "", + jump_prev = "", + stop = "" + }, + expand = {match = match_strict}, + snippets = { + gen_loader.from_file( + vim.fs.joinpath(vim.fn.stdpath("config"), "snippets", "global.json") + ), + gen_loader.from_lang() + } +} + +vim.api.nvim_set_hl( + 0, + "MiniSnippetsCurrentReplace", + {link = "DiagnosticVirtualTextInfo"} +) +vim.api.nvim_set_hl( + 0, + "MiniSnippetsFinal", + {link = "DiagnosticVirtualTextInfo"} +) +vim.api.nvim_set_hl( + 0, + "MiniSnippetsVisited", + {link = "DiagnosticVirtualTextInfo"} +) diff --git a/nvim/lua/darcula/setup/400_mini_starter.lua b/nvim/lua/darcula/setup/400_mini_starter.lua new file mode 100644 index 0000000..3b1ead1 --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_starter.lua @@ -0,0 +1,147 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local starter = require("mini.starter") + +local header_cache +local wrap_action = function(input) + local parse_items = function(items) + for idx, val in ipairs(items) do + local orig_action = val.action + items[idx].action = function() + if type(orig_action) == "string" then + vim.cmd(orig_action) + elseif type(orig_action) == "function" then + orig_action() + end + + header_cache = nil + NV_Darcula_LSP_Restart() + end + end + + return items + end + + if type(input) == "function" then + return function() + return parse_items(input()) + end + end + + return parse_items(input) +end + +local main_section = "Bookmarks" +local add_line_under_sections = function(content) + local out = {} + + for _, line in ipairs(content) do + table.insert(out, line) + if line[1].type == "section" then + table.insert(out, {{type = "empty", string = ""}}) + end + end + + return out +end + +starter.setup { + content_hooks = { + add_line_under_sections, + starter.gen_hook.indexing("all", {"Builtin actions", main_section}), + starter.gen_hook.aligning("left", "top"), + starter.gen_hook.padding(5, 2) + }, + evaluate_single = true, + header = function() + if not header_cache then + header_cache = + table.concat(require("darcula.utils.fortune").cowsay(), "\n") + end + return header_cache + end, + items = { + wrap_action(starter.sections.builtin_actions()), + wrap_action(starter.sections.recent_files(5, true)), + wrap_action(starter.sections.recent_files(5, false)), + wrap_action( + { + { + action = "e " .. + vim.fs.joinpath(vim.env.HOME, ".desktop", "scripts", "setup.sh"), + name = "Desktop (" .. + vim.fs.joinpath(vim.env.HOME, ".desktop", "scripts", "setup.sh") .. + ")", + section = main_section + }, + { + action = "e " .. vim.fs.joinpath(vim.fn.stdpath("config"), "init.lua"), + name = "Lua Configuration (" .. + vim.fs.joinpath(vim.fn.stdpath("config"), "init.lua") .. ")", + section = main_section + }, + { + action = "e " .. + vim.fs.joinpath( + vim.fn.stdpath("config"), + "lua", + "darcula", + "keymaps.lua" + ), + name = "Maps (" .. + vim.fs.joinpath( + vim.fn.stdpath("config"), + "lua", + "darcula", + "keymaps.lua" + ) .. + ")", + section = main_section + }, + { + action = "e " .. + vim.fs.joinpath( + vim.fn.stdpath("config"), + "lua", + "darcula", + "setup", + "305_mini_starter.lua" + ), + name = "Starter (" .. + vim.fs.joinpath( + vim.fn.stdpath("config"), + "lua", + "darcula", + "setup", + "305_mini_starter.lua" + ) .. + ")", + section = main_section + } + } + ) + }, + footer = "" +} + +vim.cmd("hi! link MiniStarterHeader Comment") +vim.cmd("hi! link MiniStarterItem Comment") +vim.cmd("hi! link MiniStarterItemPrefix Normal") +vim.cmd("hi! link MiniStarterQuery Search") diff --git a/nvim/lua/darcula/setup/400_mini_statusline.lua b/nvim/lua/darcula/setup/400_mini_statusline.lua new file mode 100644 index 0000000..9c30beb --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_statusline.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.statusline").setup() diff --git a/nvim/lua/darcula/setup/400_mini_surround.lua b/nvim/lua/darcula/setup/400_mini_surround.lua new file mode 100644 index 0000000..791c73e --- /dev/null +++ b/nvim/lua/darcula/setup/400_mini_surround.lua @@ -0,0 +1,37 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("mini.surround").setup { + custom_surroundings = nil, + highlight_duration = 500, + mappings = { + add = "S", + delete = "ds", + find = "Sf", + find_left = "SF", + highlight = "Sh", + replace = "cs", + suffix_last = "l", + suffix_next = "n" + }, + n_lines = 20, + respect_selection_type = false, + search_method = "cover", + silent = false +} diff --git a/nvim/lua/darcula/setup/500_colorizer.lua b/nvim/lua/darcula/setup/500_colorizer.lua new file mode 100644 index 0000000..5b02867 --- /dev/null +++ b/nvim/lua/darcula/setup/500_colorizer.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("colorizer").setup() diff --git a/nvim/lua/darcula/setup/500_cppman.lua b/nvim/lua/darcula/setup/500_cppman.lua new file mode 100644 index 0000000..d0de5b0 --- /dev/null +++ b/nvim/lua/darcula/setup/500_cppman.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("cppman").setup {win = {split = "right"}} diff --git a/nvim/lua/darcula/setup/500_dap.lua b/nvim/lua/darcula/setup/500_dap.lua new file mode 100644 index 0000000..7c26637 --- /dev/null +++ b/nvim/lua/darcula/setup/500_dap.lua @@ -0,0 +1,177 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local dap = require("dap") +local utils = require("darcula.utils") +local utils_os = require("darcula.utils.os") + +-- DOES NOT CURRENTLY WORK +-- dap.adapters.cppvsdbg = { +-- id = "cppvsdbg", +-- type = "executable", +-- command = vim.fs.joinpath( +-- vim.fn.stdpath("data"), +-- "dap", "cpp", "extension", "debugAdapters", "vsdbg", "bin", "vsdbg.exe" +-- ), +-- args = { +-- "--interpreter=vscode" +-- }, +-- options = { +-- detached = false +-- } +-- } +dap.adapters.cppdbg = { + id = "cppdbg", + type = "executable", + command = vim.fs.joinpath( + vim.fn.stdpath("data"), + "dap", + "cpp", + "extension", + "debugAdapters", + "bin", + utils.iff(utils_os.is_windows, "OpenDebugAD7.exe", "OpenDebugAD7") + ), + options = { + detached = false + } +} + +dap.adapters.dart = { + type = "executable", + command = "dart", + args = {"debug_adapter"} +} +dap.adapters.flutter = { + type = "executable", + command = "flutter", + args = {"debug_adapter"} +} +dap.configurations.dart = { + { + type = "dart", + request = "launch", + name = "Launch dart", + dartSdkPath = vim.fs.joinpath( + utils.iff(utils_os.is_windows, vim.env.NV_DARCULA_DRIVE, vim.env.HOME), + "flutter", + "bin", + "cache", + "dart-sdk", + "bin", + "dart" + ), + flutterSdkPath = vim.fs.joinpath( + utils.iff(utils_os.is_windows, vim.env.NV_DARCULA_DRIVE, vim.env.HOME), + "flutter", + "bin", + "flutter" + ), + program = "${workspaceFolder}/lib/main.dart", -- ensure this is correct + cwd = "${workspaceFolder}" + }, + { + type = "flutter", + request = "launch", + name = "Launch flutter", + dartSdkPath = vim.fs.joinpath( + utils.iff(utils_os.is_windows, vim.env.NV_DARCULA_DRIVE, vim.env.HOME), + "flutter", + "bin", + "cache", + "dart-sdk", + "bin", + "dart" + ), + flutterSdkPath = vim.fs.joinpath( + utils.iff(utils_os.is_windows, vim.env.NV_DARCULA_DRIVE, vim.env.HOME), + "flutter", + "bin", + "flutter" + ), + program = "${workspaceFolder}/lib/main.dart", -- ensure this is correct + cwd = "${workspaceFolder}" + } +} + +require("dap-go").setup() + +local symbols = require("darcula.utils.symbols") +vim.fn.sign_define( + "DapBreakpoint", + { + text = symbols.debug.breakpoint, + texthl = "ErrorSign", + linehl = "", + numhl = "" + } +) + +vim.fn.sign_define( + "DapBreakpointCondition", + { + text = symbols.debug.conditional_breakpoint, + texthl = "ErrorSign", + linehl = "", + numhl = "" + } +) + +vim.fn.sign_define( + "DapBreakpointRejected", + { + text = symbols.debug.breakpoint_disabled, + texthl = "ErrorSign", + linehl = "", + numhl = "" + } +) + +vim.fn.sign_define( + "DapLogPoint", + { + text = symbols.debug.breakpoint, + texthl = "WarningSign", + linehl = "", + numhl = "" + } +) + +vim.fn.sign_define( + "DapStopped", + { + text = symbols.debug.current_line, + texthl = "WarningSign", + linehl = "", + numhl = "" + } +) + +local dapui = require("dapui") +dapui.setup() + +dap.listeners.after.event_initialized["dapui_config"] = function() + dapui.open() +end +dap.listeners.before.event_terminated["dapui_config"] = function() + dapui.close() +end +dap.listeners.before.event_exited["dapui_config"] = function() + dapui.close() +end diff --git a/nvim/lua/darcula/setup/500_dispatch.lua b/nvim/lua/darcula/setup/500_dispatch.lua new file mode 100644 index 0000000..5d66798 --- /dev/null +++ b/nvim/lua/darcula/setup/500_dispatch.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +vim.g.dispatch_no_maps = 1 diff --git a/nvim/lua/darcula/setup/500_dressing.lua b/nvim/lua/darcula/setup/500_dressing.lua new file mode 100644 index 0000000..fd790d7 --- /dev/null +++ b/nvim/lua/darcula/setup/500_dressing.lua @@ -0,0 +1,30 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("dressing").setup { + input = { + relative = "editor", + win_options = { + winhighlight = "Title:Pmenu" + } + }, + select = { + relative = "editor" + } +} diff --git a/nvim/lua/darcula/setup/500_flutter.lua b/nvim/lua/darcula/setup/500_flutter.lua new file mode 100644 index 0000000..f9aa866 --- /dev/null +++ b/nvim/lua/darcula/setup/500_flutter.lua @@ -0,0 +1,20 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("darcula.flutter").setup({use_coc = NV_DARCULA_ENABLE_COC}) diff --git a/nvim/lua/darcula/setup/500_flutter_tools.lua b/nvim/lua/darcula/setup/500_flutter_tools.lua new file mode 100644 index 0000000..7f0ef7b --- /dev/null +++ b/nvim/lua/darcula/setup/500_flutter_tools.lua @@ -0,0 +1,24 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if NV_DARCULA_ENABLE_COC then + return +end + +require("flutter-tools").setup {} diff --git a/nvim/lua/darcula/setup/500_formatter.lua b/nvim/lua/darcula/setup/500_formatter.lua new file mode 100644 index 0000000..2c617a2 --- /dev/null +++ b/nvim/lua/darcula/setup/500_formatter.lua @@ -0,0 +1,69 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local formatter_util = require("formatter.util") + +require("formatter").setup { + logging = true, + log_level = vim.log.levels.WARN, + filetype = { + c = {require("formatter.filetypes.c").clangformat}, + cpp = {require("formatter.filetypes.cpp").clangformat}, + dart = {require("formatter.filetypes.dart").dartformat}, + go = {require("formatter.filetypes.go").gofumpt}, + java = { + function() + return { + exe = "google-java-format", + args = { + formatter_util.escape_path( + formatter_util.get_current_buffer_file_path() + ), + "--replace" + }, + stdin = true + } + end + }, + javascript = {require("formatter.filetypes.javascript").prettier}, + javascriptreact = {require("formatter.filetypes.javascriptreact").prettier}, + json = {require("formatter.filetypes.json").prettier}, + lua = { + require("formatter.filetypes.lua").luafmt, + function() + return { + exe = "luafmt", + args = { + "--stdin", + "-l", + "80", + "-i", + "2" + }, + stdin = true + } + end + }, + python = {require("formatter.filetypes.python").yapf}, + sh = {require("formatter.filetypes.sh").shfmt}, + typescript = {require("formatter.filetypes.typescript").prettier}, + typescriptreact = {require("formatter.filetypes.typescriptreact").prettier}, + xml = {require("formatter.filetypes.xml").tidy} + } +} diff --git a/nvim/lua/darcula/setup/500_gitsigns.lua b/nvim/lua/darcula/setup/500_gitsigns.lua new file mode 100644 index 0000000..dc903ea --- /dev/null +++ b/nvim/lua/darcula/setup/500_gitsigns.lua @@ -0,0 +1,41 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local keymaps = require("darcula.keymaps") +local symbols = require("darcula.utils.symbols") + +require("gitsigns").setup { + current_line_blame = NV_DARCULA_ENABLE_GIT_LINE_BLAME, + current_line_blame_opts = { + virt_text = true, + virt_text_pos = "eol", + delay = 1000, + ignore_whitespace = false + }, + current_line_blame_formatter = symbols.git.blame .. + " , -

", + linehl = false, + numhl = false, + preview_config = {border = "rounded"}, + signcolumn = false, + word_diff = false, + on_attach = function(bufnr) + keymaps.gitsigns(bufnr) + end +} diff --git a/nvim/lua/darcula/setup/500_haven.lua b/nvim/lua/darcula/setup/500_haven.lua new file mode 100644 index 0000000..9b4340f --- /dev/null +++ b/nvim/lua/darcula/setup/500_haven.lua @@ -0,0 +1,36 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local utils_os = require("darcula.utils.os") + +require("darcula.haven").setup { + exclusions = { + function(path, _) + local tmp = vim.env.TEMP or vim.env.TMP + if tmp ~= nil and tmp:len() > 0 then + if utils_os.is_windows then + return path:lower():starts_with(tmp:lower()) + end + + return path:starts_with(tmp) + end + return false + end + } +} diff --git a/nvim/lua/darcula/setup/500_lightbulb.lua b/nvim/lua/darcula/setup/500_lightbulb.lua new file mode 100644 index 0000000..a271bc6 --- /dev/null +++ b/nvim/lua/darcula/setup/500_lightbulb.lua @@ -0,0 +1,56 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if NV_DARCULA_ENABLE_COC then + return +end + +local symbols = require("darcula.utils.symbols") + +require("nvim-lightbulb").setup( + { + hide_in_unfocused_buffer = true, + link_highlights = false, + sign = { + enabled = true, + text = symbols.status.info, + hl = "WarningSign" + }, + virtual_text = { + enabled = false + }, + float = { + enabled = false + }, + status_text = { + enabled = false + }, + number = { + enabled = false + }, + line = { + enabled = false + }, + autocmd = { + enabled = true, + events = {"CursorHold", "CursorHoldI"}, + pattern = {"*"} + } + } +) diff --git a/nvim/lua/darcula/setup/500_nvim_tree.lua b/nvim/lua/darcula/setup/500_nvim_tree.lua new file mode 100644 index 0000000..6b52510 --- /dev/null +++ b/nvim/lua/darcula/setup/500_nvim_tree.lua @@ -0,0 +1,77 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local keymaps = require("darcula.keymaps") +local symbols = require("darcula.utils.symbols") + +vim.g.nvim_tree_refresh_wait = 250 + +require "nvim-tree".setup { + diagnostics = { + enable = false, + icons = { + error = symbols.status.errors, + hint = symbols.status.hints, + info = symbols.status.info, + warning = symbols.status.warnings + } + }, + filters = {dotfiles = not NV_DARCULA_ENABLE_HIDDEN_FILES}, + git = {enable = true, ignore = false, timeout = 5000}, + hijack_directories = {enable = false, auto_open = false}, + on_attach = keymaps.nvim_tree_on_attach, + renderer = { + icons = { + show = {file = true, folder = true, folder_arrow = false, git = true}, + glyphs = { + default = symbols.file, + symlink = symbols.file, + folder = { + arrow_open = symbols.directory.expanded, + arrow_closed = symbols.directory.collapsed, + default = symbols.directory.directory, + empty = symbols.directory.directory, + empty_open = symbols.directory.directory_open, + open = symbols.directory.directory_open, + symlink = symbols.directory.directory, + symlink_open = symbols.directory.directory_open + }, + git = { + unstaged = symbols.git.unstaged, + staged = symbols.git.staged, + unmerged = symbols.git.unmerged, + renamed = symbols.git.renamed, + untracked = symbols.git.untracked, + deleted = symbols.git.deleted, + ignored = symbols.git.ignored + } + } + }, + special_files = {}, + indent_markers = { + enable = false, + icons = {corner = "└ ", edge = "│ ", none = " "} + } + }, + respect_buf_cwd = false, + sync_root_with_cwd = true, + update_cwd = false, + update_focused_file = {enable = true, update_root = false}, + view = {width = 35} +} diff --git a/nvim/lua/darcula/setup/500_scrollview.lua b/nvim/lua/darcula/setup/500_scrollview.lua new file mode 100644 index 0000000..f1f43bd --- /dev/null +++ b/nvim/lua/darcula/setup/500_scrollview.lua @@ -0,0 +1,28 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local utils = require("darcula.utils") +local utils_os = require("darcula.utils.os") + +require("scrollview").setup { + winblend = utils.iff(utils_os.is_windows, 85, 90), + winblend_gui = utils.iff(utils_os.is_windows, 85, 90), + current_only = true, + signs_on_startup = {} +} diff --git a/nvim/lua/darcula/setup/500_telescope.lua b/nvim/lua/darcula/setup/500_telescope.lua new file mode 100644 index 0000000..6bf0637 --- /dev/null +++ b/nvim/lua/darcula/setup/500_telescope.lua @@ -0,0 +1,101 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local symbols = require("darcula.utils.symbols") + +local telescope_actions = require("telescope.actions") +require("telescope").setup { + defaults = { + vimgrep_arguments = { + "rg", + "--color=never", + "--no-heading", + "--with-filename", + "--line-number", + "--column", + "--hidden", + "--smart-case" + }, + mappings = { + i = { + [""] = telescope_actions.preview_scrolling_up, + [""] = telescope_actions.preview_scrolling_down, + [""] = nil, + [""] = nil + }, + n = { + [""] = telescope_actions.preview_scrolling_up, + [""] = telescope_actions.preview_scrolling_down, + [""] = nil, + [""] = nil + } + }, + prompt_prefix = " " .. symbols.search .. " ", + selection_caret = " ", + entry_prefix = " ", + initial_mode = "normal", + selection_strategy = "reset", + sorting_strategy = "descending", + layout_strategy = "horizontal", + layout_config = { + horizontal = {mirror = false}, + vertical = {mirror = false}, + height = 0.7, + width = 0.8, + preview_cutoff = 120 + }, + file_sorter = require "telescope.sorters".get_fuzzy_file, + file_ignore_patterns = {}, + generic_sorter = require "telescope.sorters".get_generic_fuzzy_sorter, + path_display = {smart = 1}, + winblend = 0, + border = true, + borderchars = {" ", " ", " ", " ", " ", " ", " ", " "}, + color_devicons = true, + use_less = true, + set_env = {["COLORTERM"] = "truecolor"}, -- default = nil, + file_previewer = require "telescope.previewers".vim_buffer_cat.new, + grep_previewer = require "telescope.previewers".vim_buffer_vimgrep.new, + qflist_previewer = require "telescope.previewers".vim_buffer_qflist.new, + -- Developer configurations: Not meant for general override + buffer_previewer_maker = require "telescope.previewers".buffer_previewer_maker + }, + extensions = { + fzf = { + fuzzy = true, + override_generic_sorter = true, + override_file_sorter = true, + case_mode = "smart_case" + }, + ["ui-select"] = require("telescope.themes").get_dropdown( + { + width = 0.6, + previewer = false + } + ) + } +} + +require("telescope").load_extension("ui-select") +if NV_DARCULA_ENABLE_COC then + require("telescope").load_extension("coc") +end +if not NV_DARCULA_ENABLE_COC then + require("telescope").load_extension("flutter") +end diff --git a/nvim/lua/darcula/setup/500_treesitter.lua b/nvim/lua/darcula/setup/500_treesitter.lua new file mode 100644 index 0000000..9fa1dd5 --- /dev/null +++ b/nvim/lua/darcula/setup/500_treesitter.lua @@ -0,0 +1,24 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("nvim-treesitter").setup { + install_dir = vim.fs.joinpath(vim.fn.stdpath("data"), "site") +} + +require("nvim-treesitter").install(NV_DARCULA_TREESITTER_LIST) diff --git a/nvim/lua/darcula/setup/500_vim_dart_plugin.lua b/nvim/lua/darcula/setup/500_vim_dart_plugin.lua new file mode 100644 index 0000000..df4eefc --- /dev/null +++ b/nvim/lua/darcula/setup/500_vim_dart_plugin.lua @@ -0,0 +1,24 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +if not NV_DARCULA_ENABLE_COC then + return +end + +vim.g.dart_style_guide = 2 diff --git a/nvim/lua/darcula/setup/500_window_picker.lua b/nvim/lua/darcula/setup/500_window_picker.lua new file mode 100644 index 0000000..8554d3d --- /dev/null +++ b/nvim/lua/darcula/setup/500_window_picker.lua @@ -0,0 +1,27 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require "window-picker".setup { + keys = "alskdjfhgwoeiruty", + swap_shift = true, + exclude = {qf = true, NvimTree = true, aerial = true}, + flash_duration = 300 +} + +vim.g.choosewin_blink_on_land = 1 diff --git a/nvim/lua/darcula/usercmds.lua b/nvim/lua/darcula/usercmds.lua new file mode 100644 index 0000000..6310bbb --- /dev/null +++ b/nvim/lua/darcula/usercmds.lua @@ -0,0 +1,80 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local utils = require("darcula.utils") +utils.create_vert_display("Messages", "messages") + +vim.cmd( + [[ + cnoreabbrev h getcmdtype() ==# ':' && getcmdline() ==# 'h' ? 'vert help' : 'h' + cnoreabbrev help getcmdtype() ==# ':' && getcmdline() ==# 'help' ? 'vert help' : 'help' +]] +) + +vim.api.nvim_create_user_command( + "PlugUpdate", + function() + vim.pack.update(nil, {force = true}) + if NV_DARCULA_ENABLE_COC then + vim.cmd("CocUpdate") + end + end, + {} +) + +if not NV_DARCULA_ENABLE_COC then + vim.api.nvim_create_user_command( + "LspInfo", + function() + local clients = vim.lsp.get_clients({bufnr = 0}) + if #clients == 0 then + vim.notify("No LSP attached", vim.log.levels.INFO) + return + end + + local res = {""} + for _, client in ipairs(clients) do + table.insert(res, "• " .. client.name .. " (id: " .. client.id .. ")") + end + + vim.notify(table.concat(res, "\n") .. "\n", vim.log.levels.INFO) + end, + {} + ) + + vim.api.nvim_create_user_command( + "LspRestart", + function() + local bufnr = vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({bufnr = bufnr}) + + for _, client in ipairs(clients) do + client:stop() + end + + if + (vim.bo.buftype == "" or vim.bo.buftype == "normal") and + vim.api.nvim_buf_get_name(0) ~= "" + then + vim.cmd("edit") + end + end, + {} + ) +end diff --git a/nvim/lua/darcula/utils/fortune.lua b/nvim/lua/darcula/utils/fortune.lua new file mode 100644 index 0000000..3cc3336 --- /dev/null +++ b/nvim/lua/darcula/utils/fortune.lua @@ -0,0 +1,883 @@ +-- Converted from Vimscript to Lua for use in Neovim (init.lua or a module) +-- Original: https://github.com/mhinz/vim-startify/blob/master/autoload/startify/fortune.vim + +-- The MIT License (MIT) +-- +-- Copyright (c) 2015 Marco Hinz +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of +-- this software and associated documentation files (the "Software"), to deal in +-- the Software without restriction, including without limitation the rights to +-- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +-- the Software, and to permit persons to whom the Software is furnished to do so, +-- subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all +-- copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +-- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +-- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +-- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +-- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +-- Variables (module-local "s" table to mimic script-local "s:" in Vimscript) +local fortune_cfg = {} + +-- Utility: get a monotonically-varying high-resolution time and use it for a pseudo-random offset +local function get_random_offset(max) + -- vim.loop.hrtime() returns nanoseconds (integer); use modulo to get an offset in [0, max-1] + if max <= 0 then + return 0 + end + local n = vim.loop.hrtime() + return (n % max) +end + +-- Draw a box around an array-like table of lines. +local function draw_box(lines) + -- compute longest visual width using vim.fn.strwidth (handles multibyte nicely) + local longest = 0 + for _, l in ipairs(lines) do + local w = vim.fn.strwidth(l) + if w > longest then + longest = w + end + end + + local top_bottom_without_corners = + string.rep(fortune_cfg.char_top_bottom, longest + 2) + local top = + fortune_cfg.char_top_left .. + top_bottom_without_corners .. fortune_cfg.char_top_right + local bottom = + fortune_cfg.char_bottom_left .. + top_bottom_without_corners .. fortune_cfg.char_bottom_right + + local out = {top} + for _, l in ipairs(lines) do + local offset = longest - vim.fn.strwidth(l) + local padded = + fortune_cfg.char_sides .. + " " .. l .. string.rep(" ", offset) .. " " .. fortune_cfg.char_sides + table.insert(out, padded) + end + table.insert(out, bottom) + return out +end + +-- Return a random quote from g:startify_custom_header_quotes +local function quote() + local quotes = vim.g.startify_custom_header_quotes + if not quotes or #quotes == 0 then + return {} + end + local idx = get_random_offset(#quotes) + 1 -- Lua 1-based + local q = quotes[idx] + -- if it's a function (lua function or vimscript function reference wrapped), try to call it + if type(q) == "function" then + return q() + else + return q + end +end + +-- Wrap a quote (table of lines or function returning lines) and put it in a box. +-- Usage: boxed(opt_quote_table_or_function) +local function boxed(...) + local arg = select(1, ...) + local quote_val + + if arg and type(arg) == "table" then + quote_val = arg + else + local q = quote() + if type(q) == "function" then + quote_val = q() + else + quote_val = q + end + end + + -- wrap each line at ~50 columns using Vim's split (keeppattern=1 -> do not remove empty) + local wrapped = {} + for _, line in ipairs(quote_val) do + -- reuse vim.fn.split with the same regex used originally + local parts = vim.fn.split(line, "\\%50c.\\{-}\\zs\\s", 1) + for _, p in ipairs(parts) do + table.insert(wrapped, p) + end + end + + return draw_box(wrapped) +end + +-- Cowsay: return boxed quote concatenated with cow art. +-- If an argument table is passed, it's treated as the quote; optionally pass characters to override box chars. +-- Usage examples: +-- cowsay() -> uses randomly chosen quote +-- cowsay(quote_table) -> uses provided quote table +-- cowsay(quote_table, char_top_bottom, char_sides, top_left, top_right, bottom_right, bottom_left) +local function cowsay(...) + local args = {...} + local quote_arg + if #args >= 1 and type(args[1]) == "table" then + quote_arg = args[1] + else + quote_arg = quote() + end + + -- optional overrides for the box characters (positions correspond to original script) + if #args >= 6 then + fortune_cfg.char_top_bottom = args[2] or fortune_cfg.char_top_bottom + fortune_cfg.char_sides = args[3] or fortune_cfg.char_sides + fortune_cfg.char_top_left = args[4] or fortune_cfg.char_top_left + fortune_cfg.char_top_right = args[5] or fortune_cfg.char_top_right + fortune_cfg.char_bottom_right = args[6] or fortune_cfg.char_bottom_right + fortune_cfg.char_bottom_left = args[7] or fortune_cfg.char_bottom_left + end + + local boxed_quote = boxed(quote_arg) + -- concatenate boxed_quote with cow art (both are lists of lines); return combined table + local out = {} + for _, line in ipairs(boxed_quote) do + table.insert(out, line) + end + for _, line in ipairs(fortune_cfg.cow) do + table.insert(out, line) + end + return out +end + +-- Expose a function to return predefined_quotes (just returns the table) +local function predefined_quotes() + return fortune_cfg.predefined_quotes +end + +fortune_cfg.cow = { + " o", + " o ^__^", + " o (oo)\\_______", + " (__)\\ )\\/\\", + " ||----w |", + " || ||" +} + +-- whether to use unicode box characters; attempt to preserve original behavior: +-- g:startify_fortune_use_unicode defaults to current encoding == 'utf-8' and optional g var +vim.g.startify_fortune_use_unicode = + (vim.o.encoding == "utf-8") and + (vim.g.startify_fortune_use_unicode and true or false) + +local use_unicode = vim.g.startify_fortune_use_unicode and 2 or 1 +-- Note: choose between ascii (index 1) and unicode (index 2) +-- we'll pick characters with a small table lookup (Lua arrays are 1-based) +local tb_top_bottom = {"-", "─"} +local tb_sides = {"|", "│"} +local tb_top_left = {"*", "╭"} +local tb_top_right = {"*", "╮"} +local tb_bottom_right = {"*", "╯"} +local tb_bottom_left = {"*", "╰"} + +fortune_cfg.char_top_bottom = tb_top_bottom[use_unicode] +fortune_cfg.char_sides = tb_sides[use_unicode] +fortune_cfg.char_top_left = tb_top_left[use_unicode] +fortune_cfg.char_top_right = tb_top_right[use_unicode] +fortune_cfg.char_bottom_right = tb_bottom_right[use_unicode] +fortune_cfg.char_bottom_left = tb_bottom_left[use_unicode] + +-- Predefined quotes: directly translated as a Lua table of arrays/strings. +fortune_cfg.predefined_quotes = { + { + "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.", + "", + "- Brian Kernighan" + }, + {"If you don't finish then you're just busy, not productive."}, + { + "Adapting old programs to fit new machines usually means adapting new machines to behave like old ones.", + "", + "- Alan Perlis" + }, + { + "Fools ignore complexity. Pragmatists suffer it. Some can avoid it. Geniuses remove it.", + "", + "- Alan Perlis" + }, + { + "It is easier to change the specification to fit the program than vice versa.", + "", + "- Alan Perlis" + }, + { + "Simplicity does not precede complexity, but follows it.", + "", + "- Alan Perlis" + }, + {"Optimization hinders evolution.", "", "- Alan Perlis"}, + { + "Recursion is the root of computation since it trades description for time.", + "", + "- Alan Perlis" + }, + { + "It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures.", + "", + "- Alan Perlis" + }, + { + "There is nothing quite so useless as doing with great efficiency something that should not be done at all.", + "", + "- Peter Drucker" + }, + { + "If you don't fail at least 90% of the time, you're not aiming high enough.", + "", + "- Alan Kay" + }, + { + "I think a lot of new programmers like to use advanced data structures and advanced language features as a way of demonstrating their ability. I call it the lion-tamer syndrome. Such demonstrations are impressive, but unless they actually translate into real wins for the project, avoid them.", + "", + "- Glyn Williams" + }, + {"I would rather die of passion than of boredom.", "", "- Vincent Van Gogh"}, + { + "If a system is to serve the creative spirit, it must be entirely comprehensible to a single individual." + }, + { + "The computing scientist's main challenge is not to get confused by the complexities of his own making.", + "", + "- Edsger W. Dijkstra" + }, + { + "Progress in a fixed context is almost always a form of optimization. Creative acts generally don't stay in the context that they are in.", + "", + "- Alan Kay" + }, + { + "The essence of XML is this: the problem it solves is not hard, and it does not solve the problem well.", + "", + "- Phil Wadler" + }, + { + "A good programmer is someone who always looks both ways before crossing a one-way street.", + "", + "- Doug Linder" + }, + {'Patterns mean "I have run out of language."', "", "- Rich Hickey"}, + { + "Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.", + "", + "- John Woods" + }, + { + "Unix was not designed to stop its users from doing stupid things, as that would also stop them from doing clever things." + }, + { + "Contrary to popular belief, Unix is user friendly. It just happens to be very selective about who it decides to make friends with." + }, + { + "Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away." + }, + { + "There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies.", + "", + "- C.A.R. Hoare" + }, + { + "If you don't make mistakes, you're not working on hard enough problems.", + "", + "- Frank Wilczek" + }, + { + "If you don't start with a spec, every piece of code you write is a patch.", + "", + "- Leslie Lamport" + }, + {"Caches are bugs waiting to happen.", "", "- Rob Pike"}, + { + "Abstraction is not about vagueness, it is about being precise at a new semantic level.", + "", + "- Edsger W. Dijkstra" + }, + { + "dd is horrible on purpose. It's a joke about OS/360 JCL. But today it's an internationally standardized joke. I guess that says it all.", + "", + "- Rob Pike" + }, + {"All loops are infinite ones for faulty RAM modules."}, + { + "All idioms must be learned. Good idioms only need to be learned once.", + "", + "- Alan Cooper" + }, + { + "For a successful technology, reality must take precedence over public relations, for Nature cannot be fooled.", + "", + "- Richard Feynman" + }, + { + "If programmers were electricians, parallel programmers would be bomb disposal experts. Both cut wires.", + "", + "- Bartosz Milewski" + }, + { + "Computers are harder to maintain at high altitude. Thinner air means less cushion between disk heads and platters. Also more radiation." + }, + { + "Almost every programming language is overrated by its practitioners.", + "", + "- Larry Wall" + }, + { + "Fancy algorithms are slow when n is small, and n is usually small.", + "", + "- Rob Pike" + }, + { + "Methods are just functions with a special first argument.", + "", + "- Andrew Gerrand" + }, + { + "Care about your craft.", + "", + "Why spend your life developing software unless you care about doing it well?" + }, + { + "Provide options, don't make lame excuses.", + "", + "Instead of excuses, provide options. Don't say it can't be done; explain what can be done." + }, + { + "Be a catalyst for change.", + "", + "You can't force change on people. Instead, show them how the future might be and help them participate in creating it." + }, + { + "Make quality a requirements issue.", + "", + "Involve your users in determining the project's real quality requirements." + }, + { + "Critically analyze what you read and hear.", + "", + "Don't be swayed by vendors, media hype, or dogma. Analyze information in terms of you and your project." + }, + { + "DRY - Don't Repeat Yourself.", + "", + "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system." + }, + { + "Eliminate effects between unrelated things.", + "", + "Design components that are self-contained, independent, and have a single, well-defined purpose." + }, + { + "Use tracer bullets to find the target.", + "", + "Tracer bullets let you home in on your target by trying things and seeing how close they land." + }, + { + "Program close to the problem domain.", + "", + "Design and code in your user's language." + }, + { + "Iterate the schedule with the code.", + "", + "Use experience you gain as you implement to refine the project time scales." + }, + { + "Use the power of command shells.", + "", + "Use the shell when graphical user interfaces don't cut it." + }, + { + "Always use source code control.", + "", + "Source code control is a time machine for your work - you can go back." + }, + { + "Don't panic when debugging", + "", + "Take a deep breath and THINK! about what could be causing the bug." + }, + { + "Don't assume it - prove it.", + "", + "Prove your assumptions in the actual environment - with real data and boundary conditions." + }, + { + "Write code that writes code.", + "", + "Code generators increase your productivity and help avoid duplication." + }, + { + "Design With contracts.", + "", + "Use contracts to document and verify that code does no more and no less than it claims to do." + }, + { + "Use assertions to prevent the impossible.", + "", + "Assertions validate your assumptions. Use them to protect your code from an uncertain world." + }, + { + "Finish what you start.", + "", + "Where possible, the routine or object that allocates a resource should be responsible for deallocating it." + }, + { + "Configure, don't integrate.", + "", + "Implement technology choices for an application as configuration options, not through integration or engineering." + }, + { + "Analyze workflow to improve concurrency.", + "", + "Exploit concurrency in your user's workflow." + }, + { + "Always design for concurrency.", + "", + "Allow for concurrency, and you'll design cleaner interfaces with fewer assumptions." + }, + { + "Use blackboards to coordinate workflow.", + "", + "Use blackboards to coordinate disparate facts and agents, while maintaining independence and isolation among participants." + }, + { + "Estimate the order of your algorithms.", + "", + "Get a feel for how long things are likely to take before you write code." + }, + { + "Refactor early, refactor often.", + "", + "Just as you might weed and rearrange a garden, rewrite, rework, and re-architect code when it needs it. Fix the root of the problem." + }, + { + "Test your software, or your users will.", + "", + "Test ruthlessly. Don't make your users find bugs for you." + }, + { + "Don't gather requirements - dig for them.", + "", + "Requirements rarely lie on the surface. They're buried deep beneath layers of assumptions, misconceptions, and politics." + }, + { + "Abstractions live longer than details.", + "", + "Invest in the abstraction, not the implementation. Abstractions can survive the barrage of changes from different implementations and new technologies." + }, + { + "Don't think outside the box - find the box.", + "", + 'When faced with an impossible problem, identify the real constraints. Ask yourself: "Does it have to be done this way? Does it have to be done at all?"' + }, + { + "Some things are better done than described.", + "", + "Don't fall into the specification spiral - at some point you need to start coding." + }, + { + "Costly tools don't produce better designs.", + "", + "Beware of vendor hype, industry dogma, and the aura of the price tag. Judge tools on their merits." + }, + { + "Don't use manual procedures.", + "", + "A shell script or batch file will execute the same instructions, in the same order, time after time." + }, + {"Coding ain't done 'til all the Tests run.", "", "'Nuff said."}, + { + "Test state coverage, not code coverage.", + "", + "Identify and test significant program states. Just testing lines of code isn't enough." + }, + { + "English is just a programming language.", + "", + "Write documents as you would write code: honor the DRY principle, use metadata, MVC, automatic generation, and so on." + }, + { + "Gently exceed your users' expectations.", + "", + "Come to understand your users' expectations, then deliver just that little bit more." + }, + { + "Think about your work.", + "", + "Turn off the autopilot and take control. Constantly critique and appraise your work." + }, + { + "Don't live with broken windows.", + "", + "Fix bad designs, wrong decisions, and poor code when you see them." + }, + { + "Remember the big picture.", + "", + "Don't get so engrossed in the details that you forget to check what's happening around you." + }, + { + "Invest regularly in your knowledge portfolio.", + "", + "Make learning a habit." + }, + { + "It's both what you say and the way you say it.", + "", + "There's no point in having great ideas if you don't communicate them effectively." + }, + { + "Make it easy to reuse.", + "", + "If it's easy to reuse, people will. Create an environment that supports reuse." + }, + { + "There are no final decisions.", + "", + "No decision is cast in stone. Instead, consider each as being written in the sand at the beach, and plan for change." + }, + { + "Prototype to learn.", + "", + "Prototyping is a learning experience. Its value lies not in the code you produce, but in the lessons you learn." + }, + { + "Estimate to avoid surprises.", + "", + "Estimate before you start. You'll spot potential problems up front." + }, + { + "Keep knowledge in plain text.", + "", + "Plain text won't become obsolete. It helps leverage your work and simplifies debugging and testing." + }, + { + "Use a single editor well.", + "", + "The editor should be an extension of your hand; make sure your editor is configurable, extensible, and programmable." + }, + { + "Fix the problem, not the blame.", + "", + "It doesn't really matter whether the bug is your fault or someone else's - it is still your problem, and it still needs to be fixed." + }, + { + '"select" isn\'t broken.', + "", + "It is rare to find a bug in the OS or the compiler, or even a third-party product or library. The bug is most likely in the application." + }, + { + "Learn a text manipulation language.", + "", + "You spend a large part of each day working with text. Why not have the computer do some of it for you?" + }, + { + "You can't write perfect software.", + "", + "Software can't be perfect. Protect your code and users from the inevitable errors." + }, + { + "Crash early.", + "", + "A dead program normally does a lot less damage than a crippled one." + }, + { + "Use exceptions for exceptional problems.", + "", + "Exceptions can suffer from all the readability and maintainability problems of classic spaghetti code. Reserve exceptions for exceptional things." + }, + { + "Minimize coupling between modules.", + "", + 'Avoid coupling by writing "shy" code and applying the Law of Demeter.' + }, + { + "Put abstractions in code, details in metadata.", + "", + "Program for the general case, and put the specifics outside the compiled code base." + }, + { + "Design using services.", + "", + "Design in terms of services-independent, concurrent objects behind well-defined, consistent interfaces." + }, + { + "Separate views from models.", + "", + "Gain flexibility at low cost by designing your application in terms of models and views." + }, + { + "Don't program by coincidence.", + "", + "Rely only on reliable things. Beware of accidental complexity, and don't confuse a happy coincidence with a purposeful plan." + }, + { + "Test your estimates.", + "", + "Mathematical analysis of algorithms doesn't tell you everything. Try timing your code in its target environment." + }, + { + "Design to test.", + "", + "Start thinking about testing before you write a line of code." + }, + { + "Don't use wizard code you don't understand.", + "", + "Wizards can generate reams of code. Make sure you understand all of it before you incorporate it into your project." + }, + { + "Work with a user to think like a user.", + "", + "It's the best way to gain insight into how the system will really be used." + }, + { + "Use a project glossary.", + "", + "Create and maintain a single source of all the specific terms and vocabulary for a project." + }, + { + "Start when you're ready.", + "", + "You've been building experience all your life. Don't ignore niggling doubts." + }, + { + "Don't be a slave to formal methods.", + "", + "Don't blindly adopt any technique without putting it into the context of your development practices and capabilities." + }, + { + "Organize teams around functionality.", + "", + "Don't separate designers from coders, testers from data modelers. Build teams the way you build code." + }, + { + "Test early. Test often. Test automatically.", + "", + "Tests that run with every build are much more effective than test plans that sit on a shelf." + }, + { + "Use saboteurs to test your testing.", + "", + "Introduce bugs on purpose in a separate copy of the source to verify that testing will catch them." + }, + { + "Find bugs once.", + "", + "Once a human tester finds a bug, it should be the last time a human tester finds that bug. Automatic tests should check for it from then on." + }, + { + "Sign your work.", + "", + "Craftsmen of an earlier age were proud to sign their work. You should be, too." + }, + {"Think twice, code once."}, + {"No matter how far down the wrong road you have gone, turn back now."}, + { + "Why do we never have time to do it right, but always have time to do it over?" + }, + {"Weeks of programming can save you hours of planning."}, + {"To iterate is human, to recurse divine.", "", "- L. Peter Deutsch"}, + { + "Computers are useless. They can only give you answers.", + "", + "- Pablo Picasso" + }, + { + "The question of whether computers can think is like the question of whether submarines can swim.", + "", + "- Edsger W. Dijkstra" + }, + { + "It's ridiculous to live 100 years and only be able to remember 30 million bytes. You know, less than a compact disc. The human condition is really becoming more obsolete every minute.", + "", + "- Marvin Minsky" + }, + { + "The city's central computer told you? R2D2, you know better than to trust a strange computer!", + "", + "- C3PO" + }, + { + "Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves.", + "", + "- Alan Kay" + }, + { + 'I\'ve finally learned what "upward compatible" means. It means we get to keep all our old mistakes.', + "", + "- Dennie van Tassel" + }, + { + "There are two major products that come out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence.", + "", + "- Jeremy S. Anderson" + }, + { + "The bulk of all patents are crap. Spending time reading them is stupid. It's up to the patent owner to do so, and to enforce them.", + "", + "- Linus Torvalds" + }, + { + "Controlling complexity is the essence of computer programming.", + "", + "- Brian Kernighan" + }, + { + "Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges, and it causes end-user and administrator frustration.", + "", + "- Ray Ozzie" + }, + { + "The function of good software is to make the complex appear to be simple.", + "", + "- Grady Booch" + }, + { + "There's an old story about the person who wished his computer were as easy to use as his telephone. That wish has come true, since I no longer know how to use my telephone.", + "", + "- Bjarne Stroustrup" + }, + { + 'There are only two industries that refer to their customers as "users".', + "", + "- Edward Tufte" + }, + { + "Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.", + "", + "- Larry Wall" + }, + { + "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.", + "", + "- Eric S. Raymond" + }, + { + "Optimism is an occupational hazard of programming; feedback is the treatment.", + "", + "- Kent Beck" + }, + {"First, solve the problem. Then, write the code.", "", "- John Johnson"}, + { + "Measuring programming progress by lines of code is like measuring aircraft building progress by weight.", + "", + "- Bill Gates" + }, + { + "Don't worry if it doesn't work right. If everything did, you'd be out of a job.", + "", + "- Mosher's Law of Software Engineering" + }, + { + "A LISP programmer knows the value of everything, but the cost of nothing.", + "", + "- Alan J. Perlis" + }, + { + "All problems in computer science can be solved with another level of indirection.", + "", + "- David Wheeler" + }, + { + "Functions delay binding; data structures induce binding. Moral: Structure data late in the programming process.", + "", + "- Alan J. Perlis" + }, + { + "Easy things should be easy and hard things should be possible.", + "", + "- Larry Wall" + }, + {"Nothing is more permanent than a temporary solution."}, + { + "If you can't explain something to a six-year-old, you really don't understand it yourself.", + "", + "- Albert Einstein" + }, + {"All programming is an exercise in caching.", "", "- Terje Mathisen"}, + {"Software is hard.", "", "- Donald Knuth"}, + {"They did not know it was impossible, so they did it!", "", "- Mark Twain"}, + { + "The object-oriented model makes it easy to build up programs by accretion. What this often means, in practice, is that it provides a structured way to write spaghetti code.", + "", + "- Paul Graham" + }, + { + "Question: How does a large software project get to be one year late?", + "Answer: One day at a time!" + }, + { + "The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.", + "", + "- Tom Cargill" + }, + { + "In software, we rarely have meaningful requirements. Even if we do, the only measure of success that matters is whether our solution solves the customer's shifting idea of what their problem is.", + "", + "- Jeff Atwood" + }, + { + "If debugging is the process of removing bugs, then programming must be the process of putting them in.", + "", + "- Edsger W. Dijkstra" + }, + {"640K ought to be enough for anybody.", "", "- Bill Gates, 1981"}, + { + "To understand recursion, one must first understand recursion.", + "", + "- Stephen Hawking" + }, + { + "Developing tolerance for imperfection is the key factor in turning chronic starters into consistent finishers.", + "", + "- Jon Acuff" + }, + { + "Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.", + "", + "- Patrick McKenzie" + }, + { + "The average user doesn't give a damn what happens, as long as (1) it works and (2) it's fast.", + "", + "- Daniel J. Bernstein" + }, + { + "Walking on water and developing software from a specification are easy if both are frozen.", + "", + "- Edward V. Berard" + }, + { + "Be curious. Read widely. Try new things. I think a lot of what people call intelligence boils down to curiosity.", + "", + "- Aaron Swartz" + }, + { + "What one programmer can do in one month, two programmers can do in two months.", + "", + "- Frederick P. Brooks" + } +} + +-- If g:startify_custom_header_quotes isn't set, initialize it to the predefined list +if vim.g.startify_custom_header_quotes == nil then + vim.g.startify_custom_header_quotes = fortune_cfg.predefined_quotes +end + +-- Expose functions for use from other Lua code or for compatibility +return { + cowsay = cowsay, + fortune_cfg = fortune_cfg, + predefined_quotes = predefined_quotes +} diff --git a/nvim/lua/darcula/utils/globals.lua b/nvim/lua/darcula/utils/globals.lua new file mode 100644 index 0000000..2ca57a0 --- /dev/null +++ b/nvim/lua/darcula/utils/globals.lua @@ -0,0 +1,315 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("darcula.utils.string") +require("darcula.utils.table") + +local utils = require("darcula.utils") +local utils_os = require("darcula.utils.os") +local utils_ui = require("darcula.utils.ui") + +NV_Darcula_Close_Invalid = function() + local buffer_numbers = vim.api.nvim_list_bufs() + for _, buffer_number in pairs(buffer_numbers) do + local buf_info = vim.fn.getbufinfo(buffer_number) + if buf_info ~= nil then + buf_info = buf_info[1] + if buf_info.windows ~= nil and #buf_info.windows > 0 then + local win_type = vim.fn.win_gettype(buf_info.windows[1]) + if win_type ~= nil and win_type == "popup" then + vim.api.nvim_buf_delete(buffer_number, {force = true}) + end + end + end + end +end + +NV_Darcula_Close_All = function(write_all) + NV_Darcula_Close_Invalid() + + write_all = write_all or false + vim.cmd(utils.iff(write_all, "wqa!", "qa!")) +end + +NV_Darcula_Coc_Completion_Confirm = function() + if vim.fn["coc#pum#visible"]() ~= 0 then + return vim.fn["coc#pum#confirm"]() + end + + return "u=coc#on_enter()" +end + +NV_Darcula_Coc_Float_Scroll = function(fwd) + if vim.fn["coc#float#has_scroll"]() == 1 then + vim.fn["coc#float#scroll"](utils.iff(fwd and fwd ~= 0, 1, 0)) + return + end + return "" +end + +NV_Darcula_Coc_Float_Scroll_Insert_Mode = function(fwd) + if vim.fn["coc#float#has_scroll"]() == 1 then + return "=coc#float#scroll(" .. + utils.iff(fwd and fwd ~= 0, 1, 0) .. ")" + end + + return "<" .. utils.iff(fwd and fwd ~= 0, "Right", "Left") .. ">" +end + +NV_Darcula_Coc_Shift_Tab_Complete = function() + if vim.fn["coc#pum#visible"]() ~= 0 then + return vim.fn["coc#pum#prev"](1) + end + + return "" +end + +NV_Darcula_Coc_Tab_Complete = function() + if vim.fn["coc#pum#visible"]() ~= 0 then + return vim.fn["coc#pum#next"](1) + end + + local check_backspace = function() + local col = vim.api.nvim_win_get_cursor(0)[2] + return (col == 0 or + vim.api.nvim_get_current_line():sub(col, col):match("%s")) and + true + end + + if check_backspace() then + return "" + end + + return vim.fn["coc#refresh"]() +end + +NV_Darcula_Copen = function() + vim.cmd(":Copen") + vim.cmd(":wincmd j") +end + +NV_Darcula_Font_Name = function() + return "JetBrainsMonoNL NFM" +end + +NV_Darcula_Git_Root = function(cwd) + cwd = cwd or vim.loop.cwd() + local cmd = {"git", "-C", cwd, "rev-parse", "--show-toplevel"} + local output = vim.fn.systemlist(cmd) + if vim.v.shell_error == 0 and output[1] and #output[1] > 0 then + return vim.fn.fnamemodify(output[1], ":p") + end + + return cwd +end + +NV_Darcula_Grab_Selection = function(cb) + local selection = utils.get_visual_text() + vim.schedule( + function() + cb(selection) + end + ) +end + +NV_Darcula_Load_RC = function() + local local_vimrc = vim.fn.getcwd() .. "/.nvimrc" + if vim.loop.fs_stat(local_vimrc) then + vim.cmd("source " .. local_vimrc) + end +end + +NV_Darcula_LSP_Restart = function() + if NV_DARCULA_ENABLE_COC then + pcall( + function() + if vim.fn["coc#rpc#ready"] ~= nil and vim.fn["coc#rpc#ready"]() == 1 then + vim.cmd(":silent! :CocRestart") + NV_Darcula_Refresh_Buffer() + end + end + ) + return + end + + vim.cmd("LspRestart") + NV_Darcula_Refresh_Buffer() +end + +NV_Darcula_LSP_Stop = function() + if NV_DARCULA_ENABLE_COC then + vim.cmd(":silent! :CocStop") + end +end + +NV_Darcula_Open_Nvim_Tree = function(sync) + if sync and sync ~= 0 then + vim.cmd("NvimTreeFindFile") + return + end + + vim.cmd("NvimTreeFindFileToggle") +end + +NV_Darcula_Refresh_Buffer = function() + vim.cmd(":silent! :e%") +end + +NV_Darcula_Set_Gui_Font = function(size) + if utils_ui.is_gui() then + if vim.env.MY_STATE_HOME ~= nil and not utils_os.is_windows then + if utils.file_exists(vim.env.MY_STATE_HOME .. "/.desktop") then + if size == 0 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h18") + return + end + + if size == 1 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h15") + return + end + + if size == 2 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h21") + return + end + + if size == 3 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h28") + return + end + end + + if utils.file_exists(vim.env.MY_STATE_HOME .. "/.laptop2") then + if size == 0 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h22") + return + end + + if size == 1 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h19") + return + end + + if size == 2 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h25") + return + end + + if size == 3 then + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h12", ":h32") + return + end + return + end + + if utils.file_exists(vim.env.MY_STATE_HOME .. "/.laptop") then + -- vim.opt.guifont = + -- NV_Darcula_Font_Name() .. utils.iff(util_os.is_mac, ":h12", ":h18") + return + end + end + + vim.opt.guifont = + NV_Darcula_Font_Name() .. utils.iff(utils_os.is_mac, ":h15", ":h18") + end +end + +NV_Darcula_Set_Gui_Popup = function(enable) + if utils_ui.is_gui() and vim.fn.exists(":GuiPopupmenu") ~= 0 then + vim.cmd("GuiPopupmenu " .. utils.iff(enable, "1", "0")) + end +end + +NV_Darcula_Show_Documentation = function() + local file_type = vim.bo.filetype + if table.contains({"vim", "help"}, file_type) then + NV_Darcula_Show_Vim_Documentation(false) + return + end + + if NV_DARCULA_ENABLE_COC then + if vim.fn.CocAction("hasProvider", "hover") then + vim.api.nvim_feedkeys( + vim.api.nvim_replace_termcodes("", true, false, true), + "n", + true + ) + + vim.fn.CocActionAsync("doHover") + return + end + return + end + + local bufnr = vim.api.nvim_get_current_buf() + local clients = + vim.lsp.get_clients( + { + bufnr = bufnr, + method = "textDocument/hover" + } + ) + + if #clients == 0 then + return + end + + vim.lsp.buf.hover() +end + +NV_Darcula_Show_Man_Documentation = function(visual) + local is_cpp = utils.is_c_family_file() + if visual then + if is_cpp then + require("cppman").open(utils.get_visual_text(), true) + return + end + + vim.cmd("vertical Man " .. vim.fn.escape(utils.get_visual_text(), " ")) + return + end + + if is_cpp then + require("cppman").open(utils.cword(), true) + return + end + vim.cmd("vertical Man") +end + +NV_Darcula_Show_Vim_Documentation = function(visual) + if visual then + vim.cmd("vertical help " .. utils.get_visual_text()) + return + end + + vim.cmd("vertical help " .. utils.cword()) +end + +NV_Darcula_Write_All = function() + vim.cmd("silent! wa!") +end diff --git a/nvim/lua/darcula/utils/init.lua b/nvim/lua/darcula/utils/init.lua new file mode 100644 index 0000000..3173002 --- /dev/null +++ b/nvim/lua/darcula/utils/init.lua @@ -0,0 +1,233 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local cword = function() + ---@diagnostic disable-next-line: missing-parameter + return vim.fn.expand("") +end + +local coc_command = function(command) + vim.cmd("CocCommand " .. command) +end + +local autocmd = function(group, event, pattern, callback) + vim.api.nvim_create_autocmd( + event, + { + callback = callback, + group = group, + pattern = pattern + } + ) +end + +local autocmd_buffer = function(group, event, buffer, callback) + vim.api.nvim_create_autocmd( + event, + { + buffer = buffer, + callback = callback, + group = group + } + ) +end + +local augroup_with_autocmd = function(name, event, pattern, callback) + local group = vim.api.nvim_create_augroup(name, {clear = true}) + autocmd(group, event, pattern, callback) + return group +end + +local augroup_with_autocmd_buffer = function(name, event, buffer, callback) + local group = vim.api.nvim_create_augroup(name, {clear = true}) + autocmd_buffer(group, event, buffer, callback) + return group +end + +local file_exists = function(name) + local f = io.open(name, "r") + return f ~= nil and io.close(f) +end + +local get_visual_text = function() + vim.cmd('normal! "ry') + return vim.fn.getreg("r") +end + +local is_c_family_file = function() + local name = vim.api.nvim_buf_get_name(0) + if name == nil or name == "" then + return false + end + + local ext = name:match("%.([^.]+)$") + if not ext then + return false + end + + ext = ext:lower() + return ext == "h" or ext == "hh" or ext == "hxx" or ext == "hpp" or ext == "c" or + ext == "cc" or + ext == "cpp" or + ext == "cxx" +end + +local function get_files_sorted_without_extension(dir) + local files = {} + local scanner = vim.loop.fs_scandir(dir) + if not scanner then + return files + end + + while true do + local name, typ = vim.loop.fs_scandir_next(scanner) + if not name then + break + end + if typ == "file" then + local base = name:match("(.+)%.[^%.]+$") or name + table.insert(files, base) + end + end + + table.sort(files) + return files +end + +local function create_vert_display(name, command) + vim.api.nvim_create_user_command( + name, + function() + vim.cmd("vert new") + local buf = vim.api.nvim_get_current_buf() + + vim.bo[buf].buftype = "nofile" + vim.bo[buf].bufhidden = "wipe" + vim.bo[buf].buflisted = false + vim.bo[buf].swapfile = false + vim.bo[buf].modifiable = true + vim.opt_local.wrap = true + + local lines = vim.fn.execute(command, "silent") + vim.api.nvim_buf_set_lines( + buf, + 0, + -1, + false, + vim.split(lines, "\n", {plain = true, trimempty = true}) + ) + + vim.bo[buf].modifiable = false + vim.api.nvim_win_set_cursor(0, {vim.api.nvim_buf_line_count(buf), 0}) + end, + {} + ) +end + +local function copy_file(src, dst) + local uv = vim.uv + local ok, err = uv.fs_copyfile(src, dst) + if not ok then + error(("copy failed: %s"):format(err)) + end +end + +local function iff(b, l, r) + if b then + return l + end + + return r +end + +local parse_env = function(var, def) + if vim.env[var] ~= nil then + if type(def) == "boolean" then + local result = + ({ + ["0"] = false, + ["1"] = true, + ["false"] = false, + ["n"] = false, + ["no"] = false, + ["off"] = false, + ["on"] = true, + ["true"] = true, + ["y"] = true, + ["yes"] = true + })[tostring(vim.env[var]):lower()] + if result == nil then + return def + end + return result + end + + return vim.env[var] + end + + return def +end + +local parse_env_list = function(var, def) + if vim.env[var] ~= nil then + local items = vim.split(var, " ", {plain = true, trimempty = true}) + for i, v in ipairs(items) do + items[i] = vim.fn.trim(v) + end + return items + end + + return def +end + +local function get_current_filename() + local name = vim.api.nvim_buf_get_name(0) + if name == "" then + return "" + end + + return vim.fn.fnamemodify(name, ":t") +end + +local notify_setting_enabled = function(text, enabled) + vim.notify( + text .. ": " .. iff(enabled, "ENABLED", "DISABLED"), + vim.log.levels.INFO + ) +end + +return { + augroup_with_autocmd = augroup_with_autocmd, + augroup_with_autocmd_buffer = augroup_with_autocmd_buffer, + autocmd = autocmd, + autocmd_buffer = autocmd_buffer, + coc_command = coc_command, + copy_file = copy_file, + create_vert_display = create_vert_display, + cword = cword, + file_exists = file_exists, + get_current_filename = get_current_filename, + get_files_sorted_without_extension = get_files_sorted_without_extension, + get_visual_text = get_visual_text, + iff = iff, + is_c_family_file = is_c_family_file, + notify_setting_enabled = notify_setting_enabled, + parse_env = parse_env, + parse_env_list = parse_env_list +} diff --git a/nvim/lua/darcula/utils/keymap.lua b/nvim/lua/darcula/utils/keymap.lua new file mode 100644 index 0000000..fc19ee9 --- /dev/null +++ b/nvim/lua/darcula/utils/keymap.lua @@ -0,0 +1,76 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local cmap = function(...) + vim.keymap.set("c", ...) +end + +local imap = function(...) + vim.keymap.set("i", ...) +end + +local leader = function(chars) + return "" .. chars +end + +local leader2 = function(chars) + return "'" .. chars +end + +local leader3 = function(chars) + return "`" .. chars +end + +local map = function(...) + vim.keymap.set("", ...) +end + +local nmap = function(...) + vim.keymap.set("n", ...) +end + +local set = function(...) + vim.keymap.set(...) +end + +local tmap = function(...) + vim.keymap.set("t", ...) +end + +local vmap = function(...) + vim.keymap.set("v", ...) +end + +local xmap = function(...) + vim.keymap.set("x", ...) +end + +return { + cmap = cmap, + imap = imap, + leader = leader, + leader2 = leader2, + leader3 = leader3, + map = map, + nmap = nmap, + set = set, + tmap = tmap, + vmap = vmap, + xmap = xmap +} diff --git a/nvim/lua/darcula/utils/os/init.lua b/nvim/lua/darcula/utils/os/init.lua new file mode 100644 index 0000000..04419f2 --- /dev/null +++ b/nvim/lua/darcula/utils/os/init.lua @@ -0,0 +1,23 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local M = {} +M.is_mac = vim.fn.has("mac") == 1 +M.is_windows = vim.fn.has("win32") == 1 or vim.fn.has("win64") == 1 +return M diff --git a/nvim/lua/darcula/utils/path/init.lua b/nvim/lua/darcula/utils/path/init.lua new file mode 100644 index 0000000..552ad8d --- /dev/null +++ b/nvim/lua/darcula/utils/path/init.lua @@ -0,0 +1,49 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +require("darcula.utils.string") + +local g = require("darcula.utils") +local os = require("darcula.utils.os") +local path = require("plenary.path") +local scan = require("plenary.scandir") + +local M = {} + +M.directory_sep = g.iff(os.is_windows, "\\", "/") +M.not_directory_sep = g.iff(os.is_windows, "/", "\\") + +function M.get_file_name_list(dir, remove_extension, extension_no_dot) + extension_no_dot = (extension_no_dot or "lua"):lower() + local list = {} + + local files = scan.scan_dir(dir, {hidden = true, depth = 1}) + for _, name in ipairs(files) do + local file_name = path:new(name):make_relative(dir):lower() + if file_name:ends_with("." .. extension_no_dot) then + table.insert( + list, + g.iff(remove_extension, file_name:sub(1, -5), file_name) + ) + end + end + return list +end + +return M diff --git a/nvim/lua/darcula/utils/string/init.lua b/nvim/lua/darcula/utils/string/init.lua new file mode 100644 index 0000000..ff922bf --- /dev/null +++ b/nvim/lua/darcula/utils/string/init.lua @@ -0,0 +1,44 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +function string:contains(str) + return self:find(str, 1, true) ~= nil +end + +function string:ends_with(suffix) + return suffix == "" or self:sub(-(#suffix)) == suffix +end + +function string:split(sep) + sep = sep or ":" + local fields = {} + local pattern = string.format("([^%s]+)", sep) + _ = + self:gsub( + pattern, + function(c) + fields[#fields + 1] = c + end + ) + return fields +end + +function string:starts_with(prefix) + return self:sub(1, #prefix) == prefix +end diff --git a/nvim/lua/darcula/utils/symbols.lua b/nvim/lua/darcula/utils/symbols.lua new file mode 100644 index 0000000..2626d79 --- /dev/null +++ b/nvim/lua/darcula/utils/symbols.lua @@ -0,0 +1,104 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +return { + code_action = "󰜎", + debug = { + breakpoint = "", + conditional_breakpoint = "", + breakpoint_disabled = "", + current_frame = "", + current_line = "", + current_line_with_breakpoint = "", + current_thread = "" + }, + definition = "", + definition_preview = "", + diagnostic_header = "", + directory = { + collapsed = "", + expanded = "", + directory = "", + directory_empty = "", + directory_open = "" + }, + file = "󰈙", + git = { + added = "", + blame = "", + conflict = "", + unstaged = "", + staged = "", + unmerged = "", + renamed = "󰑕", + untracked = "", + deleted = "", + ignored = "◌" + }, + indent = "│", + listchars = { + eol = "↵", + extends = "»", + nbsp = "␣", + precedes = "«", + space = "·", + tab = "→\\ ", + trail = "•" + }, + os = { + unix = "󰌽", + dos = "", + mac = "" + }, + line = { + errors = "", + hints = "", + info = "", + warnings = "" + }, + references = "", + rename = "󰑕", + search = "", + separators = { + default = "•", + component = { + left = "", + right = "" + }, + section = { + left = "", + right = "" + } + }, + spinner = {"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"}, + status = { + checking = "", + errors = "", + info = "", + fix = "", + hints = "", + locked = "", + modified = "󰆓", + not_ok = "", + ok = "", + uninstalled = "", + unlocked = "", + warnings = "" + } +} diff --git a/nvim/lua/darcula/utils/table/init.lua b/nvim/lua/darcula/utils/table/init.lua new file mode 100644 index 0000000..e0b3529 --- /dev/null +++ b/nvim/lua/darcula/utils/table/init.lua @@ -0,0 +1,42 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +function table.contains(table, val) + for i = 1, #table do + if table[i] == val then + return true + end + end + return false +end + +function table.print_table(o) + return print(vim.inspect(o)) +end + +function table.reverse(self) + local n = #self + local i = 1 + while i < n do + self[i], self[n] = self[n], self[i] + i = i + 1 + n = n - 1 + end + return self +end diff --git a/nvim/lua/darcula/utils/ui/init.lua b/nvim/lua/darcula/utils/ui/init.lua new file mode 100644 index 0000000..f9287b5 --- /dev/null +++ b/nvim/lua/darcula/utils/ui/init.lua @@ -0,0 +1,26 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local M = {} + +M.is_gui = function() + return vim.g.GuiLoaded == 1 or vim.g.neovide +end + +return M diff --git a/viml.sh b/viml.sh new file mode 100755 index 0000000..ca1139c --- /dev/null +++ b/viml.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_APPNAME=nvim +export NVIM_APPNAME + +NV_DARCULA_ENABLE_COC=true +export NV_DARCULA_ENABLE_COC + +"${SCRIPT_DIR}/viml_common.sh" "$@" diff --git a/viml2.sh b/viml2.sh new file mode 100755 index 0000000..4419b78 --- /dev/null +++ b/viml2.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" + +NVIM_APPNAME=nvim2 +export NVIM_APPNAME + +NV_DARCULA_ENABLE_COC=false +export NV_DARCULA_ENABLE_COC + +"${SCRIPT_DIR}/viml_common.sh" "$@" diff --git a/viml_common.sh b/viml_common.sh new file mode 100755 index 0000000..9b2461a --- /dev/null +++ b/viml_common.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +## The MIT License (MIT) +## +## Copyright © 2026 Scott E. Graves +## +## Permission is hereby granted, free of charge, to any person obtaining a copy of this software +## and associated documentation files (the “Software”), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, publish, distribute, +## sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included in all copies or +## substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +## BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +## NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +## DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "${SCRIPT_DIR}/common.sh" + +create_link "${SCRIPT_DIR}/nvim" "${HOME}/.config/${NVIM_APPNAME}" +create_link "${SCRIPT_DIR}/dviml.sh" "${HOME}/.local/bin/dviml" +create_link "${SCRIPT_DIR}/dviml2.sh" "${HOME}/.local/bin/dviml2" +create_link "${SCRIPT_DIR}/viml.sh" "${HOME}/.local/bin/viml" +create_link "${SCRIPT_DIR}/viml2.sh" "${HOME}/.local/bin/viml2" + +if [ ! -f "/tmp/nvim-${NVIM_OS}-${NVIM_ARCH}/bin/nvim" ]; then + pushd "${SCRIPT_DIR}" 1>/dev/null 2>&1 || error_exit "failed to pushd: ${SCRIPT_DIR}" + FNAME=nvim-${NVIM_OS}-${NVIM_ARCH}.tar.gz + tar xvzf "pkg/${FNAME}" -C /tmp + popd 1>/dev/null 2>&1 || error_exit "failed to popd: ${SCRIPT_DIR}" +fi + +exec "/tmp/nvim-${NVIM_OS}-${NVIM_ARCH}/bin/nvim" "$@"

#;~DiKIzEbdW>0gN%tTOS0i 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 T5u|a9jx_?03!cerfj|%t z80+qLjYFWUYies*I!qOL!PeI1cz18_{|3HEbH-;f2t3NmKz|tXbN58qUy86u! z!o7C=7lGdbhQJ%ZKga^#DWD~wu4@L}HlO(TPjKbZ7QqLGy)J}6uivAps}u7PF#tAc z9?o--kRLCa(oT@!14*Q5$1yH=to0}nkV@eYn4+dAGA74U2mv7l-WZ0x4njy4WsN)8 z4e=)$lGa*+_ZVZSs*2zpWmS)9mVh$O@Tm9QSOP5j0EXrO-yDy}zrDV`{@B66L9ZW0 z6u>aRSirxeIpNB||KJ^O;91!mF&cK@>P4J)jHeUId_hrKZg20=9SpdzxiQ+lyK@m( z0S-^T-kE(+9#SkDyB@GYNC$%21ibTf(**CqdqFT3Ed)AgVS-00i4=-Kr_X$r;j5a; zGz(zPJMfTdjk6YaYI_tQiZsTUjE3h?afZi$@74?e?lS{-oO9o;>-w{6olel!@{?yq(Di551zE8ND_rqnxvHyB?-bolEid-U5xWQ_Shv_?G_P% zSTuA0_{2D7IsXT6A)ulN6)9*WzzWVd6Y$-b0l@cX0k@{p>DM+lHa@nOWu0+=j}72! zd7}+*0rCsy`!j^M8xS!RX$=e^!n}ExI#=u6BBp)n_qBle`i3ERb z75)w?S#)on(TPO6OTQ{PrUL9#bQc#utK}jLdOv|ZrtS7&0A<3opwsQ+v~o5 z{pMj+Rd3P^7?$bcIes))jsO#2T}RPRr?GmX9mfa}a0G;aG;T(LLg{ARTQzFX-ENn5 ztIdsDx3R`jIL|DvC@Mp7A_Kmr1V7yqe6S_>&o2bpcy>yONYmGgqWEJPFMy>N;F-g_ zH3NVLw*+Uvo^$R9xR6R1XMum4!|OWcW>=H66Z$%$oyNTJ#+!WPBR|2`r6`kIw~mq=?OAyJWLGM|ws$(_8yOy_h(V4x%yQ%Rx)cdg*tPH`m-e62Qo zwN`Z2x_+GHcXsbeYmI|OcP&7USIEeZWNW_4vqQP=G4 z?6X+Rc=E|7=?@0ny>*MjqXV9O_9^bkzLy1xFN>G-JKYPD#$n$6CjJZUEZ(KtRSp#YCk3hx8oxwXy9$5Wn&6?wmn z?WZ@bG;o(QJm!5jX8=nqi9wUvm|JliQ(Mb7 zrQ}Q262*>4DdI#Eyu&-kJg@kJKl(g_{(x&&ud=&)z-Y9>+QvFbA_+qC_?0K=4pzDL z)Kv9*y`P-T=AQ$0xSuYb`P<_mLr_XZ65k&5yCiW$z!SxqL~4Qztgo$+>KLsgooUGYL1=tV5yFCLqO(kt9 zr8eU@{wY&cYAz+aAv9u;CkrN0N=#L=s2xRJ6G_2nw8F;LMRX#WPmY+5k6GW?WPR%j zS&?DOnpu{&Z{FU%5klApjya>Gk%th=vrB=^Ua$94)5+vRLMb|_MoD>ZeAjMwh=?fb znpmgQ#xkB9bNkL+T6Mu2D}5>fWl@t?)jfGQYb`pCo9kUjY-s!>+MUitL|fCiwp9)!d>$8?@ESrm95@Io@3%(;8_04W7& zyUX*>zsyrtpMf~0ta7X?xOwwUA_T8|@P!xp{r+DA9;cBETWSTI2ZFyE1kLZV6-Ci# z*llrnw907EApnc4#MBn=DwGyPiRO4R<@)VCo81fCU~OZQPP@h0`UXjyqJ$vN7PML&Hn-O0Y*Ad=-P^zJz2D)C zI>|g_ST=C`z_o6t{j+7hxDZsc2&5vg&Nn75k)+*flf;UFc}BmT!>&1;YKiB=w` zm@deQ0ucnW+VcLEV=a>W<1D5`kP?XNn$^0-wA$NQo_~^tDL&&2pW}G|crXA2Kr5v# zc;{a9_c-BzkVqjh#!?%@u$wT=3g%hC^VcqO>-G-LTRNQq-}uJY>7*^WexoIm-~uh8#ydE)9*^!j~@Jm>oB-=Zq!NZlUXxOM0C5W*h!Z;$gJ@WW#n0NTKn zIF3L1#Ffjx*iCgD3rVll<sq?~eIj)^q-wX9S;qLvXwD{EDl% z>J7)WqwgL6=hL3otmMnNAfllHODS33Re?;SEbo^tc%ZSuMT4|lhBna}3jzI6+&6Vf>0 z%^PnaQ1Ra3q%O;HoBMq7^Ch7l9?SH906a4s4F1z6FKs;4P7_ot>Gb-n4p%V7prgfo z2|QHY`?zHmW{k0nnPG-uY-3-`o+bO1EeVMvq>@y~8l{ysw4zO$Xb~zErIkvh(oShl z*$Rbw{?GKj`uO(t_AY(D|KII%I_KVdmgk)FoM*pgx#Tg`?-wSQ@>cHM-c1Q!m?@m2ml9I&F-YUR@zb2G4}N@6;1I^pV23K=gxWj>6h9Plw#?JcjocH^8!g>kbK-f0WABZ z+uoRS;S@SOA@0)y-+L!tzP+QK)cs=P@xFnGle4cZC2ve@>g_yBZ2b6I{}Xr7OvBA* zUYxdWJEb&GKTQL73tu#=`a$vWl(2X0r#;;$%VsZG8>Q;9fxgb?Y6Ux7C(y0vc*@ea ziJ=R{nefT6WQxsao80M5Zu3}|OSh!H+w6QrRp)d5rKdAKY$|=uYdqSDn=`lgLF$aA z_m%>d%Of<}qC=eb=8@LraSpr<)XA#5ZRvp0wxPm1@z(hqd@%&-KsSCxkp1T3VTZCXhq9vTA+Up;bq+uW)xA5EHW9TX^_# zeC{6KytR+axAgW~j6uyMb<^ISh`{GZol>H$pQ4=lP%s>u2u1u{zTC?a3Lj3B~R_UDYw1`=p_! z_PiSNvyM5^UTdYaRP+0fWf;QuL;Fmz`9-gapPl`P+}kY$hVGkAA>Fp|r(KZeoJ*^I zn6yK?k^V&4({a4QS|2a^nCj{TfmN08CqS3xhjBPUQi~H7ha8$PpX+zOv(lygcyjyo zTQLn9NG zIfN}QY>$1AnSRFW)J)|};h1YyGK!HpOKfno>qkzUFc@cQI<%lI#*!zrXiwIsB!Pj1 z`kS{G#di)Lsr&%J-Yd$dJm{ca+HhA!)g@uCiLL0 z{Hizer(JZaG3`8__<|d~{%~!&>B*XeuE!f9c62V-VszbrWZpiLCZwwXIy!k{(d6l!( z@3YXWS&NK|`WTZj`7J>&*Dbn{h6^BMh+lJjK`c(}=utP1-W^m(U$_3e`8o3m?00*b zr1s{O*g8m(+cy)htjicaIPIC`L{p`du3@dsPj`1$A3fSr*52NpE(8a&G3@?l>)vW> zAWyYoAMlG$miLdKktnm3Vc#gRn^y+&lB&jDZ`=tm~$o@glZgc`)5@*!*yltpCcz9JI3r{9MxvIYKYoo zZ+|Cm(Tjhaw#?o&q_uVL&~?`I*vB(a*ILb$haGZ#L_1U8IBeUm(Q_&}p|dNuvQPX~ zvXI-hK7o`JQ#LlwVx1o8>HZkEZM!{Q)!w;iHerhzb5ifM&QoV^b}L;sTP?af&VKS8 zKXrC)iGDlbT4hM{?ctcm;y&+Mi{1Cu;!_Hp4t6KVf!9lKO+@%%q1Dthh|>&dIC`*T zw+cg1*fJ`oaEv`TKJoc(#QNx}`MUl@BrAa2V6SVYd&tD)jWDknD1g%&!d@ZQ{ z&8$Ak7VXge=Dl++3O`1b`T5AlDeU-}s$80o&_S_fc@r-rrYz|%y1-R#gqX+p1LwjD zi8qJV%-_B5pt5Ah=W@EoMzZo-K$Ky#@PZ-&hXT#@wB?UH*TCMuG#iw67?C#02UXi!{Y~s1w z@v_NE`&rXS&Xg>B4dcmy>3weSLr@MDqPt!rjgqv>lKMjf)tB*YSw_-}C+}Ljb2UD(EZpv0dTVC&>-k@19Xu2i z!wQOM>Tl&HOLFd>$(Ss3SZEtgp>shEXGKbDgDwh~A4rkQF~?Udmr%RoDqA+KJf!yQ z+XrgVB$qrdXCH23gMWojfSts(VQvX6-!-D+dLgkidP{k4 zmp^WXXr1}os^&Rp(OLI32@hw_%%Au2(_W96ceod(3D)pLLRWN7)8 zTR8t29s7@6JgS`+JwrNU#>+#l-r96bNo?1lb(CSt9!3SglrXeOM8KAr-CmN`nRv5z zQMQDo8ZLJ4TsMuKOY!5r+-|zLuRt_QKtuKV?XdQ{I{uSdH0atfvCnQ>HYKkb4z635 zrqns@jNm?SKKTVUZR4U!$6X=Hx#Qg%_uP-FIC{+HW|aXY>%s+xs_KNp z?)sWz9|-x1T+Ljnbaj?^#@+kp_p0o8Jck&@#Mb5YsODZyMd_=81wQEXa@Vfaxp$db zA6@Yn3+NbJ7{xp#B2r;<%wjs%c%$CbosZv34UBWy=A}6)+W5e+pal&jx1N27k|Nr6 zsZpoW^jlG_K(JZW@d2a0(9$BF#|}TPfxCH*+Cl?XysV?7H`7~pVs~c7wH%6=n0vkb z21>HVZaEo;+q-ukqJ@_nb+s+)lfM*)QRil*#%3#f=nC|&nY^H`1wMwH9kf3zSk``> zl311((^8}D#g!%dO~MjlR>2=_zxl2|dMpbx>@TaxH0@O;<&X6*Zn*N!GR3M0&p0hmaQn4i zgi_#^9$e^djk|W~F{bR{qPt%r`ZlCfkF~beE`xQ_t9WZ8k^OXgV3}NYSn$eSmjk3S zd+W4Z8t#7BRQ8EdKwmUJIo0vH#HGzrPNH(xq72K+A3q45=sLTCgJ-{C^p5TQVEsxi z=S!r;#6kC%xXmvrUhUJaHmj_@a-?jcf3lnN{%)&cKiA;aS1%u^xvXF7nv+Mee<{XR z^2)XqIwgJS_Mla4j4?KB>`@%q`u^4BPHZi?Zut3!Z5bSZ%4a{*n{7Q)E8-YM*tb60 zy}RW3<999Vc8uTkA6GY%J--omp6mXU&6< zkk>xPRtCHndx&0hzPc)U`PyrCIf`BT^GZ$2FWugHwAw^z`Lrb^%kyow&9DxPS-Lvh zr$oQ;1t+Pf|5Y99QBt3ELlXn&LYh&HiGIwO{++xB@EytQPlK=0^a~3-HxU{$w0vi+ zduBRbNP~CZL9AIZmwWQG!t0Os`kwGa>bukil`pR8@ecLJv;?)X!%{kKuXwTdVb08( z$Fx`OSs@_z$*_g8p|JYN#lR`A3hfQMQ^%TA9Y1lziEkgAbem8px(^y=ZAyq%Bd zOt5SkEHm~%D^mBiE}Pa5dpFMgNxY1Y>j|HC$NY4s-Xmo`I~vy2>)K@>6!vN6qfO`i z+@)*$c1AJ0T^FyPmYm?l$-QVKxM|+8irWcG(2IGWjV>`xPAD?1;)&It>rD-AQFr0G zmXNeLyT-_Nk?VCrSQC;`V>4MAQiV^7-fU{SWB}WzA{xhT-q)h;)6goK*~XggFW$QY zd8d{qz^*O3)bYdyH{h~9aev;Ngt+dZpxp3UO|hb=v-gdkZB@RO@5V4iukpv|OuHSs z&)+yOX4|5PO}&vO_*bu*IVA?|z3*#N+q%;Z4Qf^T9H~8axb8{R)jKhzrq`J*37Z%B zx;m_SXLtDN`4n0)`n3Gn>axU#-r7Wiy|?mY>TD%SGz#Y=#J@GIWnJht8R*uirCxXj zYb2gI*;DaGpszOVi!HOr+fLt5EUj|;016Tm)|njGp)8iQGeSBi8yA;(L;HQMTDZoG zO&vRLoN~F~ExGvfhgzdMGha0CokTAV34F`C<0{(PE1T;$FlV_wZsn4jp;wY%HZ-`yCpUwE}TWhnwfl zo!e0K>h7L~I;qUPH$Lt(i0$k++`X%GR_#Y_gVeUPkKV4_G3|bZvS!U;TlOd)E!2AU zx+6G29hD#3lGCI!U+$7#kyVbnk7K*Ri<#@%8&?HnyX2|3XG-KdD-rWK91u~4Sdt6ptkZSKtUlYEdhE~wPsCPc;&5oUWtVb|mQ+hzbCr(q5 zdH2=L?QR!bPpqEJun}2QIQCqo={ox`o3*=-of4rY?(*TnAFc4^wuv29R(-L^YUTRp zdb@aE%s1B}g#@+X+;hEy`{9JOB{unMujC%OKdWzd-kN>JlDYbGRV-i0K02t=Y?ivt zF-EYt_|}O&^Xs=<4*HzXzItxgt`+e*9?g@pZe)eXZEGF2sLP*I-TQe}r2qB8fXRFO zHNqY`5O#^iyxTf!)*K_*nndr6TxrkJCD&YKH`}q*qsqK(w$mmys^~mOw=VRoB@GGO zdv^V12el_Yxix?|Otjp6wVF&_Y(mI7%h;MjxU+sZ+G@eIEfH}#`OKZ}vE4#t{>xa0 z%5J586e=FLdT4vZ)vYb%Rm*aFmj+djoii_z)}>e+5m{0j(Kd8s>684Wb2hk^xNG{J zyP=#fS)l3_B_UT6yl3weZp1U!&oem+lG6 zynFn^lBZ=`Y16NsE75W;x#=1fsJ569&{;m4Hl&!ivBP~(QJh)06sw4-eRbf@+sN`@ z)84C2x`ovT?r7R&IZ9lR43TJa-+S+Z&>4=w7Dw99a*3?{*($j%&DuvNx!#O2ej>N# zQhEb6y?9ri@vzNvr;MzKKA}C+dtdr5-g)qPX>Pl^;otqY^58sO1Ub^ZwL0UV$ z;lmT%Fm^bD9Bi8Wvgh^!JqPdkIkS%48=A71_(HXq^Cjs>^UUE_OG6rUx6s3w&rHKD zO{Pbhf@pWHm%D^uy)tfCq=a^+q~dz*LtrwKG^5#f4EUA3J!i;ofGf{=MKX>aAI4 zEj|nhZwxGhUvT*lzOmT+#L-y+cycS1Co_AA(!G06rX|O&WK7qoog>lQET@Xg_30F? z(-zt{sq~O1`xP~#^!X07W*xciX(;w=E$)= zz9_9)H3c_!_+pLw>FClYQT|g}1}zk{l^ZRzYu%fN&fhmu#~!{3f9%Q}=;)y6qy|Um3Bze$J;cJlC(bn6rM%xaDuvp@9sqHeyv$A*P_m%ck8MpT}eFSVk8DZ(wy*lRqdgeOSR zI1*UqM?V<5`ck`|u->{UJy-T>594~+bx*_YHdw^S6kQ|C-<`+Wb@TNd*Aqim9IFRE z-d?b#CT;rhwDT{YEO$Izw8YzVEG52C|C#~y;;M1v;YeZY3HPdoyN%Ryte5%^@a?dHP`GnHP(m zY$AsDFY8FJydsspW}!vl-ZgqUc@1|6ANtILN==TxS!U17vllFl+Hot-xny&5>=te_ zZQY(tfzl-!pXMYOvvbbaRrR*2xRt+rg{3bB#>VN@+dqA(n9$KZJGPd;J535%F{|Hw zy^84NhV*gOPLJY_PaXJteyX%-kY;|`%Z@i2)~FtVAC^w`+bjLdweZVb+#B4i>MeOV z_bJq{hU@*N3#=?SQi<%}c*G>pO zT5RI{YTPobD`SF&)Hb)Yu8iI?p~!5(+l|v-GqR>FEuVe!buo7#_il`I`Q^O8$-Ox) zs~Hy*RWB`VlMd{yH+D!kX-mVm_NO8}h>u9PGV3(EZ`Z#1ARC=nf~VE{tdO0wSq2rNT0k$zY~~m?>cMh&c!jO#V1@gXv!NOQg2V#Qg!!K z!JcDlbULTBK1lP|_+)v1b9&BjA+o)^l+C+niv-QkoEhYlaokPlbpth!61to# z?hk$3+}^lG``EjW<~l2@JZ@ImZkjc#le=M)m33RAg_o{u%F`t?cx|yI(*w#HK6O7o zl<(8D&ZB3_i%Sd?mP%ii87!dS{vo7eS<=ncYsvALcH^R*t+TBwDyk!P2Zqz#mniAu z>=!$&S4#}Bxe%9lb-5Y69;F3!E#wOB%X8Jkok7*pMQei~eLjqAlhlZgX}HUu4{tj3 zIU!@!d;fPEUFr*>@5dd=AQj89ToRi1~%JtRi2$YAk*eFeNu9-IU3~mGk7iKZmrNkfi?Xn z3!6y!esVc-h5j3E&b4RSpX#}5F-z=XK-{^A&{<3onqJaM&zc3ZQ;jj{Hix5)Ry7@4 z7d>BvQrD7gt`AT5->-k!eH?wUR-xx$?J*Fq>|C~#sa3j)DwFP?IN@kIFCbUieNM}m zb|%GmYuTrDM#I8wctb|3(%{07&(G3}p9`&xuif1Fsn+jMOYw(FIdsKXANH**cuy$( z^`V1@4Ytg6&1UX7`)>aX6Qk~rLn=v0ma^$94qmNx^=~h(y|+OR>vz!=Fza9Sc}^{1 zZdG7e+M*LJscQLYI|9m@qi&1VF`?3DSK!f`QRTHY4O?4c zy+ycc5RWw9qHvv2VVZ$QbF5J8QESWS@r4^+^Mi6Y&DBXSzBiPY67J6!X$8 zZA{yI;PTscH1}pt+}->EqJ0i)pN)wPdBK^wNZ#80Mxdmh=Fy3~lvuDBZod1);b;+7 zv$qd6MqxdFV?r19b&`~H^W6G;!}MR?>oMG@yAA$=MA!RQwe|fWi?WQb<@UVy*SgWg z{}tSceNBT#rM*L^(u*(S6<>uIrT0zkSZGn~V>nCi(-+I6&rS~CwU$;Btkm{Z=2)`D?RvtW`PxRf64|1Ra#QqJM3%4K0p zKdt=3Uc8}Jm{?@p*1&fzV&P_gVW5tx%`)^a%t0Xlpc${!W zjWK(D;iulgL83dH@e?gkiaIpXxUNgy?AkYj7|WaHF#XEuw!X+2AzPLW5uFtTpFeUt z|7cRytgOu@dJ{XgZoJ+(@cEhbSF~%nx+-JSAf~P}kn)tH&&L5OR@tvP^`qJE7qP)w z_)ELEwPlt1O98lC;74Q1?LsqoP}YYO3Q15v5&jnt$WZ;7{h$6PDoVnOh?0cxFhDc=b>v)2Q?*Az;|6*_nDH={vnqHt| zY>kK_v^T;yl9w=^D)=wD`kyo*5Qqf8Z`{v17nhKd(J~nOP({-UBanFgI2Vp$Q<_<~I=-z)d7DG;+z|%20W@77#s5C`HAc%Yr5+-W?RlEPidw|`P zNYUtY@r}k5xV-foWsRTW&j<`~7VJ%|ore_E%rT<4A%@438gMuQW90q+k6cJtL=TT= zy_n!1iu?jYpR(kY=zn)ysuYc)sy(*NenKRsYixmuiAw@5k%|G2{=b|B7{?HYlXxP< z@gSfnZw7Sk8q~=;?IBm z5*Ef0f!0+Lh(t`^#1hSjTZEa88(*ugr6>At29u=Gg=N`_$KV`eirW5&Bw>mXDJmGA zKwkN8`unRkur5v{vg8nr!NwxuQ_-A7nf>yLT+6>|_p|pRqU8Cq992xizyV1yRWT8= zEG8mCuEpU=|Mhc>!-=dSiaKI8F2PvH>_lX2VNKD$S&T<4 zMQu!!%*2Rf#w|Qvl<;S5{>^is3o>{-`85u2jFdI(k;mi+4ET`mzv*jq8xfLN3PWB6 zX&PA|23rYBod)t3dZIrV}@pS zun%%IR4JKXrV+6I(k>zE=b8Fo3DBK=>0pEO^L!a&k=1%O`>iBYJ4Lo$5$--C`R z^>5)GX$SCg2?R=?7*zo=SX@kA)fA&jSpuDAl!%i5Tu*^*6M|$6X*{GqrR6{q3P>ax zCdJT4avU|FZ*{72fer+b$Pz#=xkyo62UAot#eiM|{FGfp5wRcY zOmJR6r@_U5Jl_XAZxHaW3}lZ#tR?giJqh3fqOjAg(gXw z90m!|7{-_~&j!|?3v-Zp5A*%Qo{et*S7qRVl3+9YKqixcC(0lxh88Bx)B#wO048!h z(7r#&J~%uqI!g`FK)#ifF#%mk9V3d+?|{Dd2N?_OKU9#fUufu##T>oj zQFu%`X5l;!n>b|wMrX1DN5cSkW+zUi0q)3RVpL6}q-KF>>zjcLVa|vD2Ar`!rCX!> z`LijKwsxEiksC0TP#FTo)lxen~z7*+dxd z;t^NSf(_lvMe=O9glg9cYT^>e29wlzCcu2^BTxhQsINpp@*LC?~(LM_E;U z!pQrP9NMqs^I8&_hQ!1fNJYaGX&E^pE>92WKm8bqO#LB!8)^SnIiEg)U87oprVe!3 z9OQmGjHBiXWmOFD7{M8?1seW`Gi+{UL)6sKpFSmgR)eQ+z%ibtj=lAG$8UJg9~W?+ z05tZjC`keXb2P|R+DJ`%9L7|#2iaB)=0sWcSMdGSdx8l3F+5RfktB_aRJ5#+<#-Ro zw|4-aL?F8%piA$8x3d1MA6%lnMP~TupssXl8?rbDV&2)pbF}k^tU>!yqmAC;g4o1(_;=L?Qv6 zFfgXPE@o&E1p25a#?v+7^Wb67Yjj5H{z?w?#2@%Mrl_usG!0BJ%kl0QpSBQ1M83k$ z*K2+z-~4E7z#S6sm1c@K6?h5@(=;^0yaOYVqelRyreg%MIqMay+aGA#kNWznXF!8^ z3d$Ov$AEr4*3zE82Z*E01Noc)ItHGfzYnL z$jx^OGO_YOimD)=NYbx?kK>nU&&c>hQIaS{Li#pO#~Ac3Tg=?X6*C2UjW|^T=0FDg zA@S*GH^8qx(&lG5)D;BW-Xca3$B0A<&}2nya@cHaf`2%`?~LgiS@LN^z8K}tW!sv}xK$HXc34B~i`a637=ax&MP&-K^ zfL}xv^iW-F#_TjKX>l%c@tT5Z>X{A$&maFi9KUi8>t)VTP#scI(L_4>rpOTdKXisF z;EoI=3c}&V`MlsYz_0PMafCsxhV@@f76W<@NlHcyjdz)X?7iloNx`$w)EV(eThF8e z?4tkJmin`CLC$5$FxWl12IiQmhBc-#F08o*;1B4lM0uEp80-W2Ca5a1f7TbA zb9LCO4xsydJqzQ@%)Wu~*rLp}n1fp|(gOXI%~4s+kX864zV-e1U-w*G;-eJExk{?K z*cekAj0f@<4zCIDgUuMH1n?8V2SJ9pNE`)?`44gnzz%vep@d%#_6p#a#dM5(k-?1K2#HIf0zExPW*<`W|#@};EX<5VsJw`!E4{(Oh1LPsmA@R#3gvSxS zfW639NC@|het-^&gX9Hs1$_(;d=Jj8EC(fL<)X}-O(-sT8PYSIgvjFbT2V6fTf6Vq z@!#CTvKfNz^o~rXB5`pE*mF6IDj|!(UVsd(2ljdcOc-YcIu-#F7N){p09_@BeF74H z9?rvJNEvXpPlI0b1@tl4BO>2+ft)-8u$2Wn(d@)*%-Jg#)6g@4^B~s`Qib!sf%8Xg zV869MMtn>nQ7|%D7S5bJ=pi60(%6`hsU5Pkn~rH2`(wI>mY{E_0&Lfi^zbTm2csESjz!Wj$ltE`>wSw*Q zmwhlGAILCSig(A^x}yocQOL;D8+eTi=oqFbJUSH>?>mBuAO%FNK;Bapfcz4KRJC0| z#+!h~jh}#w&8*RQXHPUgB@<jBSx$^I!RC4*xtC;VcYi~Mu)0TW9J&0uT*wyA1bh7>mcI0Fomc4c(ni?@1)7BdU@+gJBSJwe=fB7t{^0dU* z@`{1l`o>2+ynT;2xVY^Y@90u&W@WR(b%O7SNx@;~-MxJFSlQSuvv+dIar5*l43CVe znlW=$ZFppKwVi`g0km0fZD+sS)zf>2yO;0oNkJh8;r;3Og^3NR8Ch5379`Y9n-O&! zQq_1TmqHkGJIo;y;Qz0kWsv8E#+q3O0i1#sRyKkb<7@Hsim^KK72z zf-Y_zLKarm!Y~&h2N&0G@5b5M3pzNv3c5}37IJcN6SlD%kGC7|K(Kdo!ud^_EbQtr zLCDm?N>E8z^;?@Coy(DD2%%nt1Oy;|`g`6rl3Ra$-aEkgnx7q_e$BH+a*X)(o`?za zbBy|14sQkd_t5HV-Zhe2qYVD@uHW;v^xy7B^19#eN9XBKKLeisN1n#{?LGy*0p`C? zA%4vT62H%dfBgLSb^?~-0(^J`tjB%LGpw=Sa?a3iIdvo-`0buJ@O3_Q#IE0R;ooz? zwy*QA6R7)|X9x&<&0&H0^)UWIkK|wBg?oP9#?SOH`^4-Gx@Av{rLH^dM9vVHVN;DFs& z3=C^2FqY%@@8OxCiiX}U1!V)i%vT9g(SH>N@ZsZ#qB4hVT_$&dy-Dr+@%i^Ox~zhU zjdL$WiUYisvIJoGTlC^beT{x5Bt!tINg~(TYbpjdn5fb3zAuALc)-*y5bQ2|Umx)= zV|Ko8|NTA4Yy3E%Wh_M}%)>9_0ary`lDGq>>Xv>B-bzK?vCk~Y#XFbBPaIShK@Kk}yo z-hqn)e_sr2S%xMy;D2B(AL;w=C5=Q$Vw?YdYrYK>=S~#mAf}=mT3|0$uwdRZ;=56%FAGYQp+c@<+G-Ss838A`oZtj&H}N$!dYkO_4u- z=IAyswj z_%H_vTEXb{KP!VCjhCjgUrB@Cn8wfs`~mn$;#Z*GZ@32M(#qL02&J#yjaIBHLSxMA zs~NKLUwJLa2$p=?w}iAjQsr5JZaD_lh?e`aF-O1Sj|26a8Eo)dD|&z(Q5}g>rN4mA z{VfJmj-?2e*nK>aI&;ULzfUV^}{46jgK~qQ1SV!OZ8*Sy|KG4i6@UGSJUmY_KKknT$iaz(;@w0x!oM{i}9Rhe0Bfd!@n8X>8>SaXaparKJ7^ z@R#{lZAZU{{av69v7cZUhS(635u0`o%ujE0z3hTw;9csRNZyb}idRU=VE28{umaB%os zG}giiG36Bg5$)sm3FG7Cow_wlv4|_21D*~L` zMiCJ)L;<=R5|sgVuxW^^ru#^SA@`3pFFrjdkt809Q|U-vQ3J8$^}!~}wStI-(iQ1Fe@mj07D^Xu~IH}L)(u)~905aNZX zVAqsW0UtkKuTViaVR3+k1NK3Qr^3RdeSq_q!G1XeaZ$*0oC8W(wjTKgM}6hnK!=|| z%<12b-R6%E-(f7$H#7%(j}xNHnILm(Z?rUb8w#Jd2D$k~08O$4zGjV7HO$dib89qd z$}|)JDJFgqDyuw&%BxSK*u)HE@9GUcd!XGSq$-#Xh2Qtzxj0IyT6T^edwnN|f0-7Q zjFld(9?sjgYj|PiS`-zRIkYGx!^5Y}UqKZ$b=clR$3E}aUp{c?_!+G3@>O*4 z+D&xkVk6qV{}2|JkOumS?lADPzs>(fU{p}#veY%SI6O^lCL|V5OWQz8SD&e8U?i?@ zU?gW?Xryg4)`Y90r!S#zG)7Wa-;g!d)SNrk#MH>#(rT=^u~UTp7qwQf zwYh;`=D%iZ8@+b?GQ`;?OG?X~0Db?L{W?HDn4miaj~)YL3Ox9I8^{#7+aPoOssCnl zn;(_oJ0NkkqW&$Ar<1;a5B@r9bv+9VPn13mWBlW_0_r11BymrfT z1Jm)(SrE$&df4pm$N$+qkTxQLAa>9%-X?BMH783GlIjAEOs|)KBC0V0?}kl`+JRofel=x;Yva;MFW>zXj?Tj64T@ z!cSa+gRwX~(063J;r$={j3agVIn?(BHx9(Z@ZkF*nR}pfe1jikloFx{-}frXkJJ0g z`#_(Hl8|PDkI4w)q-5X!RsRs%kR?WuftWBJ*sruMME%%r-Vc@I-{~^8;@J8-Obz!eo zfPWJMn;&LiVh{0e(s4hkH~JZ0$5P;`KeV*>MC$N;0)ZgOA7l6EI{Y%6arh*d@{|fX z@U-Xz%*4_W{G8OW-`D%mJ;Zgc9AP`h_CS03BWhDR7-INhuAGJ7xKD@CRXGkvcd-@5vzV2Th9x zKY2F9xHy9B&%6X@<(n;Jbe|(-GFgnEZ)9HQLCR*Cq zdD}WThuPXYxq~0k&DTF*s)x6apDj4o99`Xgz`qt8JT)vTC?qt@)x*mlaMuM-`0c!p zz>J2F02)dcK-;VZkOD^lgEVAK{h9{SsRF+xqCi(Vq;^PQkZgZX)2ISn3n7hz1V6?$ zz=kBk5$F=23bYA89Y}mRjIX39LK>07Y<@aJsQ4!rRYJ-M_Wd9EnBn|#;oCP!ewTpo z(riU-h*u$gqtAab)Yr%Gt*EN5k@Y#i+iyG&&Q`39oLVc$CO?(S07qFGx;AYZI)+}O z#{d{W{j~%gM|9cf=iisbsd6Wry!=l=yxTYWKT-$m9xY_5!b=$A5AXPOKt52Bmf;P_ z%B%f{%s0|rMo#fMgQYYC?SB|+3^rksPWBfqwi(nxO_UA;fX~=L7;Z zQ&dci-`@(8IwBB%lc(er)l0kr7a?Ueow-13 z=~O9s_N z@Q{8OFUe#pUC;yD4%n4m1GxVoGlKo0Sle(M#J!H?$L0Kxmx7;X=~zogur0~(_3^9` z*Z_8Ehy&|!@d`!S`ljbbo`0W%UK+vS>VR#93wtE_8DwuOejOMumkn}=Z}5D6+{_Pg z19%RH#a4aBQqVzm&Y_6K83VEDn*FLg?T1Dtme`WjdHnblz7OmG%Yq} zd*Ao|fS0xIN+z@Jo!rTsJ!kK;*98E80Cd2AFCc&c;LZ#LSU-P;K>nxAh6w~LK7S`I z{l9J5=T1%(01waqw98lk05)e700YDSwg~}%sT33d;q&`{*Rury0KP>ifLIMRMLcXO z?B}!b-YLmz{nz{7f%)IihVEt0V=@5V$;;^Y<{Wi8)KxF((hBYR2d%;PR$y*pR6!P*d@exSx#eAW`>UBlis4HSv|!xLVgYQb)v$4wbEl!^uBrC&?7-~ zD5K}H-FV^9->CM`tFva||EGZ({5v-oW#O>igaCTfVN)g)!v&+B3@B9d6WA zLS29bsrVZnaxj`->T~C3Qac=MgaIM=dRdWwm#5bZ7LGVYRFB@_?yZs_)1+1~5cW=* z(~=F_o6u`));+IEl>NU0ky?k_o!ySrv}h3Q-Svm?;%%Qu!Zp43euPP_L#gn2{Qz}` z<7=wZg!L6z*EWao>3VMP@xoz{$pUaa+_dwqE1=s}l&(t^6hZ~icfjN-Xu*!@35Z^% z(jnu0`)8RDI-Dl#y9dN9h?{?HkEX*R5Bd=|Lp1YmMW-@A0}ovU?+EF4ZBiUGh0 z3+hh;IL`C)d0{2_`VPVEBDX2kEl;Lu2jvrrXK++J4WM#4Au9mX{GuoWpxZ_`WgjI% zz@}jzdQHb9?Lbx$rp3n)#DSUhq3K5quPKaA_Vkx1^AJEcQV9KvVVo5{HiA~);>AX% zTs7H*Xlf3y7iAF9cOUW>lJ7C`lvVLKksh*x1EUQLs3osK?b)(keVReM*xP;uqBn84 zHPn5ulzwuoyksu5Q{bYUzyReBjpJaN<1!bM?-f)7Tx~0+N;KGX$nf#;@Fx74=7$(B zC%!M5p^>tXvwACDtJD}@vlTNG5A-mCk2XPY6o?1JBQ#pf zw@m0y#g?fsTE%M`kf;kLyl^h+>*sHTWblALAExa$kU)kPt}RYm*WXZ1Z!BO!zKHK- zw%>L@fTnr)iQ$dt-p(ErS^HEOvh^0xRY*S;J=Km6X!Yy-%lZWCtdOky_Aejcn}+kK zzH3;ZA+ph1)7&d6gNZdO&>szm>4{b3qL%*z6L&k6EchAjB8GSK+_fi_ zm_ZsYG>}o}L=9jVf_Sk|ECOsR(*yxb;3COS1*dd}4Ga+gqUfzNh^T5=Gf*FZilZB` zDCY#AvbQ_UvjTBS3plyuby?|Cpe|W+xCbMka~A`ECL0d{ zsL{CinCTPrEI*9_bf~qmrtCwJbfWwjm>G5=dm74(V(|WeXfGHis-}RIR<{!elz{E0 zG{_Yt6}>>$n@~sd?Z&#MLzIY2C7v3nSkM_+(G>RqJICX7(wdj#zu~93 zkDdD=o!a@Z=)UKvO`P_>47&EOK0c8Am0o*zmp{LJ0t6tyvhm<;ULMuS?Ba9qI+wif z-Uj#(v5q?LB!^2>OjZCy1`iYW;GeWRE3uoyga%RzDlp-497K;f{5c-Ke)jlbxZxXv z;;ga6TpsL=B61qPVTXN)Jr6)=I_%WgNh<;UMsZ0wX796vQ|H$K0@chnF&?(fddnt^ zDBEK*-&^|lib?vQ zC;?Cnyt_(QtW);dyMxwV*O%3`w{Uwbwc|w$(iLF8^~Dg|Wj6Jd0AUmC9Gw+q4^gYH zxf2r>4~HFMjxpJ@+g6*yK3Ee?FfZU$1M$Cfcashf-aIs$8ZB6LO9kM`cdf0WXj`umvaB)sjjv8Y53L_fOf#PCs%`FPfvD+$nGq3?;}Y z$rP^R;m2f*7wBBe(#}#^aho?GXLK9(6WL=Rtjc8RYp98t?iVEvCxv!8RB!n-)S9eA zdvI=n6@UU)cww6TDuyYnVFR=8V$IBxZ1JAk7VosT@SAygmwpKfDs{FSK54OzBP?v3 zkMNv`3hMDGEix1vdu|B#`v(E146VL2VQc!sIQH>ca@IB0&Bu+8L9=U}_#njAa}*%@ z{V&y5sbw)u{K3Y-xk7xHv+eN@sDBoTw;6L%)}lmGclgk_jEY&YOHg64nY2>~H7H@Dbn6;Z-G3W_M+( zI&+95@BP5{gWwYqU4Z3BDFaEJP7!JSF0S2}@p+5PcW6D*8esCa|6mGr#J~Fkh`yc+ z$K`rC$>YfngQ&N~372Q0aQ=(T6xw!{CT=vqGti}yY?Fr%+vzSOf}&e}p!1@#`xfy{ zyzPx7!-5y!hPf)=Z+%crx7*VweNS{xs$pTY0-FfK4LTi&`MlzD`k~o)h8(Vv09O%M zexp(8QTSdCZ!spKPkOoW@+_c&KFntIB$N1BN31<2$@kNH>wPm1;<%r%cMqSnou1)U78pVbj3*+EFrINMsw~NJI~Pr+U^`x)W8O-Jow7IO z?c(dk2rs>L6jbFn;3myT*7TG{b3#qDP$U7}a6b!3dM=6(rNv98K3=Y=H~RF-@GlZd zAa&Qgb{@Wf+kfr;oGe|tckXtPKkhggb-&N~*TK#bHCaLo*Yo<(&$?VxU zC$5tc@7Ktowt`4&yr+biV**FrX(%Iv+zE3~=b_)fjUYY~>EonXh5ANAolkp#6~8hO zZ!sTza&gw?NV%WdT^|HzvkR3S3}ktyP6}vj21?ii3gw% zY!^Zgdt-C7OIa;wO~Pw#AZ(3ajKUz%W*?4u&`!(XsrH+=D$=CU+o)29+`gKvdN~wl zY6#W$@SJ$`3?NM;M+4-PpOkYcFty=|n~r&3Q#K^ws+P3yjZ=QFu4Z(K)E80j%pp#u zyAjrZ=DI%l2{1Je;3gdG&MCQdcp4IZTn%wm6rS1&{O{&WJ9i(+gHcGO%9_EI`r|l6 zZ4~P)1uaqg%!j8+5#54=V0A!-ntBH%vZ+yp;S+tg%({lbVDK=$3@&gulHJFFbR$MY zz$!8Cja-jkGzE!p`>K>p}fxL^z<18st&EI`G1^2!Z8^(c~toaM5SqV?fP1* zVnmAAWwOn)h+DkmwBO=l;e9Da<@tN=G@h{=q4j##j>-xA9Qw{N+VYj0v{^zeGh)}q zz2Qz6nNVYfp@^^i=E|QEadP(Xj*kmIlSEKxdPMqeSbX5SV8FHwFONRUQ=}Uj9At5E zXM{X|5S{#YkHxpx7ApzSOw|4 zj06?EvQ$BVRePyvE42__SK@AJ8m|EQv38*({ZnlngRkSjU|Min0B1U99 z!@RHENeMYnP=Lq#s){3$hxZkV$9$JZ0z;YyTp2R7d>?0_9zzFLMBTwAkhXhX9gZ(3 z#Ma4~>ti2Hcopb+=JgOfz6e(lntIr{Z8N3N6x&Qa0*etBcjG!3u~uibKsA%fP!K5{ zLsU&x7M3AjGALsu0tG?SqNRCm9T*Xn@ndzRh>0FQn#eK-Vx`0q z%O-M1SSDb>alWh0%V01C+z--d!Np`?>L#_gJFmUZe(H~gF7C@o0-#r+&U)nP$+*em`4>^&^(m->lX(Ip5v>6RKf421%G-?g9jcRLfL*ZPW=;TTa0TB2akV3 zDyIgI#;{X;8VY}3&h2nTn5m~hsDml(e{~XsDMFXX`XiA&uNs9z+}nweN$lX@_c`5KYOrJHZRfm8js{x1{gH%v6gg>HB#)C>+NQ_rN{h-b+* zeJ}e#_Ls2*Dyy4LT8bb|CJ*UveL9VHY+aWV0zjXU>H*6(D6%5heoo;s7sqw8tU~*( zE3nu9&obvr-{{pQMM1`i+gni~amPk0G)a&LJXWDnFza{-W}Bzp>TEY?>&r66&_QE$hvM_{GG4y2%1lH?|YZAk46_iU=m`zMpU1%0&c{ zzij)imQ(uM`2lOz870d+#9P6JiH!mOo;GwwKl7~0;h8m)r(-xCqI)Zp(Zn_Nm5@3vo>Bx5_FR|+jZY}g34B#9_<3%6qxYY#YdIYb;(GJ>3XD;1UuwMO* z{r(Z1P*{~;hD*E*9=$QXmowZz6TO+(8bDjZ@ZfWq_URP(^VF-n0a>?$m!6IR-J(VG zRe#0-jA)s{2*bj!iFh(yl}U7f^f|Za#QYg0l!7kX9H2xe=9cNP?ILG11I90{`s|E^ zAbP^WelUVjEuNV3Q-Wd_J@h-HD}>GccX%dS-}QUdU(#4^)B;;u8xX>G&e(7{89@uV zaPsH|tL>}Yw9l6C2%b{XEro^oCkc2uEgAqh0r0Zxf6fCTrc4*17wJRWVT(Zh%5QT)wO`yRw z97{Ioc;pgnFS)v1sAURmP@%_6nXch+?*U&i@>oEPF=P;}P&QnVBfgiMheS*u;M!yD zni^&8YSK%F>cw$!&#g()LN~-`zvvM*769&r#8AxE87BQc&9(*PLu3}mR9dTMTq?&0 zt7ahwW^@(a-nY?q%DX<&uC;&SviQf6KDy|?Z>69(9wCxHPp4Xyfr&(Z zS~<_Vh=R*nbjoIZnlj4QK7caD8UFoh{3=`hWX-_#>U^1o5 z$uXuzv>R60^;zUk*4JUGMg+|<<lIAd_2qHxJoxzJTb4X+-?bND&uGYl+r_hv2 z_2X2y*4c?qH#Mx~OnMmKA3N*yTmWyzW&*oELP&(15USx!LtMhH&%tHD!~7;=J(u~? z7gkrpv5p2$Mj!^M)n$_2%S=?V6Y%S6I}V8)QN6FrMAZ(=?!c zvc~(D*jMErNg%D2!p0Brf)QHuxPud}V-f1k_p6VO%NHD7x6d z6r>47zu^vwT+c#F@5aS3O|7D*4ku|mWR*}ajmhN>RWU*g6aEl?QeZS)#@Qkqn~nHd zel5kNxJA~csnt~CyC=RD>a+#a0Nm38d%c)rUlm)tn_^5_J^1GI0FE3!G|+}nNx zxe7e)KY|nk@ErY7hOOQz+hrtL&Wfk%*Ky&zuNwjk^e>_>wsL;<;^%7-w1AI`zz|h$ z*e!}=t|e^0tlKzvK_b;?NaN=D3c}vhhBvoSI@Dn_ScztIn@7e#m!fZO*UodL?mB$T zpCsoG!^Hsq76~K}JI&kNZp1u@SKEe5wJvdf!qkvG!Yu((E2J|4LgJ+Buq0E%^608# zBM;_v+uTsA?uIRK+p#UUC%f!YY|p)iySL=Dcs??2dn`F)lihqF=9`Y5^s4W?H#0cc zNDnrNOps?RJQEVXfQzzy`dapy&VQeArQOS69W>F{U(Zzubfa_I+)A6N%f>Q~3f}+1 zU0`eb;oMVJBZlbEt@yF`We*B2lIRXJv;Go2vERMvt9*5;m>()ldStN@d;gQG9{IBx zj`~gl*8Y9o{1u}kP8{mhJuNS;q9|Xurc8cT1Es``s~;8ub%0&JMq`@M0Ds!dh+i45 zVusbv4$&Hc`E)$&g>3miw?Ce&dk3q`V^{%h&eFkB)raSeNbtigDXaToYhT`j0#_jG z(is2Y>N={qa?G@uFk(!*n}?;9MshEVTG+W@JFbM21QTAIJb#5c%Tj}Mwpk}FukTfC z-xCNk=~O@{g8|{=3-4p$%ULCMr}u+35-vmEw^2Evf^RN^C;M9qnwP*mVRp*6mZK>2 zeRbG{@f4_>)C{Hd2;~JVUv;f@AORE$GtGemI)c_`NkQuV(v(E58Sd-U_3jx$1~$d=T9uYqI9Y zQAWXO+Q<6$+qRUHaY9g6kc%0-sjaQXlRz-tE3J5l%%I{*kFT+ z@S6-kCwu{AuI0Uvq0B4AY8Hr@B?19TrtTl|81$;s4l-Uy@l0*!Y*fGfO={xi<`%k| zpci>f_Zo$OQpe_NFvQAeYzVwDkJd=6$*YGTYIatdjp*MAtzA`88vu>*{L#AIX^TIz zfGI?6H_$9y3nyJUc5m6drWhL-x9msRxUZ778{8k`BvW46*KkDDv9Dpv(tOX3Y^A_a4qaK7%j4bG8!lUnA%VjKyF?{WP&oAKg@>(R$ad#CT#k2(m z56DMe||+05vAh1tFt8u!0i&Zt??uR{Ap2jwpq#Zb?5 z-4Mug22jaDDl(=OHXLkAmR!D3-HqgR6A-1Rr~595uSI_TjFX0E9PhYAs0H}}{9oN6uM>9sE=E?a67R5m!`INw z&o7pcZTLg=>8r2y)taeRd^U&&%v1B(^sMAKn*1<_>c^jxK_~eV_pG%6NbZ$PqsQS6 zNj5&n!pe1!RIIY-?i%Pby&LJc^8DN-hy^ybEPIMz>8c0P`M z>iW{Hj|b3dUFfls%Wwz$t>;=VqZ-g>6&gy&w42#&kw+qX`YDYJDF93h8pu#8saKO1 zSfEcspWb~@^=SdG@c_F$oQL(_zA0VJA@=miJ882Cfzs(WF;U%sxI$G5t;p%56fe$- zZ?c`BW%S%+tov=MM3C7(V#V_Ca{rav~r+NbHmFJ+Q}{|34Ltt6673pYm*u-2um z<0fgNO-xQIm^>aG;T8+Y!(6c$N;0Ljxvby5J#euBsUdOq*d%|y0@;5sNUyZBjj>#C z(rLN;P76NTUAGW)AK#|*jLzYL5VdKG*<(QP#RmOPyi8GBosHJ3U4q29xVWN}qG_VS z`rQVr4aj}>zh9fK3UMArL9LFi?q#~p^3=pt2Gujp1OG&jKB6*Z^OX5hG z)1G%K60d&>=Ge)W<@(qY6IW%TjSJjietGdtjb^QD(^*vws43=k>+@pmlU^G z@+$8rf2)^SH-Dg(AdOSyPT)1qv!O{;q*?eP5>4N$ z6&+-0;6$V3PGRubW%m^U;#bL&g+Bc$a6L4A?Y>m*)Wv;bbt{tIzPyUwu8;S-rP^5T z9xZ+}T8E!7jgMHjWVTO`18Mt|cXnLQhec+o`iDP%tPjgN!wVhM*wJ49xpwqJ8_*B= zP%G?&=@uqp1HXAr@YBP|J{eFWfjV}ZnmE9rtqsgQ@bhGyP01m888!yZ?P`|ytFc`Zw83*`5sM9Z1&(MA{Q$?oMaD8(kb`yp^Y=D;!Odu1cBm1pAL zU;9)j-u$$-b_p~>`8USV^|Yn$@Kp83Kb>4XfPEvd<9lr_o}?>}^*9-F3BQ?#;b@mO zZoDDeW+YfHW~C?`uoYi3YEW6hMCDd|jkG9w+2UsHEcpMt0EcJyq$~5bzjqvq=If3d zYEWFXP#i(1s+BHnvejh9VD~pKn|%|ZR$%wTG|dE2qMLJ99)sh!cCsozS|#z{B1Lz* zhUgoLKwsvgu?|X~Rq!x)Qi+|)$@i_ps%_DzmuPu3KS6^RLss+M`8P9`!7`{aq*?%} z2~d6`cLzf~7Eu4?C&xu*RX93*=DV&z$Z{QGls-F|Sxh-romHe=_nWNv|6xB z1=W9FpRS#r?#ZvL-M8T@k4=XJ*FV^?;2IRNI=BmJ>Hg0C`LdNO=}7<9bB?^l@#u=rRZ zqY|GoO-0B&ZL1aJWqWo19RdCq?4eM3+YuzR)4Lj+t-xH(5aJc8K~! zR~qAFl%cz*aB?xP7IbVBnZqBj2a9rAbrsF^{9|>zxs5F%6Hm81KoioIJb2kEuNlWw6!BsI zAAfN~H7N*|Lz{6})k#W1VD9i-Ee!RW9yaSHW5x&+W4^gC)l_EeHiGTH_8eY&M6#l) zi(&Iy4Pz?I@g+zOG-99uS~RN_TJ!=9CfcB2LiM(`o}KFVEA4GP?uK<$)Vrb^vFd>+ z6ITH$NCAqd6ruw2BWM^|FNtWr57zJ&-+)Ap-&FZ%n3t$I91-s`IVLObCZeG#dV!7O z)Gx0lZQLp>g(qglQ23|)^EXRhYDX*Pd14a$bd2TCR%%rGX=seTH24@ZKV_tPpGE8> z6n(D6{Np4oo+I9IQG=?H%CQrDHgWSLbhCKWY8Lo|jfFyl408JbbAec#GrU zF-oN|`hxOhB#v!0SQ(!t>|LmwDS$M~%9BW&Kwg0H`|f(OB3(l7NkNkk3Qm6WR@3^t``E*EREJY1nA+cdEmuFk0m~1L751hU zRKy3%O8e}^@q8lzT~WaSCdPEh=Fb;xX_rYYoO`Crg1GvhKiC!zukQ?^*`EHbcg8sp zlTyq=affI4iSUM!kR_l9az_Lb$@$;;{5wv6%J*51fvR(?9I&3ktMYFT$fa6S-MeFa zU4EnqcpY%8`cRI7dZTR0yhFel!Cl`!M1lqd)K${6!^nffD~4%oNWUveI8~8tqOp&o z9vudH0GM~Y(P{k7Xm-%zvp!{T}8 z$@?H%8Q1uLpB~NZ{haH=T)kU_Rr(1Oiym{t&0@FaC`^%QZr&}eW=vtfsk61HpA&?7 zPMi|IFoTbd`k~k>B2tP@UsNXS`s5N<`ka+9Ws)`{O2{fGpV2c3APdle`Bm?b0rK2B zCV$Hshl6@XuP!PuiHcB^H{ zFPDvvs*FykUN=sJiMx9<`hmi!L(J&~M9)2i@rS8RPk=Rs^PdB0ADGqdM%3$L`+&+h zY+r&;dW`1I;ynPOw*z8S6hVQ4mj>#SqROA$El@HX-7c3x*^6Z^kHb~WqV6{$(dK56h-{=TX)JpNzE262z=$|6qhya> zHzOyZg8mKPChCCW&1^FrS;Cri$L@afOm!Q2?;Uvg%Yt+Z?d&keVuqefRQ59o%9Lb| z;T%`>6#N zc-IC*V9A=~l1C}y}erlp!O}P|T`O?C znE?7p8UC2;v5_Kop)~8*%EXhI5#5&sqHm-8Gd(kytzAQsXjxqyOtA<&Rnn%(Hkd2Q z*ND0P)5~#$zA>Io%-+RboQIpCT}#XK-Xu3?#XV>5*HNBHS@GfaPakesh7u5(C=$Bi zSLvf*>~bsG6BYZZju?a6{K7i!Yg5)}lEu&IXg8HvTq3&VU{}$W_!TS!%{mAvASeIk zvzVr{?ib=JJocjG&2tzAKK(E03V%DMPGWYuKe+3Zvr`)1rPD?W`@!C~q? zrAtPKQL-Q{o?X@Ahev+HpS9usjhixtMO;)OHhcEThj{h-?WbEjm%A^+%}e`RLV&;x z6W{qY;A#HwpIN;br#-t}!vK1qBB6S3_zuHL8xU-mmNs{CLbADDu5Ep2rsIoj-P^AU zRw}V;uEz2!$z3k)Ls>y z*_@-pkBZ4e-KLde+qG9W7acRa)((sIOZ#sG`QwR9kD8}tvzhzvCoif((73p{q9c4q zshe~oNb73^p4RVAoCNgv6s%a^#InmEU7i1izFr1n>{+tWl%^{1yblfk(CXChEKFb| z+ZuLQ@^aNMGIUAK08Qm5W_8HMQvO3cz27Qz@PnHJ+j$!ZXcDxB(_N7E?~?H?39Qce zc$c8)78|TKM3vGEpeB_;vDapr@z(a<%~hZZm~!QJk8hzgC-rI9ZO_72#xTJ`sfAMn z@Ij>Un?O_lln`i^U%fhmD+MNx=Jj4nV?P%=s0y+uGMb#0oEL_)igcCC2pxiM2EBhQ z&v>TBwNjMwidCvJ+UFHmXAxVbBsX}QYlh%e3z8nv^xR-}zCx@Ct5&51S%%~uD;jDt zH#E7{{Mg0z@;oBi2>A7#k(AO-I~%Wu%%W#$iB8xB4ggHh7`}k+Z5Zf0ehaqchw6QG zF#r~2ZK{uj^q6Ipq@c9}2UqP^^_GUeeqG!9Avc<%AfRd)MTeh0woikRI)NOEl>Vl*i?Q&VYi5`6(UbGU zGZ4LeU!M|N!ci?k>*a~*Mw7HIO4NFf<*Jf?*-R~twyIcLtM#{xRUEb6z{7-gglLSc z?fSmsUIXK&DMq8d|E$bJ4w9W>F1T?)`=_RQW>^cyi5RLlKzZDHVf>1^^l_fU-C7F& zB|%c_Oqsg6P)Y6?qJu*{1pna-h#t8L-ukWX$K;KSr@$I9Hm0lNgk|u%Ht9eO;-)`+ z!|*fsNN4QO8P^76;2Movb#5^&V*8mO^J=xzHtW?)&#hU1^elxJMFI8rZ4B2qX$T8H zcXjjQeg36g{)J2Mt!npeH~6Y_FR_d6Tv1X8`-fU@WUdUFiK@nN5vDNF&4LTpKa%owC* znejP-;#Y`E?ia-hwprUwEuW5LbjA1V7(U(gps5m(P_H?Bdy5wZB`f?S$ z5D>Dw&vjA1{vdi8AK#8ci8utS#!PQuskde8SS0OW6bFC*oFm3tp{}JLbw0H}7aD5Q zn(YSWQt;VDF3pc$y?bW-3B$~Go1*=<0GF&-Lmcl}aF_$V@=R{>V8ei2mWKT!^1m6o zsWAzjb$R^jB%y&A^fyFbw+@Y*apzwj2L z1KzSEJlw;H&F%9Qxbu;h?Z-ayB=t(p2c7+ZBpo}0Z@ZNECDp;17(1;7=9>9?4W5_2G#XPHY?PFMrOVXHZ6u{4PwQ ziAf39bfBo|UH$I!?_mT_0**spFtUcGJ>~WOoT5;IzE@z7R~S%tWV(5Ck+-2^p_Ha| zu*}S-OykYGOt{T6N*E9iVSfwWILYomu!Zrl@`^`)HfWu~Ga$1(xfG2Lf?#)`*x6!7 zNRQos+X?MqLJ1I5CHXkFR7#`(-hns4GE%^8vwq5sLSvyq68Uq|e@H4|l^T8?vNptg z8C^513h+Hf=pU4C8hjlMLb@)datuC&=#+ed@eb7IX#IMdLUB07XOVn7ez;Qu$C zFrtb%0HRgu8oY)3titt*N!4|S__>)TQBlgs!~Zfk0HZ=ZRb_EY>m6a%_*xTzR0DrX za^@Cou%87e%@I+N7=GNrtJDex`TT_89npMbmAc=$mrLO2j+2NMV$R9aOSY?+S4& zx3U=Z<92LbdUMpdhry}x-r%sgss04A(U%ghGBdj)=^KtMM?gd?7$OYXx%S1;DK*QH zdu{mH48=`^C=oD!cRFdk52fC}C>+5$esG*$%r%+n!2-h#vKt)8B9;h3RIc3qukCj+Q6>L_Db-ocPJ36W}O|M z-G3zr`HHeIw*p2=-s-HWot(+;XHPm^fzROZIr#J>JZ zih(UVzLJ-1OZfe7`uiy1hk13W-RQrahKZk_VLt!RP*f*LabEd)Zg##iIS~zSF}BowMSMP(~LWOzG{T5Gkv{heP{+Q zdkgs*K>FGIpCl@F$!WcJAH1&Di>r<57oGRTZYA4Lg+hm;Idp7Lne-a;7J5!oxHe84 zmEAei@MVmwR|D?BM|90+XBF=fJ7Pz5!B#f>XkS&m#cDX_zqA|&JxaHV9@2$X{P_er zv?s+;$q84A{sE_qjn)5_vANFdS;~~4fHR{bwIezic=vSEF5I=V>a#g!WaK08Y{ls! ze--+;g%0Muwe(nv-)2rtL8liT8J*D=lnjn1f*U&AVLG;7s(C{KYV(5pTOJ4gxKBV{ zNhWHk$B82P0eHE{{@h_dn*?d-t$5#Bz`8UdnxF7eCyxRY%V|`GVp=z>CcT2?X~APA zL?}DS2^C$>nYy<#_udMkr$14IHHrg#M%)|2C2xSs=v^{60v(!UG}%TlTRrzHX$iCh z4xPQOuU7h-G$jJlGveN29uzF2Yyrx2`PvSH&?{4!lj#?SfKjrT_}I6s&XKqG+1@7O zgOxsp?KZL#gGX~}-hXXu0-o9QaBz43&LB$;vJGtbXf4@o@h~sJOJ~SwTKZ@d z?k_a68jE=sn`yOdI?fTU0431)s93NMd>cWvLw6J}FZ_6f(T|ouQ8^MmI~PZLEi!lG zR&-z=_}OXHQs3BY>r$nl^iq`?O2Lu1Vx3?`-V?xwE-pERrG=Z|42m%1%LKJZL4(q& zg{Yl|RBGqUC4sk^h)Z2(x%?mh%;>L3n?BTY27qs#y~!ef0?$buz5CT?BevXnox6p% zh@(kK=DjRnr>+q$_9Mezj9$;yRvn`3p(t}@X!$#H-F^nHXp$t0rvaZGe&oSg4m-tg zH1$Z6Fao!xQ+W`IJ-~K$Ade?U(KSJV);eZGac$AyOJeWYhp9Ab$QkBcwZZTrN3&ta z{c^7~9~-Vm(liI+?ous9qIknRG2}I+THZabT4}y!)6j2zJTdzd(|%EL5%i7SlgZjO z=(O!9{F-;8&avchlil!dVbeYGvN!Pqvp8)L>ou3O;wm+zPPo7@weKLEf=u6_#}MJYnTu6wUz!gHK9|;0;xe%Uppn<2%SXBlTPH4f6fMosW|29|h=5m5tW_VD z1c8P2b#|vy13-llkY}G;51rRu2a6`*OdFqJExh zrTG!@@(W*%sms<+l!?3XZ9|IV z`gtY81L`V_+(#E$Pg2FH(aR6{Gby#WyC#&Bs1U{CYKXpTpg?Xb|EZYJbYrX}b8P^< zXTwaYt#ww3fB>jpZxQ94;z0nG*89#r??0hq`D{>onFY(C>Sq?GMV-ShM~r$XHZ(n) z>P00aLFa#u3qkwqcJroff@qw728t=LTdgJ#&@>aUR--78T5!U%1(FfgBsPuOR*b*W<2t4FH8bgsn^bH zokutBgAQAsoiq>IopfbV+S%Zr3+fYY7v8Q|c6pqU#kSEYz8P>I7PvriRbdooeuhD5 z_JrsmgW=Bc7APV1awivAGXH)nt>W1v4mBuqEx7HkD%)Q_v zMXFIm)U4Bgd%T|fWe_X#w=VB03MDrzs5xNfcttFvC>@P(0>^VAM)wN>ryPbad{i=7 zyy+@3h3WMJVfqvlw7t?m^Tk|6-+h9{TI)3{&w{?(>|K*h$oy>Zze|^YU#>Ffd)8W= z1F+UR120=z63Nu>*ud504lD$86}vD*^qB5Iueh?eM|F+}zpBQ;-BF&<3oRi$(!=d^ zl13FGIVuxY4Y|DTe4Er6!a&rAi<&?a+%1jEVMYw;>E&{qf~#)Wkb#IxjyNlAXA5;v z>r0Dxw)wEXba&MP0ydMYi$OCH`z`&_TiHTNje9RqE^#ecNv2NA3UuP~mUD7dKRuYT zRfN(RgMP9>oxH2PY&TL=->dPWP!%nPv!F}72FmA!X`tt-^ET{B8AzbpPU z-od!%l^QBhb{SG>5sYGzt}P6bW%8=ywGz5lmnrco?BXk7{?hrAt2 zJkiO(?RwQ`!x@e1KRbA`BAY=1(X%;Jg`Fwmm1)*~sL1&5KwM1xp(G8C=q?a_zUKP} zCcw4ChrJU5{Z_$eRU(KR%DQ*?ZSx^mnLqHfP+d~>{>;p~aKh}P6&%6Ka&^ezvb38u zcQkv`)5Px2%{CMv0ujv8!GGDY1)!~}hw-Y~{Tc7y@11E=dvnqRgDcQ9Xe+t^l4qli z59-4UySs~zSoU}wo9Gkp&m%c-yK9O(`d;LUNJ)3#Lt~4fx%Y5Qq`l{MaGQAA)JKfT zb+xSlaeksr4US>6UbasAKilw{Bm1t(B6@3G)-$4LkJGbu>+d$8z}I}v>&ADUfX49e zthfL}&;BV$k>>8cdXH7)Mc_p^l+C0NC%}#7znzXR^1~{8%JY4ch-H_rbDCyANVm}&N z7mNrOU+I`>|LqnaHm(RWnNQPw)sRl4p4aX4yZ!yHf`xcz-298eZ-W;^mAD1YuolJD znOwQ4pHH+#2)m!Hd{_@d+I%ww0KPJLfYYDHR)>)VhJi@%7t$Jql8Mz>{*cuH{H`nKv%Q2($j;v11Yc z7|^}|<4}a1T3ee}tRmgdo~2tla`N;H>n%GGv5&3FZ=wn4L{omy{J4(*{PO}#hTtZy zKiT}Ie|!@HKI}>lzK+I-ev%mQY*m7QFj#>dtN3{Mbdb-<55C36o_puRgp9p~yFy2m zVvI#Cl{ErK2OhteT?Uu4@Nx)%zHj2zA0VR(SCZi7qB$;|Pl*Tgdr<9P_6;;@+&`L8E zZ_35)n5zIS&T#4qFoW^te%ywuaxb}5gf7T{;T&Bh*vlB>FL;Nbr+$COUB)deGQ1O7 zYYeddB-ZM*@xk&0V|C6Xi}mN)OQ%72a@~yu)1UjyK)9@E2kW!;tx;AKDjoliO6 zPyd@j?(sfAoHv8b2=0RurLs1~wibjGP;)bqNVBQ7g(^UkkiwjMQV4@R*xg*b zR23C8`G^KO#>8p5yLrZzi2*Pj%;?4-(?qx2W@4P4#&^bF&IP-f6w_KcWV0KLB-7;2 zyU84ora>PDjDXb0>F<2=4UBGCY>lsL<;v+}(6=)*|>jMvW_F4~QG z>Pi5xTAmmPxfQ%UMa>jNb+{IZ;86x6%p|HYM^D*F7wvR&kgILjS{odIVx>k198t#Z zL>wjA$=iYL%xzuA``!&od&YJ8-DDhg7vfSW2d_Cpt<$ruD=v=<)@4EKlb)63PKp8R zw$N-u>%Vd?KJ#{E0kT0H>9gIQz?ZqUh>2N(r}cMJrHha`q`= zI(qQUZguBQ4#p#U=&er?l(IrWpt6gxdZsaW5%ntLk8M?{bXN{BptUq!Bd}SQA{$45 zW72DE2+DV3Sr-0oeRK=a3E*QeWg-KzK+#|t3EALlz+E@bv7~@U9=?Ta-5e*t;kdwy zpis#4QS&Z+34rf>EYD_oBb*s<)$NlKNdTv3rOYqMpWlI@7H zE4HLalt_ReNC7040f8X_3}(Sh_w?TVmV58F<&SgDci&K~k~J8}?5ZjB40^rqTh95N z-*V~dW6p)Lu3N-JY%5z9C@q0^Wm!@RPfgR0=UJQIM*ir89pRY8#Urf#w7h>zVi z4Z5C~Z{nG!ltR-q1YAL(ZCe`6)HP!CNQuZnB;2u>&li}_mvpPg2wN7Y>jr(dLRC{= zp3N*1NB}apTXF$oq#QdkksNr!QNahFML+A5RGCv3EF7upid%vq&z=E=ZnY%-LyEZ? zan8Y53g{pQ8Zfw5W^`WqVq-1$>pCwwkrNC5zN|`2CljO;u`$~q2jMu**A+V~iy9EX z8aZlQ(4^Ji3ZN`lSfmh~hb@Z?R8lx7_@*A#;=qY6Ea9WXphT_)VSPl$`reEhupyQDrRTHCYQH+r($8>2>60ypdMD&C&QRV^>jE26? zmy{0yMgfcE3iJ61hQ4QDII;b>MvC#eDa!Z!#z0R{3EFV=8NUuiz$^=Q@|R9 z6b#x)OQe~yL|Kshw`yvrWKb5CMmkEPV4Eu;1JMmen<62iY3ht-H*Jl=Qp&6?XhE-* zD+20>b&sZP=~j!1+KCttL&9RQz;e~$^qEue&Y`F)zSRe8Zl1~uvuvttH0eC4z$6Gn zK)AA;!a0YgX?W&L0ik)rMH>6jzg2nRO{Y_cV{SW{0x{B!7y>p=o#Haxupni{G3G>C zsj7QbH2uAV1G_sOif`hwl|>p&GXWGCc0el_MP7i+l0sQFu!VuR-PFA3W1!8i*i53}UcYWg zGmugu9=6PELqJtG`KBst0Ush#^cbAS(a{{UX^RjU@UsOxrxC3iKK6Z&*=&YY*AWF7 z1ZY)tjh+KSEq^Yw%2wfy6M*Wv#;WU(gt2FBei1?;)$?$o4AKJX~>AQ1U267S*Y@Cd7}M@k-LVd1=csck0T_rLvLpL|Uz!mlY2=;uHF zHip)|blQzqQ>zecdg)Qi?E=!6gFN%zB(Aa9g z;n6V;4v(6f2vu4HA@R`H@tOZ2pe6x`WV`|-k`3R2CE%9CBOqlURY2Qr)vb}Z2q#HM zs7jhzD4}m_AThliF(HCpZ?#5vDhkUH>q@3cr(=u^ff&I{`{Z$@Q1su z{~tq)(3ZUUC5Nx7sT!y`X1XlPTYU7&qJY&Uv;mQUY6|{PhSPr-r7F3qkWx1#w(Kqn z7^BEP&J#LYbMlO|6o&_gWF^J?`=YRDTRL!xvLsIcZ2)dP>WZVW$|`TPx*{Wps;X$- z+z*(v6KGDPsme0XpM^6oRY+YEH=wR+h}5*ID%4d)CKSBEz4zo%kPnb%ZHBE;S2cl* zgTr((Wvzo{`7M1-?*l)tihdrgp^T;;oqs+7@~6`Y-P)Q=R_T!PsH+Mk`zI=`=-_Y? zZys=Xbb{U8eeCY;;^xg=>>nI31`#tATju8L9t$#Mkx7Awk}?U217C$jNH;hA@qyBg zgxoXgA5!M`rm^{3{;#OGAq=rxjPGobA1~F19B3&e zjx-~gd;ZuEFgVA45^>GiUBMcIuJ7T7;oP766Yu}zXFm5-_gd}I*AxTLz>kZ0M~q;n z7=yB;n?$jUvn)#}t6`NzQHmcuozB`808?74%0iNLn}$&Iq9A*)thh^w-GAtYp)p|v zQyAu<6X17rbW9aoirCoLgmVL`s)n%zDy_2zK?ro)o046CKorlKZK9p?DD0R#)NnFx z0x)SCtk!@%?>*%j>JmmN^uvI*osdz4F)#)>%}9brgZIQXOF&E^k0DcvyaCy%Cs5q= za<$5YqQ38`C5jPR0Wku>d(>48Y6E)0AlPifD$8TLB_@*zk3&0Xqp`8Ei4f@TlePr_ z%ois(b@~*wAueKbV}`CLa#c*^9Q?wIm)MgKn9XK5eQFaMn;U4F8iAwAM3zg!ry}?7 za{G%&h^VvRNb-}t20AJD$PEJm~%{%{t z0RH)FwMSpG3gDN1_HTdC`|!Uw*+9miC@K`T%(-^}vEgh{z$gn{Nc=XT>~&pbQVLO1 zJ?jHVi(i#=n<0*AJ=Rd`&@-A#4ziSLTk_cE;NXzQI2L6|w=dnWWxj2#)p;Z&R9poE zV=1Cs)OR$_qF@WzykfFJm_);4E82L21WoeHy&pP`?v5x*Y8AQ_rOQ}j@=XSXd{Y}^ zXr|3Lh|J<8JVR#LZQD|C2FM&W1dp<+h@0*_CX)$;SSaz@XPyExBNbOr0QmM2%Qc#P zH%&_il(8r(8l5$b_%qTWDj%P-WRBU4%1upZqe6#?D4{5~f{7llO%F?&Y(KnJ(99x_%Wink@%a-JFhNu}&z zA>U6@tP=k|!!Tq6(-f#>rO8f&HO$;(tU%fbA+{+b4V6Cp!S}!Gxko;K;o@ttPhXP* z;2;0&-!72C-|u_(*0L;+7)iBOXF(4ER&>+JCM)QJ?Kb2tAcZ-ZSvCkfW z96k|afHK@}uqlR&1DC56_V*9yhAqf_sH!SdrG+VqJYf(oJc*YQWuP(Sid!->%`wqP z2q#rlWn>v(nm#WWYYc|Lp>5i{u;gG2VYC?=c!UTLy5F`fr4SE820CS|S5+0|(p4Nj z!d!kZpFahPx)M)(!bmi`*;eSf6;~%CO}AqFgTETJ7&RR-N~;{eBE2{;N~7D!6wVK@ z+|D`YDBz`{0GGIyFzh`^X1BL*;>Okv4i66zBI);=y3VbkU>-!@mGPcrA`pX9EWboF zB+Nn4{9C@=*Oi^p*NX+bwG=XI*qcFK*HMV1)<8&~ag7jtmS+n-&<_Kwp*11jKY_Cm zh;T_?Bhk+;Qvx}pDVi+`-M#jH__IIo$G+>!t=yO%oJSVnU&!<^j5&|U+*G)b85poqIRZ3Ggxi_tw zhIr|=$hraQVMmRC%&m(&4I!VzuJ53&&NzkS{~4z6mSx2UF9D$m5!M)3Lz)MQRoB^} zcs8A7e*JQ}#Pu6nc;)&Q4iAnvRfxc{(GIPI#Fq;ZOk~GYt~*HbF+gQM6tYzqAbbJ> z3>CX3i=va>#%Ojb?|qhmBaxA*92!1Sbwdn6ih~CLV+&|bPcDiQ!_b2&+r)+_WD`!+ z5i+JB(}AKa`QRP^rLT7ZU{K!Y%_e+JX&d9<|N};p`B*arR`C`_g zEG>|_s`F`I*A;C%Mp0#<$%`lin^FEse0ZeSJwoC{T(T><*$@}B{T<3sHIxxX< zSXNZ}fOay;y)Ri~M`&e`G_`gi1k_EPd*h1d>5=KTbzN~T0kb?EMQ{NM{m^4;Ya3hJ zJJ`9oOP^C1o?N($>ZcfKEXZE;*3v^4XB&B6CJRX= z)D?w5v~7#T^46wlGM^q?YFA~+WuO7H#F~%x(uymb7-RnYz-A`VlPIRCYnmxz?0>!U zC@b8>=5tdNjv>6&VK*@HR%|YEN(m zF`}_%{5=!{nt>}n!K*?D+5bWqjzseYhJIjMJ3zCH*)y?9s#@>;W>FNs^O;BPY_{MX zJplgEKlq>95d6PE!mKE3K8-6_wsg|m5;S!S=P7SaDaF!XGVv&jDhqlP2Vjb_NJQj?j z0Ah^NG%bzW__Y(lR$$_eVOQOh5@ypWBs)Obx5(nCx~_11e2m3ng_mExhW&%XEN3pO zk^wpKLO`ydNLH=$;hR_&FgORx?OO0Y`vnLPD6cgDCZ8` zNN1}{Bn?=Wn--=ZLk~3uD3(RZ8`ESUiWUXArbPDlqh7VjEr59QiOX!B+Zy_shlhta zIywOqfl9WZMcLF1RUQeLv=b~B%S>7ksjSSSX=9Kw&akds4g^u<(aq1}z+&{_58k7y zXan~{kG5@de=ajx_3VhQLxC%u zBHu28YtYS4CAe%FB1aKM;vE^T2vbgLO}|sq&W(tkIQ?F#snR6Y+|`*Ayw6VBIt|w+l$wU^F;KrlssrK)MQ_ zS)#!^q)6WjDc=9bzyCWw{@Kqx?Qnboo}M2e)LlC>;>q}G5mR{bgPZBS?g!pva+^zAAz>8aV<@eJY-Zu^D<&|>jZv*_ zV%dE8#o@!j4FeiR#k;Pf#iPd&S5Xu>u1XfF2#3hHqe4s}n|8=eFE^r;?cx?J(+#2i z%Fl1}sBp+LcVTvRT?cVHDvJ_5C*la%hVm8I*O4jKg12PUzAUopQfUw+cA%C(^K=9J znv1tUB`r$?c6ax%wY`Ir`5cBZC9PEkn5AtL423F7lW%_UZioPezR#Ohs!Te_2oE8k zm@Wa&Jb(~FULV5fl((WRprXpbC6)ohfvbfS*ty7Peys@9rivhI8)_tc_L0Y)y<<}0 zJ9Ys4!pHymx5OBJ0??+gmS~W+K;o0sYD!2E54VcJCvvt;JTfEeYOUCANz?xWm!LAU z2PA&WLgus;XR`Ob!`AjqG$~x$i7_uM>S^1|aj&W>v;2f1C%|Fu`*|85 z{C9xHOu`eOC~?9P#LQCjYtnU8<^v!JGl#5*(on`{5_IC7&jcN5$MSfKH;Gg%#N(ii zLHT?UZQD{W&-PmdGY7?54Ji>Jsv8AP(q~U6Q|jk6wTi)esv42#^@Z4nrz{LRKBkG! z_3K;c`vH==4DgN2tVr)YR8mMP@xeo^&61}hRas`aH>m=doD?Z%BCG+4>+MEJDf0!y zOA$zL-m&9!7vwA3>Oc5H{@vb`!hZ&! zR63EyI+2x?W~ZOPJ-a-t!8@3OTxAtodX-FB9s4x)^XCmt(MlRsSwkhox1P=m(|eDt zt!<{?QYkD5IgQMSS}SGp*h7OyN+QXv;rZuGOf#+OiVJTE?rOV<@%y}1pGRBZy zbcOFv{eF$rs^e$0W@4%}PWZTx5v@K!`*w~yAZc!A(7pN+fMM-Hswt!Z^>C+o1%K~lN zVsHNd7r%N57cXAI&6|4=kAB4rBV|;UD|@z6>v_u1Gm0;_KVc)pFOlj=@CK=(0xK*> z@G#!ODzvN*kOZl*JpqhX2$9G|vSw4FmV-oE3ai!XqkrRn_>1M8+P8P?0Ej+(I3>U+ zi^T4;+FDpmsIw49sGnu8I7CDuQ!0$2C|IA+XWhL- zTeockBE<~3^cS)fJqxOk`mTc*bV8|HzK0NhpcE$UBr79D5JfTNI{PzNri2$|3C{;I z5TR0}(p@PubwgeS1+hn)x`F~tjGC4vIc?jZZm8O8nhKN21V{;I&YY$;psrBYWM}@$ z^(}n)sb_KZ>W!T1m(5QM8ObUr=tMQ2kho+T5Lqo5Gnh99vLs$df`?efJcw1w(=4mk zHau|$(pvVSG31g}H+8P~*p>w%1S<;rfP#AGo!Yl|qy_l-kN@}?AKc%y#?)FyQboy; zTZuzG6^fz)nJaKyvtDy!g@(17ssUbDQmQL`t29#h_!~no$cR5OExgrU1WM`@DWuH(t4f?KwGAfgSVoY4_54S9Qk-sW! zvZL>S|boy_B)VgB0s;hS;R&}M$1L6ye`pAiP(k%bM~vUB-2)LT4rF4S|&M& zn7zpMYv8h(ZbupkDzMU#zb{pvmcBPfvI8`sSS*&<-rm9S@f=V<#YVF_vj8h8JXsAo z@&csn7tDoPM9DwoB;^=0`!aw-PI#kx?~$OOG_?ta$JR=LZSh7WqJ*eWg+c2tq-deA z^~mQh{O+CDyLaRO_)|afp&t#w|EIPnp`j?`6NU&tk{DB#c~&c;owBIl84(XD@a+}Q zv<omYq~RX#9i@<8BP zkw7^_R%;m6pvWORIEVecLu_yFASs1{QT!0b+kL&17XuXez3H-0 zxowhbEp;3tR3?cs3M5)F0get9bmQ?oreXKG)5uD=)eC1@BSwb zKl)7i`n~vveY+zqfcNgBBAbkfOD2`_3oZl=Z8gt018i}taYIv6*+WRM&q#WV5e6nR z?^f)K7gL1u4!gViFq%p|#0Y4Of~m&<*+$u-K;IKet+i&FE8Pkem%*~IEyqqd=4caz zlre*>G-I3twAq)-B_YhR(RrgR77OMo6d79(jX4={EV55P*U2c)K}eEW&1r`BXnQP(tYm-c0~S}`JCWZ;z0`f(`)o=)~x03QGVAOJ~3K~w-3 z@s%}Nv^@WDgAW;5AHHsyA>t~nHHLnaK1<~w#3Kb{Y=VqYsckgcW@`m8U z$6B4Mrp?V6d?1g5h9l(KrbgLRXex>(n@q?Lk;FD|lldoI=jpa1xe zzbSbCx1fy@2bt_Jt2o$ED?lrDn5pu3jkxXP`oHcC}Kd+lIk5 z`k6-K5fKd0MxuUQvH_@{mqX66X{gYGg%_c;s0_iZNs?l(R;xS;Of0V*`T<($H9Ub1 zcQQd8u@+#oSQGm*tu?xA+8THiSLN}jupi}nDh0N45BX~lc}g%9BG%M(3BA@zjN?jj zp_1&vsv6y&7mF3mz7K#-F+y8XvIQS`PS5;* zE^&kuQt%<+87wKQ0)C*`Hb5gZVxbMWRMHHT^?i?n!;^fYS2d~9X0sVWAch$6u8VAR z(X^y~E6Xw`#t79@X1r}n!WO!XYZ#NLr2qj(gL8S406Yy~C0*b58E=Suqfe((1W$g0 zhRa{)26U^A05F!bu2voO+}uOQNMpx@Nc|KCO~^=)!Z?uyDDpV~?a#rn27%}6A`?!C zY`;zwnN}=3V*WWvvME@zU|~;Ll@N=xm?AkNYjzc~9u<>&M2#2|vdx(2By!>sw_NK0 zsI&*7)DtX2ra#gm%9~PH<7t%W`Ywx>Pyoy25|frF$=*{NKov@z+aB*dCT&aAn60r~ ztIAb7x_Y@P1B9vQelPR{fCgj)+j(YLFN8MChk~<_ZjWlB_?_#mS z&^v5y&UmAfxFmQ<>?M!((h4V^iyTc9+Dxa7L<5yRmRN6W+PUgDo=c(YRw#;+)NPEW zONB7F0heFCiWCNP^92_3IaaF$ZSqx*RkzIa->RKLLQKW+NV6ST!Qi5J@EfB!;g-t- zrC|65wz}XsKPUchK!%F+|C>Z0-YAYz+0vT~F%n>a6bQ6TF~VbjV{9OAIL;mnEJjJ7 zUYFVea{IA`C4IftsA`^(*A*s{DWalyx2maO3Yz=df?9^QZ7CIssHp{^U;b=M|lvzCoKB8(wCh$;^SV@M`k)^xxat=TP@ zBiIx32N-w-z~jy$S5v_Uq>wPgJ`=wNN26$C3}W!_P+HvuVEfhV-&bD&sPqn%c>EJ1 zdHdUf$2l4*0f7@{MKbAmwj3g5*2}F?*A=Xxxw$rDsAk7>*1f$0bp3$IgnHH4Y?|e` zqI-`i!6X^oAj@CD4m?EB)EQA7wd6F8liB?7$qAP8C64EF93CFyWU<7_@d=KOjULIhx#%AZ>Z zC_s(9x!fL+9ffJ!7ongzBN4P=Q-Vt3!^z|CB=joJaIzGlH|%ofo3*EGigyZ4eF*v-8N_^HTq#dN)&w3 zbsbtZMjy;dp!krMy%hb(1)u{M(gsXa!aMQr^8om{pZRMu=lVC1qdU`N4fR1HYa}3! zQd5*Nh{2<&r|5de639_gpJK{tKF!HK!{E@?4GstW59 z>O%)`q=>bYsJe&&DirX^Be?;~zNee>`VBJk^bR{$Uc$l6>zJN8jdo)bvs0&V_P+aY z`ux3UPM^iOyUs9qJjMi-h)9%T;tDJvszkTGCf~)p*<*r4bj6sU zRN}r>14fi;+{=P{dQJ3IAIZr^Cki38Iw2+cTpJCdiLi;lumq|=kRo=jU&hXrmk1Zq z3f=KO=6g4>KRb(^&Y(Uv&}s+9SWG81rjrJ3TVZo!in7pXTf!)0%0tpzm&bNp#~>wu zZbiQQWmRIiAmh~ee8CfvlG&%oAY;=s==&a`VJa^a{&ykIW+&oofSwTqF{q7vK8;A3WyX znm|t?_ymNYUfmln6XhhNnJkb-{?-BRPvYmK2rVaEBcy`?fBB;FQe%|v2hsu)zZOQx2g>w3&j zR+)iUSYp5dbZTzj+{JR$W7RpVI`UyRhL~c7H88eBTQp1{5vebrlv#UG=qFdqkduF3 z2gF8gIc2-WZi&O4t2o%Xj@8LwzG2H|hUw{Zn4P(Y%}(ia$OMxPf|H#&?%t?ze%1nt zFcP<1AbF1oR|9ghE2R)MX(n_8bNCZ1I}^tgp`nqOT?ZJXNWiG(jjvOJ4vYAhirg)@VSPL)^sI7rY%xcqs!suxr=|(n@D~{&xVL`3K{`D)k z@$&OfY%r2iL{Ycc_?B-+efI+tj-iByFKrj;5RP_l;COEf{o;fUHLXy!8`!+-9-KON zABwW#b)r!e3T;!MEC6dT%6b#ELbN7BPHyU4kI7_$`TPWR-C(|0A)e^Jm6uZ0oI5;@M*}G2T?z_)s-v{A4BoN@I4LM9FFHvTIPt*=r z!;)cJAVv>BMwKy7i3s;_=j_Cs2JlCJ0Q}s~{7;1&`nMqh)|Pqx9YR77JyrB7p)Yc0(49q3uX`%InYFa zzn&a?ASa{{vKYn~;s-=lrzs*Xa2sL}Oo9mk&|{`w0wwN3E2u<=h}H@^5NA>;z+=G8 zOBb084_Kokt^o`#N%aa~ykzxeqNBg+)mEXg)=f8x5SH22cRG6JQg`%oy zLXiTNivXzH4KP-YJ*g8-@+uDyH}yEkrP z=jzLN@yRbxq_Z`6{rmm|PT%(i)HQj+l_jaIs;XS0U=jmR78EebE3^1W5fMZD`hduE zOys`a`G~JwcpRVq*S~-F*+LdP>F(ppT6)BJrr_=x7hSH!frA z>Lv7Dk27z02yc7;M{(|fHv^2E6V=z_?pcioPR{@Z?!6V7*#_##j9V9aiE`f;0gZ^L z5)xH1sGAK*`Pr>y)UV7$>aH~0>$OywsH?Z;c??yE{!$u-HvqrDKd=XFm_P@a1mFIB& z{@3H4*FA_+XYWDXPLRkMhbplUkYa#y0mnys*u8NTTh}gO)eX4sE#HCn{_tPG8{Ya( zK3s^MDfV5&rbF+hfF&u>Bne=lao2By2kPGF^ZzV ze7;~(lE%r&9L8EK7ISROW;lD-X-p;!2IsTWb;pWNaj*{2=btU(N+BR3A~0(*1j52J zji^)Gw*T!<{O`Z?)3>{iZ<`7D(I0x>f1nlqQUnymBeA`ed|@_2Y?_wA3q^t;E@R8G zg5}f|TTq0wDX28R^xRi*@yVw!EEo9N6ORyCs4%$uTfYPMy!BnA1J8ddlx2mwCg~*^ zj@Bqk%ldkjowAfz4hd@w^T^l#&GI6QIN004r#|s_@cB>u1Drp99^dhSAHsug{WhFB zeHLYDVN?Ryop@*@7(}QPpb=14B~G0=hjaJb2Sks%E|OM6CLbl{F#toi#LLfo0dD9Cyo?deeQ(C; zhdzj^ouaDB%$r}F9OL1C`7?OtxBnULz4sn`$M=3155DD{*f@O`>cT)HL8}0RM9*AB zsOX^;DGX1YK8thr+y@ms_HVq1XCM7d>}_4c{cn92rn6J1>k3s>qAaUyg$`vAQ;F38 zxL9D>IT#-6c{UDJX(@U_W>hL{3 z@G-ppO>aY07BDKps0hs^C6edc(F4%~h)|##N+$=c6gE$vq0#8-81udBc=M)Af?mPqI zASsJ}3}0r7a{{9$Woa+|jatJ6&$Q_!R$Y&i`2rJ8wa$bsHYo}0)ku+cz|hf{(0P~J zD$;|D0wQb7-ou}N=AYf}KECY(;6ME62mW&nygw;%iXmNd0y+CeMlh`v7Z`GY$&Nh5 zIHR@vu#WZ*@$Bz?DTheB{M?gJdC^wC4p-a?tiK?pkg)F%3ARhqX z=!<&`8IS5)Hoh?`m&raP{LZI-5&!mQe*zDE=lk){dp<-8G6Y(Dh&1U45r->}ofBYp z>2c#I;i&UCUPid!P$^FvCIujRRP6+QHAi$k5F;*M_&iM6;_Urz$*oCBz|ErtjMkXd zY`ks#rfn=!+uqp|ChUz~u{%j}+gc#OAv`gvq)4xpgbE?&HbN{2IRash`0^ z-}$|G=sh1oTUYsp*PsJ7hCt7J5wSD(*g8o#>^zQ^l&M!K>g$mLR0?R?34A|C@&gb( zo_X{)V5%wJ`1W@*Q&9fMni;D=xj@L$&Z2h;-2lv&4nB}mP*aVbf)wjTBqi@94xD@t z#pPFwW{ozuxx0rHfwE#^nx+gvF>)cf_!yB!*5Gnc65tzHL*u=RKk$9u`3s+Y^!AKG zZyN+u3UBa8&`Cihz!X%1mIXV~mKBFcL_iazwA2O5d}|DjN+&U_aD&H%FFp><5lPGW zA$-3iCD>$&vk$%<{PlF?z(1@)$6L2u_<_CM2Y@TMuAffh% ziEd`abYVFN5SbRtWqV9~aZ{xbX&8_Jytsw~@k#PksE4cEADnVkpH9$;5 zt)XJXYJP-k&wZIkRS~AFF?;8SP)%mcsw*=({>5MaWnB35ui(4C|07@b%oAet*qcY( zI0@KWDhysB29FpBFYz7-5pbT?;F;3neCu(x^{^`8?t5Mb-IR5Qq?8C)92}~mz|QV2ma8RBo!UUlCZ{qfu-2jw3B6WG(IOclVp&Vd)s$$8 z(s%A$N@)|fISIJ!1HgO#dL-sBw=G*{(`clw))jN4CWE2PXB34@l$L}fK2T}%l_$Oo z&$@hTEOvKyph2b1=?C6IaoxFhuhJyK61SE*XOS(Df&6``{US;klBPsfBjeR z@c;91eDEWG7N^dfR^scQIsI;6Bt0P_ zCbr&=5s}gIYpaM$d%(;jyz|_EjY?zMwm@3I7(nY95C6-b!Ny&8;X@z!3mNZGidqR8 zTL-?yNiaqiO`nyige_4EF`u8{Xuibt?Gwb{P?rj)Hd|CBRhMN&0Wnoo@?;|*A);;@ z)|HT|bz@_OyYD`mM|{DP>W{P=3WFP9lz|HrWu91~tfPX`+7@MbH-PK6vyX491^C2I z|5Xj($5KkCmDW6)rv==!6C%rapH+XF@qiS8gvg>D4TXfsbcz?A{tC9QTt&s1dDa?i zzkCsH=wK9Z-@CpS)6-|USEJ1@J_1y#$?b3Q=BHj%^y8ZGhVj30K==@F>G`Me%Rlws z;X6O@gE)83>tMjQP>Q&I6mVf%p>q*2d8Xi!mw~vsh*NCv0X}*}$L=xFVcsXauoqCk zW2RS#p3EM=1eaGXK85pdeK)2Xry=%XND0T?0OvhUHSCf*45TTLL?o8Lssy6Rrt#+I zZA)P*%tdEaDOU;!2`U>?0Aq_UdPl$*sPD+I5MF`s+*(Wfum z&R)K)1K>yhDl0)Ed(L*a>T2f^*4D8-(3n-QZOK+|d-O?$Jn_ut& zk>bX{Z35Gph1p1bJZ*OIpodb-w!^47;QvRujzqL$tun{`*?! zbeCX7vbkx(rN>rE36~-tm%QG9lxPDVZQsPzi_hcQOP6tSaEye6dQxYVX9&b8@ZO`a z2K_ML=;#<#Rc7;3;#Q@c#;Bj)ik7vL51S#RzUyZ;Lj~E=REn&(EW!3NlmJK{^ z=Jh|)N6RK(FZ<==*G)Nn2>A4`{v0qY@P;>k8>7kzDSEuH2V6O#O%y?qPl$wO`$#kR zkR;KCTw+{|h^zw$(IL8s;JI849?$G0%uh7l_do=ULQF&gSsZTTxyOD3@A}}!P!zN{ zgkE`d{{*!)INg$`;qv$hGj>6eV?={13g+`8(ficj6DASA?gj_<_yCvuAdr#NcGOk~ zyq6i%8qi5)z5;kUptZ)$%P+unOZqScG;et?s_Et$uto=VO2C(X>sMhz_nJKO;38KA z^vo~pB`oIj%u7qpJSJd%^9p|VQ@@BG{*RF+wXgsHAOJ~3K~(<|yGYUV$*#}0xJM@_ zML8B_nc#gy(?oi9S^weTy+hMb3)9S|!0HGwB^>VF#MZTIutkYeci)9`_npUV^Au6j z4H2wrRm1f?uHV?kY&ONI%_*}_DXPqc(OFt1Du99}p6~;=vyb^Dy^T-OXq|H#hQ%S4 zH#S)x8?t#WOSU!!0CI8l16f-K@8G<{^N&B7KR+p1Y@~#uP&AGJ`-Yo*EX5Q9UQ(XP zhNl>3+5Dp;ugr57CntF1*M1IfedxPjHK0;J3?5s@9xopRB+s`@2#Ahu74IUvb8x)D zDeQqW;lf%%OrRY5kjPIj#E29;p53u{X`eQgH3_BFC`*HjpZizvYls}39tw2)0Ww(kpv%H^FBHe$A`FEzuATdZt6lRrZ;&98&78O)f zNQn$B#dCl*N~9_x0!b+x?`~u7#udIT6Ux`W6V<7+xmT|1G6R2Ix5AU3{uR9C-_tWM zY(ix<>eAwoU;9}sPEPpNXBQ`}vtcO#$|`e3XgW}!s!ZmUjMFE}`6CLu`y~{Rah>UxUs#P6P^k~Sp=eV)EsFJ z7BIPC*!&|s0DSa~*2;QM6w`hf07Yd|2mv<7cqcAdB*sdyN=o6SXP(3H{yw9@iQI(w z#?Hz&6%m+Yo=am8pa0fhfs4ERu_QdwIuZFLCH}k4r)UTfkN)~6Q5Od1?tK7=0V$H_ z+w(h#Zxs(09GCO707In37x~6XA;P%;7s7ZG<#Lo3Zemnf%p)GTX3>WPt2C@uC@qkN zCBFK^ry(}q)|R)F&ChQgP^qsJf_Lbb3n*sYDK0y8QrQ?pB}KRO+PF_KnlFsK7zsCE z0Wg1k0^Ohp>6hD{iiWs$NKj&O3?4VHzQ_lzMsez1H21zSlY3~>R6Le7c;?~%7j0F3 zQ#|v~pWySq`On93w6(mpM%+ki%WG~7TeY@a8zXBTJD1EeAtb-F7FAiGDhf0e5z^|i zKwTARstU|A{XPki=KJpI_?xccHH7_CrOWT&s7aP8U+oSe)N7+(n?l5t9mIgZRz z&fy>J0idDpk%SdNDy_97a?pl)(UhRr-ie~50vlFVxN-S1u733eiig$;7WB}N#5Zt^ zj)EJww~{iJN9-wabpe1!b^4Z*AwmuZ>hVT#4{`hh9{=rM#RCt%6)AY0HG90Y=h5}_ zzKi5QGq?fK5zypZM05_pdpHixjLFeLbQC>JW5JMTJq=1j?A3y^F|DyEI2ow4^zU_5 zpsGs@iv=!U{2HG4%;)g@<6p+&hKXl&n4FD`oPVn3lPqKrGfz_G}FjRuEG%_@%K-Dw^ zc6g6rwalk9Ep}-IXpsvL6UP(b8~kbl4pJGref1^mUw;Xkcbx;GLkb>l7;xo)Of0;M zh~6V|WV7>;eB2}Hv+4F>B-%y#6UXvZ0!sxH^}|3ueEjG6Jqs6!Rc3WUVHA$HFXL!; z8ce{@V#sw;jL%+D8Ap{5nSrZHgpZzTSp z_#{L{WTO}(G$^YfG6S)jALD4}MjkiTZ+Hj=)2_$OFQP1i-5b|%w0-59>Y49e`6{-r zUAkp`QA;V(agu!-v)+E*ibpA>A=Yz5lQvMn!y1Fq@TNBgN&}TGV68@7mME-2RcO>D zwF#wFm>(YEt519xPe1Y)ZeF>HZnZ)`I9$7aBTqkwqYyFl1BSt2aKowF*~i~#m;5`u zdFRf@L@uy8(J0LtPMA@Nb=Z`*?t@2F7MyJcJo|;;L+FQ5Hp~ywD9MNipn$fW=J&hf z{abIk#B=O~wf~NBUjVq2i{IdI&uI==~)yO zFYX?bFegR$zJninLdgZ8Pqe{9646i0G+)DUWrULe;?GYY7e`#>YCZegR5ov8T_YICXcv?MJ5FNVUHF{1e}F&%7)QE9b!f zNM4Tox%9gNIy&0?mXm*sMpYJE0ZImCJpb4i@WPj# z#^KH$wzhU?;-dAfAUM?QcJ?uFn+E`lstBx$+3-U+(J_$szV~FyT^1#|xRxbee(oZ6 zZ*0L>IytE-phYVHpZIW0Pu-Qj-D+`u!bNMM{sCO|Fe?mz7C*(z$LWK7N#P%tvloN(E60RQeR03q0 zs+Gdd<%@vQ8F-SOv*3_Zmw@X>b0`*+td5UC{B#8bA@R_Ll`)`Z?mvK$>=T)0Duk27 z6~tP3pZhKTUx6vSVE6+cL zbq8X3e{4P1`4Z9!#aq_hy09lEpojxkvj$2fSSTnqdlh^5vgCunC|INDz$h$%l?Bn% z3#BpN-^B}$e;F4ZeGJe1-j^}-jt?G1wt8B%fA~#IZ?`oD)G#3?534Bv!ImYj6*88z zoQ4B{BC?wX``b71wWlwjX7^x0?o$L*Nrfz3+6vGK8)wd8`^t-eGFa?fr~ZyZF1?Q+ zql5xuH6Sm9g4Pi!3E)R6`1Q9C19q-oB6HB-5J8;%y@i7F0Vx7V0RhNb_!w>-O?j38 zBhpwXC65r&n%p#TxyF%PS_1*Z-lN78dkfldG|`|~sKcG>(AvQ0gb?Ha&zAR#T=lN|QPh)s0~Q5U0AdACzn{nc)>UYuzR8}s!p`-V*!`H+EY0b|@2ffm*uG`6 z$C&NEa*N=5s6_mKIf%4TurVQ8g%}jI%|0NifWjDrsE~|@4F<3lDtJU|pg`7YQ7gE` z0+*h?fU6h3hHwAg_u~BP?uCyIF@)Pr3%;!iAb3y6afsaiuu6*k>}+A+21-LwT4A-E ze1Hi!#3|a$Jb86@r}zw`%IFoI=-r=Mp(oP5-L-6G5AIQYR2M;$$NlN3W=xDLYjpV&UO7gP=4zwVL z-jsl($s!AytUONKsHD++;jWJN*t5UjQIyTfGHC^r(ssN_35;+1h@CWH<$52wb@fCe7#bZGzbn_Doi<4aXmiIpRbs{TiTSg{kN*as9 zoo~Wtu4pa9TQ|E@q{PVxeCb3!V0_l>%i8ijX8%5P3rM;Tc_L`WT*gX7YXxH|`pkd` zYlS8ZOtIHup#TG}Ahd=xlwasq9Ul9Q&*H^rzb3?>+fMkptxr^1odd`&%2>t3jKq>& zi*D5+LHf~z7oYwLjt}-B^h&K1v@uX1pE+`~q^}(rZ7!-B^@OGyzF*;6r*d;}9Q))jc!w|q_`y**>8YjhkrtwJk<1&STPsHc zm!mYUan3QpMw3ielM-LEa222fY6v5jOaTbPicCVa=CP8xWm5^;@%qs!kLbccmeLvh zUjs@bTYraJ#(!MWMiK&veqfxmP$hxf1<;@{Df*fBx2_URC;{fo>tJjN(O`_OOEP^y zE_vP1eN#Sj*R6iv0U#D|MD_vX<`<>jy0HkYJD=B~=}$5+>RceoG(Q)uG_11u@X?0; zNE@e3f(9KP+VWn3rhiY&y`~=rPd@S`TzdM2L$S%bowwUM0Ah@d1a%-OW=_$GE6gy> zH~QYz7G8YzD@0x}+?y)Hb7YMuG*B&bXewJ{OgMe_Jxm5tIJ|t3h#e_?gF|3E2tq)< z5ymM2@`;{*aitN1$Kr4o!4GsJ4Gz55g?COBmrwscb8i}~TY8m;J?kCz{=Re0o%#+vUUjR5rWTUW zh>&D6$pQ(>#yDYcib@LB1rKo6=G#8{UB&=R4m{P0RVlx1qrw%U?)462ZJro)>c=Rpnd=P#d_!4SPd zr>!yj3`(c{a=qrg?f2|--=h8sV_?fbm@CTdi{`WrT53P^82p{Visicrn#gl6 zf4^}&2}c}2Eg7v=echEd0Eqx=FN?UIU;~mm#E$wypqC|6XsgyC(r138KM>=+(mCr0yi+I}&;M0nP2jI4}s031C(W$(K!0XDX!mb9L? zt+oV0DHWgl)Ti*|C;tFJ-IR>23MNiZvcRB;lamHo20(=yKv9E?o)vl7mGHS6{FofEzCEuel6_+8F2VzucK+QVQrhruD4D(%-&% zXJ=F(lr(F!UMRw7ODV)Fy#R9pO=y)OsG}rEc=u{*IJNE0j5K^nq~h21F6)0 zADd<-@?ia$W`Bc&SB(J80K8N1)grxQHHN1!V7S@yS`K=5ARuUNwTXT|5pt3l_fiXL ztC)5>{O-F&%#*xRZnFYXkW7Fzaxm+gSU9I>Ot9A8{g1v#ScPCr*S~~T@74RxiX4wm{WJbU$-3D;&a3?Ch%v~vF zF?a@3>q|Oha7f35l?`Yuz~#YENnkW}HciKg^PG_8SzbR3K-@0B#fy`Xx6CVap5Yzg zk(a#k%kr9Ee(9_GiZzqsTDS$4>SxrN^xtw{GEz$FU4h~FdQYaNIrVHpvLbn{wl;e0 zjyNx^T2BNfF$F>sYKC)C7Hj7KO566N0hL$t$anF$J1Q{q7h;qNKtKdRb1sr@Il?D? z_XC*j9Kr@xnML)~lx-#T(R-+qZ2j#t2DxRdJ|HvsErg{Bs_936oHLs_>F085HpTtJAEKsR2qW}}hJxja89`QNub@0{Rm!a&o zz+#ECQVu-+iZ>$V_GNa>E570@-v|IFfMp3NO`Xo%ai^RU=2?t?o`rB!Y6Z_nh(%Vt zgBi!u+&_2Kc^O*;2Io2tgH*iNCtlNlOff`@}D>PZkK>Qw{*#{541FaMLTd%=JI z{onQX?#7nyE(0L)bCM0Lc_m>KhlppM{5<}{hd(M&Ta7(9r_mo^r!|qz>JS{@gxukr zOq{J-GH8s4U-UBAjQjDG&*JFHlidT`J~;XFtRPK0;S2;Rwr#KCO)ow2LY%++V&uvw zDmfJ$;pOLL!YY@7lvmEBNmc#$ae@}cmE%}QF?O8|K$B8T(DREAy#VJQe*DYonqPS2D{%4Q$4;dD z)^U)iZzVv+JkOZtf>LG;GRu4299;zwVV-A9iU~BmHj9Xdu4%WffVS^jFSh{b$Tyq} z+6jKU(Bz%+Tet$J?>mF9e%D)Gb@svYAI~X$-`&{qT@ncBT8yD9wKyjf#@+ETe)rdY zLpIzxxe25NOYlyHgGk4H^_5$*^bK8@qR*~tJs&q)TzL3VVXiUZ>hHY=SyO(yDYj_C z(zA6&P;`{igc~d+eeKu%d8AwfSE%wHUi|IdXCN+mh`x#Ed8zr7ow^|sgVd$}fyL#R!+&4?8s+N!pmDM%Dv z4*`)Cma7>6(y2fwOHeWZ;{`N;fn4T(0t)PXo@~iVcc%0xYHd1u?XUb(-y%QrWpd45 z^|kL38j44c#b51@m7IyHy|lM&z-fb;(m zwOW*;ZAl`G8T->It+^t+`?xebv_KqaCzm79c=kaLx>R%y!dgv;az_YU-|Wa z3a9VC0Pj4!Y7Y!?NPlb&fSfxN^j}s!J2>3Ac?%zX-}}4fS+D&qtx+UiR%wv{G&aiX z)Z-C@G;Lc0NX!f$20Zklmvx@_^^d*})6t!7`1X}^>K@w;qIvJMB9$;VY&LuNnm_xW zV@?GrOGIi6JboYJ6&DL~1yCz0SjkCdaF7GpOYZOGiydw4hEzMCCnTP6+~D=!{GTEH319O$6}<7C-;Hsz zg|P_jO9IJ+oW%)DQ%24crYUPiF!eHEv%7(S(g&;V9Ph+wHsiGFd2bDko8qgMjhPiH zAl5qu8ue?z_RML#@HMZ&Yu@?Ic>Hy*!`_)wec-FHv_$7LW18o~yRqfF8wPUj4+#z> zWw4Hh9_}(Oz2F77{<+V=le9RN@kya%5;wHUh(Y?Z#$cw#XihiDx(1H`ZUiPt^@NmC zasTBP;o9dvjXck&rQq6!--G*K|7QTqCsHmWu$U7uxhJ9m=0!D_i1Frkd>20OYyT4S zt*78ig(K0cf72r}Z1T~o0g+lCpjlREiCos&hg$or4=33nU`DRM6Bi2J^hiTxsXtSx zm@8vEcR#-BYrhq(Ex5%zXH7>F=6UX*XII44OknUb?N?iYcR^BreLsE2pOyfXWrD7c zO&bo-9fp(yXw+AJRjx8k$c(7dlVE^~I9Kmvx1C)R%K{9$5G{j-)Xn3JqRNb>6^{;}mt-{BMa}Pa)OOHKGTh(^v~pMuACI zBim>syoxBWkRQm&el)Mhs6{3p91hN&$Cc0hk$@@3M?i=ePM_C{da@%T*n(}s;r@O3 z0>}~Wf8kf+-~XFmT!9cwLeh^8NbZcY0`EtQ) zA7U^_w#yX8l;!K~|JC2b>9hAi=%u9}HgN=VKbX%>Q&UQ~Z-0Xa&+JRe86t*pBVZFl zT7E!}77o&8B8xC=@f=DF(xD)diAifofpyM<9PZq>3UTNSNAdKkR9mk7nsWTbEKG4g z7ax5&KKvWM@+Wl7fxqzAe;DU3ToTQSeq9shIcdvr(zHKgo_CmM$qFp1ENRBs-4!@h zU`n~*#+@TcQ-~;lCm0&(+#+yi59KfCpZ18QasR zaCH5K==?>SU<<->3LfM=0y%kgM>6r`063+(%86W*PaXC7=V7x4Kp1IoK)LY@h6@jY z!m!E!?5r$eA@=8!tu*Pi3peW8JABnt{f2#XM0}sDBBOG zmL`=KetoHo^BcyWd11w)XBkbS&{P;HF^=YpH-771!DBCbEdXAn{Rt^a>bZ0{mM?P( zb4qyP;S1OsB*Pgt+rAt{b;BVkC^XPWC#J0qCF_9{flt<169Lc&%ONHJK1STR_A~&1 zxM4>lstaG_c`oUq%?Ju{e7!s+Q622KEkOmyYOZNW{{&;`%rPU7k9O1;L00gT%%&OP)H zECsud2kU?(sbo>7%n{u(sfF5K6JK#8LiidrMK9aZM0Y-$EC|J zLau~QfBbi4>7xzEI>P<{yzFAb#jT`|woaD;Ek6Xwvpr@ z7CDHyG#pMDPki0C;}vgtCxrA<`k@mCUaRC zr$QsZ^;>r^r!3hAAQ2r{>UpAm&CweC5OHwf0v>tU%W&a^k757pS%hIgEwTfVbx2Ff zJ;8*C2)QJE-x=iO8i=BH!#EBf{LS}%^yi+d9p4oO@b`c02i{mqIowS<%+rj`W`qw? ze+KX2gU7J9!4qHmwRrL)AHm_ZYlsAJts-{N)A5R09K46B(nzi5y+aH_n&2S2>zNkK zHRlLl@#;6>_uv0+=~w3&H$U|Ly|fYl03ZNKL_t(aSU^|2_ z*)>0&3tsn*{{pXj+qa=rS=wS#eOCVq!f)l(q_p4E@54MN#C(Lae1ysZp58n<#?fx> zz$*c$Bxly>=dCsP7;)ylb2xMVC7inNKIwo#*5?)0Y1$S#L90O&oBV1pEN9h(a7Lqt zOi<>6=;O7!vE{ql4D`;oe)~L6e`B6AHrqX7Ze15$NDrcDI&4Nf^rFW>L^!;5UANlE z7^L$~Q+_BffZ&}R5N4T?X0jg;{E_SBQ|ZzUt&x(a{aLmeeu(tXvo zZ)Nr8b+284tJZMw1uw;!2Oh_#KJtEu*o3aCWMe0az{9DLaQ^}D&_TnaXBZEiV%&c~ zI2e@2pa4*+4RZzN1nhD{p#iV`vwsDTf7M$6W+j{~(MOEjqJHT$r=|TVCtN;zfY&~H zslN_6kG+G_9Zv$FwZ7sUuvU{s^QI}j)%;k}Rnj`zl!cm3*1>oL-hrIQba)2@LPWt> zb~r{vW$M>)%@DK!8u`BbH!H*Ld-z2-ed#fL_7fivN$-1n%^MAP>v#Tlc zOJU?O>FZDWJ@uO3u6;@wAs^!sZo_s>>{7xrH*RT$CEA#5_=+0+>5J!a>4h)ELoa(4A>%2^_QQjwEVGQ5)v4J?v+06>oF5Qm?A&wD@en|~}0 z;9c){%YC`z{}fEYy8ss>h8X4akz@h3Pc8U>a}PX#Q|Hg)@cK1yW9?5vwgD;VCx{d4 zP5|yDfxywyLv<>wU`}Az?jiVqJ2$SuJ3=cn>g{WAXD`9n#YQGN`MoOIZo&>0wd6pa zK7T)6@XEL1`qig#{i)AtJ?Fa6X00+{D)@r7sg;OQ8br;u5$4h`XTn@6j^~PVkG%@7 z|JLuteGfh=i!@gpcd0ceB{!unN>5YDI5l{@`jPW^_}l?ld-LQS4o;m_V?`&m5K9T* zG%IMeDVH45ZtX_RyYo%in}s*Pp?Sr#}Y+q-l(huU&BacH$5X+{L zc32Gjo3!00hA)nI$-0JegiCY?Qa4&^#nabs>ib7W|A)OT&fb4N9(n0Y@z9H3j8o^& zW8B{pDZ3{3AjYVmZRmt8a!#ge*&!8CGcKjTJ6+nME5XS*l$=p&0T`Im1Tg0~#GiW4 zzx(JXpQ|n3RSDp|{}g~UY=+U1==sNS=r#Q~j%Z+P;-VoWAco{^&y=#NqWD zh`R3B4zhE?f3B?}deQo`9yYn4gbqR=O)3tl-(mcU z*P(9q5JTu<6{f5cqX&^lR+$Q{%&^O$Cj#~kPU9_q@xR4WpZXX+_8Y&5>!1Ayh9F`M z(F0T~bjN3ZFrXu*K(4kfyy5i2FTu-R|8`t>8cOT_1L%~P(p?*&ibHE($r9(>`;;T`qsyYLE(xKxpI>$Kiw z#zem7QgP6ZaNbX7ML7Gl7JT8#4VeIBU~_PQGnX!5d*%%G&z?ca8P1C?Mk7Ye%0?~f z@S>an=j6FeKFkM?=!1ylI6~us=mT;oa3ouUxK)*ilTx{~farZ9@_%?Yw*1BD&Hs>tU78t)N&fQtj%_>kK*FODG99{h^2x5z(yJsjh_rth7{|L@L{8Bvl zlGkGY?D?MAEGe<^=4%He`(R0JI5m1)*blgPu*IMT&KfB|z-I5D?@a9J`KtW}K!HF> zNgZ6@tLL5TZ7Hr5te@Yo8Guo_^$kI^Lb0Fy8YLy%y7C3&c_$vFO3gtaOf=xwjhOr% zSQo!Kae~Iu7hc~a{^B@0hT>tFHaD4U2FS_Q9p_u}}Anadw1m_=p z0+*lo8k|0VvDeS*PS6+Q6q1oFtWqN~33K!!j$K{>gR(1YWhMlJ%p z2f_77e)aR8#nYep132dq!yqZ|*-PLHkHhJz^57R~Ez1f3bUk;IbJvgml zo_09A{xptnUO}3Vd;2jCTWro;z~1SL2r-JlBdjhznF{xVsL^Qa31>!+Q)9r{O@w!< zzpM2)v{Z`QEjF9|&e<29In-F?=OmREcA0|%x2iy%qW#d;6o6I=q7tQy2qeQlnjNq> z16w@~toqwc+FAsM>G%%rT)&E%XUREi-k^z*76j}lBKZv_8hXpud6^lN@6hfL^`prU z>T=ErM>n6rbn6Oo+5r$p;KwcY&R)c+bN6FV49fSek=;jDM+?|&$lB@JJu$=2rC<*; zF1QJi#Hok9J;eP3lsLj~HW&wYy)9GIBX)}%y`n^ z<@FT6BND#%W{Ws(VFDAiwmxNM-^IAi=$Gh^rufOT2`VhKYfsdTzpmC^R|T7Bv=e{i3o24rs+RE@canl!>LUV3#Gl4z*=K z*P+K4|M`#p)c^5acVowQEhjXL@yW_nSKvsfp zPaR-$>J+vw+aTwHHchyB?HcAgcW`{`HfqTLDw?*c*a?8;6s+>PmMjEPXS0XLzw&i> z`ZNClcdlOn#R$}jc;^|6M_18?1C-4v@VJK@Ml?SFeObdvHrsNRP97}443ztyO=63= z!4o4u41I9G5D3u&n?Tsp5=M6AX<82%jI!q0#_hiBAZ!Jt%5YIBjMiqM*+VIG_~a08lM@tup|Y5&;zuW-_C1f)Bl_W>XjUfi^$|3q@nnguH~j0X|h?H=~eoCe~6 zac^H*Yf4j|rU@k{Ow$Zg2y)tcH`L!U8FCJ!j==XIA{2CHoG34xcrKW-vtCg!81pP! zwE^^u1Wi_<3piW^G$&~bM(XjKhFZN{_I%q!IwoQ*TL2o%h(BIuMTZiyoH)mNU|B!qF{p3hC$=X`bOq zQNDn*j64{dgHw3;Wv{|~cn7zxJcZ-KTe2WC00bxLZzFiu(9-b&3}5$qz4Ia; z&44Yt00ZQM*2*G2$>ci;N1|$77>-qh9>{wPaYPsf_z)1IbWO~Vd&1Eem1MeYz1S3v z;4GrU0oukR=(u&Y0T~vD12xuKHEFK>y>%y0vhwbw_BW>^U||E;2|iF&F^Fvt2byND zL`0z-2{{yKjo@Q|3m#$INXArz>{N0FL3a6(8VE577l8mBkq0YA5SS62Tp(_|%ms-T z(Xwob_Hi5$wi|2?_7S&R?4Lf3N+PyFL?R#qqlNQolaUy6jDu{y3IVMF&fD;l>#t#? zDI5Q_MLB+S9T%JCNgd~c8RU|6Gn2fY@MIjK8!(ezkCJt#qloT!@~A2U*tj7uc3^)0 z-P-ZpD~gi)0)uy@);%9gb(S!v+-p>T;I>|gCk>@AhKOD>c`Y4e54%$hbs3wiBwjNp zCybi6~JCJ-uGW{i6Wc<}L;g270~ zN0^R}QPK`2&$3jb)kPm45TOZ{tw*&q_~6Ar6p=qO_Od67Dk*Cb+9jFF6^sj82WtHj9UurGLlDqJ!XvrL8t(D2ZL)3e8c!ivUrwAXU-5%+f+d z4I2wM%S~H^@;O?qfNQ9w0lX+r8R^WfZPohSIfrSQ;DZMmP+GBd-a053P`H3R0Y$q6 zserv`Dj1hW%H@EJ0;nU9`vx$DUE}(k(SLi~eF?yPBlz(9&iOYx?@+5;$l3~|Ef}rH zRD(eWbByGWy@_-P@M9NV`pOHf%>gJ$5K%bl^5V`(IWcaxICbU>>iw563?ov>@Ju+o zbqlQ&+`e`VbxsOQi9_fJGzrn7sYZbC4;0)}wIhoRfK1$3%1cfr9Gws9$YcW25c-}{ zYjluBobsHcmLspDGTR~;r>!bslN2>t1N}$(+ z#b9t*dLn6I{bF5Q1$~wf-DX^%|RRK=ty75a2EZ;3tX=q{?=pUtnU`tK!0LS1) z@PQ?(Qhq|$B?tk-W`kjWANyy|VBFiou(t&%=OfLt1e9E4JCA0LO%eO7DRx%rFDrjq zYdtW<5KxMImw@F()1vZ;B`x+P()a->7kJ|C5bSehRjn@7bshqMF2W*{j3?zej8WN| z>@Y-?(PbH~1AO%uqW>hw-MCvjzH0~Y*S`Np)Bo}#-}ix>)0^8&3Wn$filJw*M7qp? zgwRpd2ttUG(reASq);mBtq85qAb}wa9l-_Jq#3j=A`ffpwASFp5yQbg#$mwzefPmR zhhd0FX-3}7DD#YTbcEf}u`Hob)S9#ovpUwTYGc!LGr+L_`|5iGMArc524$&Y(Ux07 z>ziP#@p-I8IsIt5a3kEYGwS(Rw4AyAACUXlo$}E@2}Hn)v=A6E#h{A&Hg@y{e2vq zJ_E#ny;G;8SH1$&oHFT*#Ncn-SZC1NdRU=HLJ>MvUW# zlxH{>kkbt3JW`rbvKVJsA^(fg6AR;xTSwnZt)P@8;wz^Burif9rqgi~NJq;YA!~_e z!l~RE3LtX}CxV7Ua0C|z5m3?Wfk+svRX0{kE1R^-AZ0`<37&l?`Ba-jF)23f7C5pq z?H~xe`~Bx*!q3kEF#kH3k4vq45gxh9rXX$=sT2&Otm-EC-g>cdRHr}=Il>SFaxNIX zE=M4Tltkh>XW2XiWup-}R1yJ&!6K(#R9aDf*KEF08e)`#QMn=jC`!SU{=FQ?VY9)o z*&uk2{qy$;kg5FZR-2&MyBVz%1agK`xtIc(bJ_oRC9D#dP{hK_y%8ikx9?b4DZtRudp`+Y9J5cS5gOrx64 zq$2j#`qVE5dRGGwIdZG_<2cH4(;*^^BV3Hw?Cl|LMhu$`;636nh){`TG_b8CH1b|$a)qDR_3ULfsP-5I?1S3QBPhEEy+ifpAF=Y0YKAo=NzIZ*!Ya# z77^1l0g#SMZdo=pH5rI1I&kE@Y|Az#r4L>^KYf^I)ls3|UX&{jDWln=H5q^R-XrCL zF%CON^lzSv$v*q>yc__Ld(t^~4U9cdlLH?dQWmm<%r-j=B-~{e24UjG0VdbwoX7F; zard^MWy>s)Zp3v0781(YPgku~2N8jN)lq7^b<=J1GenL((jcM0R-o8 zUg}~Ia|!S<2rF?M5yw%kR|puk8?XaH91%n812O`p3czNqwwy&IR6t+J80_#{w?kyb z3v8YwSUMkL4<=qUAcO(9P`*P5D7nA~57)dzPgmjfeoF_K(7aqTp=C3gtBPYmGgWyn z(i*HF1*h5Y87&isAqpR+G&t{3wM1}=zqki%@#(N(z3^ELY z0His=d5^ZM2yqb4?15oeqP5J9O9Yta3Eq1g9SPZoYn6kh5gCf!)>7d}m{C4P1TFwp z12MhEl=habXl7NiVP<7qwG|*FizAW_(?MsZ{4S^G@NHGmO9lo43lAmx_zXgyum^dFGfdO_|B0Pe$7V%S)E>siP&?Ce?r z!X$;9oqm3FT2hHOnN`6W=;x7ZL1O96JAwp1)&2v?drGREXhBgjGDay?qqz+IWu75@S-H5SO3E$9=MbZ$ zNFhe41+^_=gFZPGNw;-418(l%SZfV|n_>fgb@OFw3Rn(U2m#THw3Hn#TdQp#kEN$6 z2@|mvtzU!e(Tg#nYBUK!(#@RZ2`#diLosaHGx==s{Pepu8t>Bq=8hQFs+G#%>5iMirLNJq!cpEF26=NrgS> zd%D?b>+hq?bMIJ`l`g$S+qPx_s-Y19u9Qx7HNdvF09p9>AqW%FRBl)S!bM)Z^z6<4 zUHbK@zwh1wvG+w<9t^SXrwlP5r=rZehB&AZ#h@#}7HMvABEsMc3Jglds2iEt!I7N3 z7-Q%A3-~H$tg>vr>f_Zqf#`!rnv=+RdFc?vAa;7=+fOz6BUL>4qW_<4?@+enG9}xd`4zFfVdfb^se!%*y;? zW<_`9-~j~R8juoqP+CFE^o+%!LPurwwi#Z(RgXsEdnb> zoRQ77mT{PoEOjh*gUvZ(7>544eXc-}c*~^LwLO4-4=wFq??;d}u3$SQ7i0+7=d(oC zpr9awyRho|{Ttq3Ltq^(=-YxTT5hObH6%)b)7svgTuO@i2btEBEGYs_O4ea8M<|~w zS$5ePh=T%;at6G2!UP473!`ZX$SftM?JNl1?MiLG{Cv&#c{_mG_)`RW3czC_c$89Q z*rzsWbvTEnz;i7{Syv3_1(6RS=(=l2dUtMa-pwZnai3JGyy5l%X4>?B6 zEMzCa)Lf5(rswaRL&^!hi330ca*;?;iZ~tTmiD4?*oR@1L!m}&D7H8XZLR6OvE6<} z!L?ciNOCT8<1#kgx*snFSrkQI04XyXW_4P6Eo5j2C@iRUQgYQ2skui+$x6gwuE9Gq zCc_LYgR>xFUQq}#QC~xxTB6jmvk(F>qmz8>{#f@#Ixy=#y_0gtn*(A+*e!6eE^C$N zq*CBQ=%0(3P)b@+d#(Q@xDHn-3tFwBlBFebkXBN^hqYAXno+CpQi`rbW44(OkD8Mx zJ2Qj4yF%c*(g0XL?phSo9>4Od?@izIjc<4r5ndC6Oxg{@AS4X$JGkMx00?w(CDh=` zitk)|lo~gqT>PM9jMhYT2n6Q@Jgl{%QA19;>&|J!Zi;dfkXu6x9>$o9QH*vN;tEmL zG_Dpn9aF8f_8K1yJq)c!Nb~3x3Gxc8BIhKlVIkqHBbm%Y2m;K^7QhmGLO*i4#dy@B^0PqP=%?xxH26X;910e=| zuTe@e(8^dDG5YRcPw?JJ?we&Q(&QjDA^{1lem8X9l##4mX8)d2LecG1^ECI2LHhXO zOlH+nG^a+S^w|zFi_y2*(0JJk2mrS6_r!aEilPvyL|a7zsQ`#FMB&i5YArALi*-sE zj5N=v`rM98G}Ss0Lc2EH!ki$ZDe+BYz-lYl+wT9u|NLV=`;dB;=AX0 z_m}5+CZ}9#J8T9(ZMSQPNMr_P5z#~^YN-l1 zYReJJb(iZB=q$+q03ZNKL_t)-Jx%X~E8s*#2a&#}7zJ0ke-=$m*;uZTUvUvc@|?&f z8kb2uB9CE^%w!lgFz&py#X<<3i(mEL+xucK|Gf>1YLR6SKL+c0fwjK?$x%voNnj-BoS^7#%sUt-vPi zLZBY$1w5;oGS;3R3l^{lcdXOKT(f|WOel2`m#_%dYFYg}i_FsswI&kgUeFB0doNuB zC#8(mLMNhetrgA(1O+OGVL$?790vdiF?s+&4aJ?v8mu0*NGyy$+qd9))&@XZZRG?{ zKE{Yy2Urq-aTvuR_N*m#P!U+bvo-!gB#u~|v}9UEGrtARUsj%30I}$8H9xSFD@zT& zbZ=71z15pFW02Cc^vuXg1#vJQwFcy@dn1&%mQw~3W6l%cL<>Nq%K*|qEx!TI83YFz zyM~qtItuPQnv;pqDYu?^aAUMm;DSfwfY#)?>{3QU(KesQJg1JUw6XxY!3!5fJ5_g5 zF3-FE2kwyrn0C|E+S~ z@q(9BUQpuP$6Q-!o$d($rAS1O?Zte;@M;rr2+svM3xJlhq+ilbGmS!B>C6=|4sgzc zNNCQ`dOpNpTUkUkHbeo5Kzl?>&Tol1gty5(xkoya21V zk=Q#m)MnFvNmFxqUI7PF|Lme!@&U~)E6z$5(6ZKoKq7WS#PCCeD>TPp{6|0h6F+z5UfAyQ z#sC1||Nhs%jd#BNYc4qF-y!2Jej|BiV_8iQ_mfZPHrxwMa{#rhoVHbJjZRZCHCBrp0I&jBRof(9H-yR_6o4 zmuF_}#Gp%gr#bZ=dt+HOUbRh`<_s`nH%;pN3PKoq`C!1H_W`9YxQzq|QF;=lUh8Ft zm2PkjF$Boqo9w@|c>pVUf)7Ya^s)sjjTM+~GS6RYQKA;1)Z87Du@uQcU&r_ilF?4b zJH$A=Y?do=AJfOY2qNx2~Uc2ZMwq2(n$gpLcDT^W4=a7S3`|N~eKD92HfR!uH?!DV6ECVMZE;mM=Gg40dnx!;rdhYah zNeMeruUj`~!6MKzfTfpz^4}yXFWFi@SF4_XZ`(C39blu|$`@c#fYyXLga+Q#dNh-< z*00mHn>j!t2aqx|wN;&K1r?FxYPF&m(CdBgD1@$JEr>r?nRoCZqP1C^igybR;6w$u z^k5`kN!!dRB?P@rtuYP{k3nE~=RWx3|KMM~?_Sv~a1R{-1D_|tZ!+U;F%B@9ZEo87 z$^|({JH(9vS-JS+9BN)}PV*jHw?!@q-Ur<-YePd$X`rGn04OS}^`;-krS^3}(|2(? z06IRf?rG;N=~&UWW1xr-xJNBZL)SWjW;pimCU3p)(~EHM!4hR0^=Q*ma2vc~6@+jE zswW4UjPh#VfrT4jkL8c5e&alxTT*WWQtdNa+Hc0>lvm(LCN+bl;R@u6pb1v5t*^#P zM~0>D^52F*FcslDK&S6&KWet`&cIiBPo+C3i@fUzOS{gVG+P{4vnBaCR~!fqVF_P_0PH5^XGZJBBDgr1wZA zBl^&3#@&gRf>H~{VL)&Wq~y3^5Pk^sKHWY(mQ6)DVHkor)1SFl_G*uN<^aC`hkly> z?%(>WzkpiaMg$Q;@KF~Y%*tCAZut-biYlR`JPXQSmk0|eyRWmdT93TKWmgi4BHkf{ zE`AZ6%3d*RI;bELDmaFIfUPE6XrC)2yi{G?BrLzySz)pN9I%WZFFogl+#(K;OtY;6 zj24*%Q=krXJ^S|oKsXPkXuF{HV(3QpaUFb<-#Lls+rL@8ZSTLeid3Yl!hq^9C@s1+ zG$+F>f@_#DqNnwCk5Zaf^}ACJgGKD7cmnhuRt$ro|8do_wDzuBm0r@haL%EYikW0% zkE?F=S#&bb=)PdgIU(1IQiNkMP1C9bTO2wFJ@e>Y3uA3ISqf5_yL_3qHntNjO9FKz zpgAXSl`TqKS*g7Z(5Nn;V-(<#8ID`0DSPKs4zJ~=eB#sRGs6~L{CA%L9w zXZOHVPdx6K0{{RJ{d}$Eho_nMqxPY_)__fowl*28U=YG)BkQYF@|yvG1pTe8VxA|| z$~f5HSM=TqEs`4s7o{!Z#rP3|PGQNa=0W?|AR)*ML+o5?8U8WChoo*zDZEw>0^<2w zVUQE9yw!;07U}7AduoZW6*==NEf@U4`?c_ebTCZbnUvpcDzMUph}{7`n_j!5_Y0wB z9WBj}Y;D`R#}7r;gYhed0a*oC)}Ln?q&m6NK#+P#`6UyotM_C$i{T;!A}a;jiT9mU zEYyZ=)?E+hME%(?oERc_;NFrgO|%83UGA8WeO|A;eL0fUuU&6fwq*=k>UpJ@^D>BL zGaxZW%=4_j*JP+GDYe%*2^O024?`3tC+{sK#!irra8ik9RsX zr;9UL!AZpg%xJt0%{Yh74g(<4(51k!$x25!r+s+l9;MgANJcawGSSI}M{l|Hv$^dO zaY6?LErRvF{tC#ngKedWQAJxT`o3h0x~MotHI9K9a+Y?fIVuC)q@|g(W!P2*zF-OF zbnG)M(RBH2fOKU-aN5$cOt1F;{_N+nHnMHfDOF0hG$)}PEA{{;G+sWt89TX!Nodzu zuA{0f6?3A7`*6oR)?l%)N>?~Jk#6t_U}XfhECW2#JfW7_BYt7%u#f9Z(c0vC&vU}j z(P8fb2^j4Fib(T>{k<)wX@?jiyeBlFmH*p&V4`32xVISqfSl_O644W-lvl>E%x;r& z;M$OQmJvzv;CTibcYe6d($`i&9(~gaVL4nT@)4EZ>Dcw?($qk5De!4VtBg6#a^b7* zVB$K3mDFA$vCMX(qumnW7wIP1KVLv@kU4%Ta2!O)F)WjeW}FsH?X|oQ{rN5RU$?pz zkZOshMX?Y&kSB;RtB5KO!2$IDj40f-1Z*--2tg|Jp++g4nyQF9ub$tZi2MR**_f_z z_T{w!^o*o6?!cQYxLD@g?fLq!ml~gyMAnfJfGwap;dsO$%3_V^F-?o(>{RI@cn;c0 z)?jObH_h`TMq6x-ni$_XL(d(!rM_T!$k0oRZJ_t$>s z_B-DGHTBxHYwyarF7=@k@r&)&HVDa@aPNJm%UYdfd(Tg#gCrmiNCXnO6qF_s&9<5v zkc;Xd{BL4L90w2>!)8P+tDUT2kgR4i!)IPv zp37&95Sp&Yrb+s_d~PF9odhM(551KfHtEOA*lf1o-tKF?MYt|g%n<-s26d|4(}nm` zYwdM@sd+)np@U?k%R{tWU@R-+ti+O@ymSnNWK?w`Z{a|sIrY(Vucd%QW^pisVij`# zgzHhVwE08~bVXFE4Y%(cV%p8Pe(NR(az2J}0N0AmW`kT3HsgpiCk*3&$`#wqrgukT z^hon0WG}|w`0aoH$$Rbu?s*0P0L=LL?Pl}CO#bvVO_)>0wi+-*dRPKVZEzuW5AGbH zGzMw`+y-c3>^8t6Xzh}+NAD4a00%;8HW?=U*H9x;$-ty5nSkDoan8eqCGEC46R=Xl z>cu5hUfN0p)hUPuRzoqJz(r}6RJ@dJnhT_hIR!^3y6pwb$k{0qj4+I&^3Vlq5JyoL z;ENklDIl^aCQilb*1luVB(fT#ko+6FwF1tvEr;3GWiv|IHuz%RlF+eUH<%Ve>p;95*<;a|jm#Qp(tDxA3Lt2(R`% zYt=2Ny1}(%O@$WWPyk{`t-+OosR%obG?D>}MgVz2bka_oj(5UpOGWkmml0MwH0xHM zkX^h2X|bpA61_C4L#Erj(}AW^x`?9>0W}x>Y%=LZL>N>T(*}a%U=yG`_^O$JWku`y zI1Gaba4J>Sxboh6aMhNgwzNcAd>QNk#K8#&3MHDD;hD0tP`G0Z%5L->%rx>&2tzk| zW)BnXuK+bQOd+Bkj3}(oEgQ7O2n(Fm@3^ z31~?{NS(U?1S^4J0S=48Q(Ha9R?7e)sG76vBeZ#sDJ4v|?_jr^#L4qA@|?kiSqdVEP70089LelU7EXsvyR zbE=cq7;y|3;)qfkrrm_ww-2%1+v;pOFzBS2MKI?V{<>_D^*!YRxGSy7tbj<21B^*o zWI)!|nGkUZ06b&`xy5E$n0M>enH?&tYfD+AqYdP0%@l(iNXL^=m(fxRDrx4WBhdl8 zXSL}JcxwrrUD%_mwF$Ab$Bb)l{BUWhCIntzKY9L~3tG#X&f79n2j->UzDDP36%bMW zZ0)@Q=dz}!3!-k6 z>z_V-3WtYBLS}0f!?;mBOL17O3AH_K&EwbK^TFw@U-Qae_|Qi_^~nq84&Jf1w~gdw|GBlCVvHEa4ZsbJ7`tN`v7C03 z=>KaC=2fgArFps08o8hwT10puYVTg7qt>q`E~#!BCRc5dhCv-2UyqNjOM`J7VFN@K z35kr@BC=r1*4f+#TdejkrDzQ<*+i`sgGr+)c_@S^ves;x4d7g26Jmc2w+nDEs!^0zS9xFg|Gma>=C~%ki2>fQ;AWgFfvUn*U#$m)fP0}9B zGn`W5#~})b!jTRZ30@IH$jtc8_x{c&%9p}UzhoHzASKLGPhI`l7r*G??~cR#O)-vO z?-0ib?}UpzdXLf=(K{eCH8h8LnsHn!Vw?p5j@A}baAqZE z7d9tn22ioLx2KvI!nT~}8GGA393LNJ7za$#PBNUFF^(hVX@@urn5P|F449@Jw%aXg zYybOC{KH>dmS5cC$CoSv0DyP@=7-vopTE*BT{!#d)2GHaTia+*gxR8D3{rPm>m%rV z^kypnOEeV~A8_Z+9ULD|!b?xJr_n(NIGhaukrR>16;Ga&bp>9izCL=LZY#nOXzN2m zC&4Hzt;1!GU;&+Mfy9z}r%tuCZh+OrDJ5(+W5)m%BOt{d4COcEUkt<6MH#9dR~m8a zE`Yrs0rGT|nih$)tSmo!Ueocn2}Gk`OOzL9vJ4eP$;|wsllW{xl(kwdQ(6CaA_7~%83&!frbbWpaG!~A))zAcj`W8@4cq{ z@%z5DSMPW3eNRTZuOHl1x2sQ|KHc}6(|djE8-BwwA!UlMT5G@MEpL7Azp(SqQ?1Wx z2JpS#^DXA@{>aaiFa46we_bi%dk=>_oM)H$>eZ`ktXTqVmat&wM$Sl$N&^)1!vJS3 zCINx$b|aDyR8p6bri73(&d$zZougM^x71!iN(J7lAOrgdHG^0d#3duURE0)lT7CgY zvZ}GJb7via0ccLm(wwa8EMG+>)|Kl9qf{4504IG6?Fr~?-CB>7*pMSAZ9QRIgkB5S z;px2wEUAA0pf=4EW}K3#U?xTNX=8CU#-#2)wE|SfZ+*T1YR1#PA1h^e&8CduDQw*e z!F3?rI;IT726&{vubhyxsbHrTW1$&Kl!meas>%}Cb(TgV`-Ewk5n?0&&9K&14*{5h zaU5~jA25tP$Aoc4-}RX03F9zI|AT+SzV9*3GYw3Z1u2r^TR^F>k_(IipmGL~VNvRI zA`99uNgvAqP}7prlM`5Le&z>%{FnaFvR`*wpVbWD&A;|80Kl)l=^gKX#n*qucc7GO zD*v=BL1yV*@aDt`^j*)6Y}Zi{wIfMq7zPy4w>K#0`vJZ0xRE2Z`m`22Ki^|I%s4yW z0|m9yY>i%oq7wimeNebWJN*EaW0bP28{$rAJOC9!szIXb`q~>P1s67kF}5Pc82wj# zyN*Kv-Mp)+vCg1*iYtpzn`>;80l09|a`Ua7aei;bC6p=~&P}8sC>_nUuT?j+zV7yO z1@1JIV-0#b%~;2&DyEuYBtSx@DJWtoFQ4@!j44WId<|;t`&kO**J6k`JKN*z>mn8H4f@02lrv z>wW+(|AUkya)yAs-(y)8T)A=;*B*KRC9w0|B;2sz93PGl;$a-53CN8-?naa%LY#6j zcAc-DaLNP>DdP6+^V((ZhaSDK$#!v+RCYmublt&|vJ~x-uR48t;_1A4<(aQ@Xk{51 zqY~Y#{gjhTrSC^}o1FvD$p$6D4#F1)P@8Bfkf~Bxy4cjTD1~*pauL>=UcoM{_TGxT z15}HTX{es4nx#|@0oEp8n-OVNw4w#mlfJJbTt)h2o8g_Qfggo>2lKMPhKM;VNF|HJ z7}gD5smz?aFUx{?UPNRg*5Ga|gPHGorzJJEp1l|$g2!xRdf6Qlj9u@I_hi4iL%%saKyJi94-V%CDp_bIcq;mc;fm^+_-TQk3W6` zH*Vg>^_w?w^Ty2@)KW^=jVG|;F5LG$Vu*t7Ts;{(nIfskN{kVwCnr$hj=t|P&ojEd zLrJA(m{EFHYB)MiGj_WX(>$^6?|IE~3gFiieFD5MZ2h zKmV5Bc+c5qb6?)G3;+Q7e)!uV%sI6z3E_ zbTFx)a|3dkpzJ*UA!b1bb`|bhN`dPzZI%%vq=MZ9~HvoXyT9mR! z2m#|TAZ0=`opTs^(wt9rI{>R{@3t?XH9mj}Oj%KnR$#|8!K4^uFDydk6|@p)5q&?% z?{l^3)S?;J-|gxqW%)AKfWwn=b@pjddiuNpW-V-jsfOU1iL|{DEs-?fX@(OJYG8z6 zKycFB?fMQeCCu}J7!&3>;O5QSCyDdE-`Yw8bK4+nipPZZ^rigi&aq_@5Lb$!h z>FFt^!vxn`basa@6Hg!H^v@|_US_zy$1skf?n{VM5jyO9%N8fiiJ3nJkh>`D)a7y_8#R>|V=Sij@0oIs0p4PxR3_GM0s6UViCbOOY zg&%&+Yd`tf+>by@*}6yT2fpvyem$4+)hQPY{eTb?`fjLN>mekJCnv};;W^KF2qz~e zwG%$iRK4XNt7E+dQ?165)OZGKJ#VZwuGXf}Fbv#Kg7kurS;ldPX`V!ZH*t;|LRE{M z4pVI)(&2~*N9)*s=w&mjiGxa&Sz|E_oYOn+up0&hA$rX7(uiuV8?(hBXn@fax~=bd zVI^ioX$=Te=b7QXgZDj_WtJ14@5MAt7{?LwJl7Fj`+w=wLi-7Ab^|m`z_7CE=9vU6 z7)XyJV_C>bq)=;Opq75bJWb?m7{$+X;u8~Luzla-FdYC0yAwbWfs)R9q!5r$U=8Q? z)^n@|;UH-Jt!ll)ps$yGrI->r=c^4Jvqa)l)Qn{jEl1kVrHW-(!VJJvt1oK}=4C*N!PF6z;swJo{Ts>*`X9}=u)V5s|}@P;fytBBV(Dl z&X+sm;5*Lx*;tgOnaqH9<0}0eB2Rl51JhG-OKZ5U?=bF00+Hq!rYE)b34D58KpnMQs?}z=cMK^iHc6fI1D&UQ~g=* zJghGmF)-a-7Mz^yxQQh&5*e6aqGn79SFT*C!H4~V2$K!7KWn9iwJPw ztFIxzp48zm)e<0!EqO@=aB5!TkP|7&UDy585C6nxfAa&+Kn4H+|JC>Zd;e&f58v+l z9-SW~@@l<*f@xmRcbs!`d}45Na)N8uuA%Qb7-xy4cTOOeoF3?D<-M=Id5VOarM`+O zVdw@pFU~x|LFoIwo~T+QGVSgWbAe$Fj2MX*;7KnY1|i5rO&KWHIn2|{j&J5>Sc42V zPV*D)001BWNklvcFx zaF)>BVHmJK>_rlt%Emf1&{ zTpYXd(>zgLUa}bet%iybn3hG1I}Bnf=)A=|iwcl+SQ7Oci9sM?Cxis!3Q~wL&SE~y z=7Mt$VIe9orFgyT`j`IjPrUY#d$AYqSrf2bulTyJ zc(XD1Zfk6p1-zjnq%51cfS?|_1dRwwz%)^+NkJK2>$e65s+-w>5=}X!8pW+;Dj5rn zN4iSy1k@YAdnXFLsHTiV-wEE^RcJ1okvgL6fl@H`Ju=umCY`sd2A{cP^aBAB$bpGBfG>UQ~Zg9gki)Jw@kxTshs<=UWQ#5xsZVou0^P3XJ23zVB)c zJd6WQb~}v2z)S~xjk}W*41GtD)y!aQjlnpM^?f@z+0_QC6Kwp+ZiExD)er-$aVRB8 zxs&SXY#euhg;<93Z!(UfJa=X|DMva$NwcvN#;6gb-n_82RpcQENy-f{f(6^TM-8LJ4+tB2m)HGx0+GPAPEATM}|)$rFWSrJ}Cnl`Jx$ zS&3KL5R}a>Jdccwf)oSBarZyI`Zd4w8PWWII_nt;0Iz@J+t0u86<-x%41ZBoV|gm6 z=6fd$LCcz6QbZ-h#29h&<}H*0(N%VyW90);_B{avGMc-EGzA+0gE za(YrXAuE?$Yh(jp90!gxGWg==NztFIjv19ow)Q;cKFW22)()Fgx-6= z8Jz5PwM5C8hN7kr?WW~{6Ys>K@9Igbf0MrN`JM^5rxzJ>Bi8PvBy>Hc$%?!t)j?Q9 zdaLVuK(d`6_$+NgkVjzT1P=B6Rz;^}SqR~^V%%zIM?drf%cF%2!W0sc zr0r-i4|1(8QveJQVnE*yL@j1!JUK-aVO$P_x-v5pVn2%+PLhBqgXfPr=ll)g;5q2*!F&3XB1KM^Ae-c_e7VqVrDDI4d=puPG})*)SA?)6-Lqdh}wG zQ$R&Nj4>E@15t>@z;$w(bZVKltDSSL$9KCC5Y(d;QPLIM1ME(A@YafdVnQbpW+$g7 zC^^F!G9Slr6j>=-FW$cI=|pVEpXmCIgc*U%?sfybb?A3JrKqf>h{Axhj!M;~WOU<*Ald+(DEO*HTPdbW$%Q}) zZvn9jg-@UF*}TZ#H&pVE0)D6QPtyV;eY?KzDQGI(1?}uB z)?ZO|igDLqpc?keLgktyX|^#^W@H*r^h008C^f4(IXS7*i4Zy2(7uP06Ib6i1D;fR z(m7+0a;c?GJ=If^jG{=|FA`o+6?|0nh{1cF32*K?J~vebHrhp(ZoHa^&dV&QyHcsz zIi)o_vUHNp;M79x&UNJ3OG!A-GgNs>A>XC|dzpl&s*g#4sXCQ(tX`%WpeP3?0-5%7 zl5nuMt9c3dMD7y)QCvX3(y#*xW)l}H^?8&Vm>T5-=9k@XfgCd zZRo_r)NTn2cH<5iNk%lTl7ET_leYioAQ*6fO|ByF)OMy1xoDkb*`b<$K}0o%afETJ zdXHuS#z1fY6cH&RO}*QVwPwu?m_(()6gJAb8R&a2n^Or@>+hz$G^Y>FIkC$kq}4i8 zfl{UbDMt)rU*EqNB6cS`s0=x=@T5`ib|Xq+&p<&vAp}BcOR37Z3U5~83o#E~f=HCt zMX}8#tX%%SXDLW$C>qENRWT_^-R%kf0iA>(9FCk;RU{bGa04<@%t(cN466F_{aU1- zWR3U=7J`|wLaoKkShF!}*<|!`${TCN7n0Ws1G{=!mfGyKmf|lkSqwmtyzjsDEpL6# zhwkYH1Yn=~A)npV`~EwT^VvMJ3%bnWwQdTcSXNtSkO~_nJaGrsQ(`TaQWWw=1{_C7 z(_z9VKlvygd*TV4pPzArC8$9Iv({@c9P@c6GS2>jLNLc=huRnD`VK+VYNvUjB$U*~ zF-8PYeI3TJHZYeZA})casu*J^IxmU)OesJ=^zdCL6Okk?LQzh-rOwEmb8rF;W-3a3 zI~Y`;PC)@IHw8ymOkq>b=*JNx-b55bEAw$T!U!~X2?4(IBv%b|bqY(w{`^2hqov|c z3<*n2Se6J=EQWF92-UD(pi_>aA82wR90oo0_xrt^{!UCVIG!EHv7#ZB_+vqE(m|Vf z(n~-A_M)e6CAiH(-L71Ql+g9PSc+%r{lSPJ2w})eS_xazq7KKTrCaAvV3BhWa5|Bk zL14{%jFyUIu0jx;L{qMT$V-n3rU;6qpzr!$eD!O7@paF{{(D9<004O18{W3O;^i-U zSB&AWFsm09s2)gNoYrpy4&no2iPU{&D008j%H@^M7|LQCL z%om0bzg&$fa!x3w)XkFhA{5179mA>eYaQ7Qy>wEn4K#tN)*-ihgjz?!A!5Mrn(!whCSiULFd z=4Ij3L#7F(Z!jdtL+bR%fAaJH=9az}V zQl5deK!`~$R#P{O?>ur$GKrv&Md!&*tcW^kOlEP3p-K%;UsdQq0fUD3fN&*Zq{p0! zmU!=LrlKdG_7gOH)oH`(#=G+NW6(YX%OEG6eflaAnoGa>RfJ>_Ik#!nfR?q3UEe=# zoFZq;jj&42Nv0aB@yW8VccYHHB{R+UzGHtzV9N@_RUAh3Q4p{e*?Or4wAXx1z$=|8kc60_7iK$|lhDqwo#v5cDw9<5q zv9+_>a@(zSbzEnqLFTNbQG+qKaqAZ8p4Kt#EgT&>=c@nwJTJA|-kzlMJi}NkCzh$3 zp3O&FFY;wsFbo9r! z)?~Ii&ojH-g2RttCF`s>3^rV&)ZYC-wx#o&nv_h8ozii0=I`^WSmYd1px<1B?Q1w;wywC8=9N}9p&i;WguYxgLP<-sRiNG z1+3p$uLluJ$rsF4Rb)j=EJa$9rp=B&PtK(_AeRut*pgrtE8rUC49v@dETSS>o&f5d zVCw0q<4P?D4*R_TvM4$lVyyC53X6`Bv;Qa#P)^u+1Ql7#%c24fBKpB#oHAXgl*gcU zV>;qgvDPT;JvID{fpxwY(o!zDp5)GRQZUVvz_B@HQtbl%O{O{xax(kR0F1ze$8r2S zuYS!h{roeu)#|!b0RRAA|Hik!;Z-mH%0Hh|{*yVa@Ln$_jjQ$@FEY}5cZ~FfT!O>l zfZe#m5-0}goJCGb!L_v}LqRnqwIclCeOK${Teogwn&z5WD z_&o9bGeYZK=B1Vcuok00o=eJX#-%8wRubi271ofkn`~yKy^`~u>)(fEyQ!OgUKYTx zAsRv;phn(n1^j4l#S~M~fZEVgz>Oj#V~j$@T{RJ7P6%_j0DjV@E;S~Yaqy()B0|(x zW{fIK#U+SxRH=rdEHR_VlmXTh_^v0G-&n*FW#nipIA~rLnbag$XJCwdv$O7RzU8g& z`Hahaf4b|^1poke<;!38b1B7dv&K9KW9pl(VxlTv)%P618JK#a%=3(KBrLOH)U9LJ zRUhkJ-MBFZ;g}~uAg&VDst&URo{sY}i{?9P>V@B3%Z+T6XoNvu%x$ z8M_m+3vMJYU&l!1VM>XDC^C=MG_!V;wdq#v$1_4mB7~7Ddv6et6q0a=IiDtyhC+-O z#sMe<^sHKdw%V;ZyOtRS7dO3@4XnS5G-k!jv}6K*%9@^ANvl<1nNsQ;l}*!3zXs1n zZ^ia!Rr!@uTY@l0vV8^A6aeSv=Tfr=7+c`1hq1){cg_RWAf`-NZow|(Trl)KQchR` zg*wtsm%r?vp_Kn%Sr)6^^CB~RZUEGiZeHdZogspYgD9-*b|({A zhJ!^vbRy_DA}k9}9A_(YPWuI`6qc>c#alOT;q2@j^Ssb$C@dIvgQWIW{NW+x0m}}e z8Y7IHYAX`VT>zHkT2rT7nZ9x5;}wxHEpRDFn$ z5=W@s%bec>MY06th&U(MeKu;nr+$RhO)lW2R-b~Kzu@HLVT$A9skJrn!t*t(Pf z004gFjqiB$mEZ8PcjcVEB}Or8%xF+?tS_?&H-^M?lBz14!S_A&*R>ZwFc2ycr59xy z-3-oIc;|6A9BQhl&7C4yhC+*}!%y_w`Tl^Lx6Wu`En08BW)it#!Bsg1D78VTcGJ@| zkyl9(0 zrJ2{)K1PzsfXbX{Z$ig&#_@eJpoZTv&jiIAh%gB)xV7==I@gRNWx`Pa>uJhqjq3kP zBT<-rEKA6sH1hWzB=b|*G2eNSd>45&s1_n>3AxORjB5)D5@KMFC4>ci?{PTHv;)fq zF$K7;1CmTPEVH~66O4uQr3^}DBhpFv8KpPS_x;ZU=KJ3A8}GUI8|n`0(gpwkc>NpS z{_a=4{3}mVjDNv8i(({&Z)WoV@!O^pxUR!8FI4zsGU z1qjPhg+~ikU3&w-lu}P+<2*X&Fp0@yiV;Z^WX{g^I6FVbVV*%_Q(nyE2q-t7D6|lw zj5|@0dIs7ETPmrBYDuxC;ls#{I!NbR9dngbv>ORvN;xA(8j;QdSFP;GKsH;BNgQ<8 zL}s{br?Jmx!(kT_0UWGts3AQ%YRG9ZOm z(RL~4+B2ZDE^m8Bcc_$84I&ENRz)8jkt#^aIajUcod|I(fm4=gW&k&$@Z+qP@nwd! zUfxS?bOT;5RGs2;iIV+U3*;iQ?K#0Z_x`>g{>>l!@n1NDPb*Sf zJMmhVueyN3qbNlhq#WTXs44`G1g$vd7@1J$Sgs0Pw4Cdgsr+;_JWsFNGLi zoKnWnbMtoI*P5TGFX^I-h1G7{Aqa709M>{ox7*=xIMhZ^%lK2V&JY$jVV9u*F$J0Z zqn<9k*hOjAKjn;*-Hwn{tgbz}dC$+!VXVbtPdtI^*Kg2~=IpGVsD%2e=e-3a+fmItZVo+=u8ILyMpBWh1KHt`ao%@-n;7&wyaddUd17coOk zLdg%XkgS|Id6Chk3|j#Vn~&c6`ghvz_e4#4i?Bp)7Pi(oL78V{W0000CND`qTkNY$ zvosT}L(Jr1IJ3gTLkK7}*rI}m*eqV^-#i8_>!`}C;xHkK8Osu?$VVL)RvgMwWxlCF zAOfcBc%qbyE2pRb@!$Q?pZ_P%)c(2KdR7Dg0QiQl`^ulTFn`t9@{p#YQCML^-(#L8 zfpW%*M&ssIJ7-&gFEK`p<4_^PMJ{}6op`;ci}KJY(&Y{$@qj2fQwlnv$c7k5dI;7~t&u9FIQw820-E&d$$?6w9mHFX^oQVyc}I z=+&3%L}M0Xd>sb>3e)Uc72rvJ-FMn>y<>f`)VkI>{OtewfnR_Lz#DJ1P zRN)c?v%Na_@PuMVJR=EQm`<*XS5qU25RHlhj11s6bGA}>| zl1Y>X3lT*y0*YjuTM^nwF|UTSR(V<+$lJ=qf2ig($j? z_Zg#>TnRBMzMa?#ve}A2c15BMD~F(N+Oi6DSb;(tBj6_yJW+B~OcA!@m=C~(-~|A& zWEgoJ?BI7W8c2*mD6HFaWY8we*&qcrOMTZ7iYqYWWm$yw3}g@lM3pHj0F5HyRTO0j zp5O|Q$|&%jStMkPyDYN=iq#!DSKkK$vP#Md8hZaQj(_lsl6{==-l z^L^j;J@eu4!^S!+A%e!48UT3W0=B|b$B}Ye-g^wgfKilzAtgcQiHviSQf915GMX9^ z7tWC!`v9zMr)jP}0P4Owi2SrO4z43+e-I-Qn3dTVrEgJ5L81<^VX1_toSM=gt5eK=6#0 z&CD^MrsZA7fY9|lI_EGB1Lwv{K9UB}>B%W;@=~f4RNwcourO}*)>EWdN~xmBQe^5m z&y&zx*+7ia>{8U6rr$=Jk%bqTHv61#9*i+K-=B+aVMl)gW2$`GB&3tB>*|H?1aQ+2 zuS zcmCw$1OR97T}QRtPB#BI4rI|S3$9$@sXxyXh8;I1x46Oeo40BoWEP(~0QGfy=P9Zp zl57A`l-5{yZ?P<^^>{D9D;=-0u3oVk%Q7RR4AZ>+0)mQ+BdMvxh($^c4Z{2VekBWq z8C|k;k?Lu%f}AlOf)K(?6#-Q~g%t;8FTEH83V8qkWPG>V4OMd>gMh8`^YcnV+wTvw zFcR(3>75fofnQc>pbe;+g12;9H2UKPE?5n za|G*sbND^Wo-rf|PoKPLP7Z8t@L)u(J zVOnMN9w>`MT~2)$XsL*5G=n*mOndZlE{GA1-K?VtjY=oB_^VTzST z3APza41nnN(>{(PMD~qlbl#!wdK?btL?%iGnNmRK9h?K4@Bfjt?mK_YetJIQypVKHw>7?c3Nf0sa(rBIREjYb#f9CO3TxVz5?86 z+Kh7ERS7E9zY8(K8c4a2^^82$EQiWtPl&l<}fLXn9>!w&}r001BWNklXO3GQ-Get}=2|`Z3b2my$3{^bZv3Hmr!PID&q3Ts-uhWL65ivbFKY zzJ`}x3&mni$CDpBEb%}6ssH7lUNla87OiJp0Ql?Q`mdP~5|$A0Gr#yN1pxlmcl}%c zopboxF(hMU4(?n}bsJ+*#1o)EWUDhTdPUUHGK@Nd3jHkrIw=b@6)mN}TXvcWouxnq zvyLERG7B~#Eqte%_@pvh?<;4W={upiIV^b%+fCH!s@g%+ODY6S)h zATvPdB!Pj3tg(I=SdL_azUKx=(mbnvevun+@B@R45Sfg3D2WP5UIJ7V$&~-!zz9l_ zrBH|qyyYfU_8!122N}Y$bM>lFF1`jPl!AnUMRf(FWXK|Xs?uTVqLdQp%bhj=g{>C@ zGo&E>hy8S@t~^>o&GS;B)|Hc=GIB{(gTM16GZhqs6cCrVVi#h>(2s2BskC^e!q3pJ z?7ekZRa@IVjD>y7V;sAVt=I`-2MP+9Afj}Obe953DW%egq982-iV`Ye0Ja=au=S|e z3F7+3SlfMGf6w<`-yd(D=l4DPx`uP@wS&FqxbJbtoNK#m;rzOX-@ZjH$Ovo}acl0P zU9CJ59y}_uGf@0mH^AY;&AP@z!uyKXUn9~R2ETt%__d(9%%;XE{a`&?7 zke&NRJbm0_QFE_fOT#@p-u7E2+hN(SdCw4x|6Ka~?x>Z)I*Udv^`ARkVOjGQdNT&Q z>`*L=3!Uh=Cnn2tmsRDBli49jG7;DMH+M)KlDF@O%lOdECWhv!?z`sn@|k<;LyC46 z-9_UcUJkvUKJLa_gE_zaT6sHp+}E^j8Xt}i-<+~Aux;;F^Kad{HKBd@z|!q$1D@wy z^>lSLuDmc~W*_6InboVKrgZIU>hJZr@7`q1yiqS@MkkGaqWNcj-;y4^g1cxd#<;(j zInZiw_in2^T*|iXPMGz{{>;RLfwv0$_Y`eTEq)kO=UA^%_sK(ew)2HSP{BQiPW#NC zZ98~!<+Dn2ycd`=x!%v8jxx%%9jH+HWK_@ouT@crWt% zgInJYjcr7ZbI_xcXLNSIa+NF0qSFZ+1XNZrT@Xs&c;7Qv-wY z84vfAnKwLhSekweilwmbsSCym8EDo$ungiRX6?{By$7 zn~T2dc`pC$#8cx(BNv6$I(?WwzTNitkQM>Ajf{*f#(JlDP00Bq_v}u&`=z$? zx=$T6X_D(&%N`wWzF&S^XRwFSlvijW4mgyt)8tT1`qak_wU6gb8DJ3oVQIU}U+$F_ zx-?F$tg2eo?#$vju1)!MU&8I0s+d4mESJieKcW03=ei+SJkas%mNLqiX|zXSD%{P@wDBCV5=D4sTU_~nb3J| z*O}jsOz`>5bb*oK$We0Vt=?^E`)d2C`Ky#~Op){aI_-G)>g(|nWk=U3=oQN@i5{1( zv#03DV{e7MgYP;%-MC`!NS&!`S8sIex@ei9pZ0UP%bGWqX?OG(JSd|_?S(dS*Se;@ zo^`umVY^UU7bHC2zOUAI*3$2ORwxX4Vw_g%rM@^qFKhGT6XV{u)af{Hd7jPt9#3{$ z*Yh>|HrZ#B@OYC;S)KE@hI$p#v^m-p3u@E~IySFw(tE#8DR-QS%;jm_*43%seUo+~ zHBzg^yz!qu%6NAU7NYIkz6gC9UNtnZZ8-JYV z8I-x^%!%eEq02@)zU^GH`AXpEi4TsBIuST-s>|ZX8=v+~I=CZo?^0LgU!4O^wr=n4 z({IJi>g?!OEu%{>xpy`23hfxRVZ@;1!{>P;0k(;ILt5%r@(78@0jd z(#kQafhOUDE0soGJH7PSSmnV7$^(Xv={BWrr}x{B)i^DmWK=b5__~n$r$@WJxl;E1 zE%w#S5ZzfArd)e(^Ii^lwaPnW_4si&dIq3oY#nGgM7tPwog*o;_&G%)Z9q zGAlivefm11^0U)~uEX5sDD7_*ICFs8`}D%st!tYKg1$|>IZ-WL>F&82?TpmVxyAR^ zt=XE?yjZWjOno0&&Dr%eoq`_jcXzcYifC&u^RWI{)7RIhKA*L4eCBbj^?*~h4PWI- zM`SLvdAe;&$T%+#_uC$=WRt_&Zw@$=ob%9S?a1OA4NA{VZTC)UD>q?HlfsP`Iy$R- zmz^1&ar6A2zxS2N-4*pH__4Jb>>}oel-0xDESNOm{S+J3?~iaP;gSsHr*bNOzQ=2Os9u@*$@=ENwzkbi*gwkDDEw4a z_oh;~-w<$2Wpl;sphK_CR@6=XniDe0<>l1*dDa2N7rV;bp0-esN&9*y=KIO7$GcoJ z|E{HQ+rQ{VefMK7LhCu-1DiHCT=!G>d}93A5%T%M`bP=pmZ)ZYHpa$<{xZXc92{{Z zf2GQ#)TE^!ZMHq=ZQXR?pjG%))!J3|sy6NN14k@4)cpd>Dn$WiItajh$W_69ek+84bhe5`2ZN6(K*2q=oj*xk>BW?Ds-J0PGOZ~GQ z{U&VgVU#hfWmI(Z{hRfZ`X(+d(q8Yb>3Oug)yTzhy3-Aw)H&C@Zb~ow7})81NN849 z2kVC~^eqa_y_!E#Xxgtc{Ismcr_8;h+UG5A7MI#s)^pESMjiZP zVS{1!?DT!>9nEfgbd%LRc_ikz$`)rOSZCoALcGXms@G4nsOz${Y&N*<=Rp;n= zhS!u!GShX zOU@nYeqOsnr{{|Y?PpK|zJz`?T+K7~x z52G5c*ld>_9xs#@&77HVz56lc&dv2QlE3I4%vSFj9AK3)-{@jLp;| zes*%d;CChwDxSe-f_EJmS}|q5`|*sp<|<2DU7NkfaH#RZ-T~X!>^d-^Tz}K9?74nd z$K06cm8JRU%+X&GGLNjeUHdughF!s&>+X7wW>gOT<@tiOb?beazH62*S>I+s=2hpO zZ<~(Ye2_8c9sj}G)_{hm zgU&5YJ6`V{o>;P@@!FFYw(~94M#}4Ic4+sh{9$aS&HmE-H&^x;R>8NXRzIlr}G(VL3yddR9w4K}z&E`uiWa1J%rX20QHhBHX zkn^&q^S(58?{cJ9^I;#l&uwWO>tT9oaJ#(iFBVyTJU{Z5=|SCr2hWvm{{6(r$ICk^ z4Ep29vT@6bvn~xjz2kQ4b>RySmY zm#|I3;le93oVNH+x~=&>=2Wwi+Zqp(qbDmyjCt-K{WfWE>->UUK|LJCEcQQoGX25L zx$Bzs@jJ6YZFxaA`GzRp+3K(6w49}Q6J?Dbj+qK(L3xiW!S1a9_>P`Hxi zw*HB2%Znyg*;pGzE&QcfWyq+G8irl8zP9LYm|5wYJ77~?s)o;E*N0{U?C*BFRiz;7 zKF_zPxwh=IhQXgz-hCXpX?$eRzyV!M+%H$v`^fI8H`DIe*|B0y!i$NzGG)KHJD#yn z`Bpz!(M@YpS22d*-z>3*UaSb9rVLZT0HDk8+H~*yEeF?8=%E z;Ok{PQ{{e#UoWUX-WYc0Q{|8ncmErT>L&Ov%32N5EB^I}_vwhG%@fUM->67>Tq4K$Z_`*fCk;eTadRWICI5@Yq@a*O@ldJMEt!lVW|d%+l0Zc4I|<-(Eu}s#h$GYPL(qxGH4j z(2J|IUnb8{d=vDn?E#tIJ!iKwxKciCTWwPEo&ycm%a7CEM8Pc_?3 zT5Gnb@}lOHjx+0458Lusu=9Lh_0DQk?G>X*t31OTTlW1$E%mO!glUKD27F#pH@c_i zW8d?=SIPaNoYi~$KJQ^I13#YoZR6zM9yBVv*=bk!e&YZ~jr&G1MJv*V7sNbj9~k?g zVZxN4TXn~@$Nm}^{oU+xwQT!)!Fn=#2g%6ve0s3ns5Y^wY?(}IQzNuQ&Eld*j{zA? zt{T5Qd;LE4{i)VkAC7N&e>L6pOR-7S(uEEUFZXHa$Q=Hpl{imdr~Bf%bH5dKQ<^9v z=dE6wqSmZS@#K<~Z`T+W>&kYulF|9oY~VZ1Wvg;ze;u#5wf&OCvL~8GwasaeQ5~1k zb>C2{m1c^eVfM!^wV&48zolHt{>93xQ}=pgwE5H9cd7ou$zP+Mw0b{Vr%RsMa!<$5 zukwR#xWA6-<+bhM-l%hf13s9&FfGxL8$H-O?&Q#q{hl}|5BTP_Sm8~Yo!g`635hMn zCBCTFFVv9P7g3g57yCHJ-1T&m^;I{U4p%DbruL1!Vza)5yKB?I$^A^0r6(0m{j_16 zdr3(^>X71`PFu&cFm!6ubE0R@({Jwg6#hv6c4oZW8;{YQMs--@(%}E5d6a3d8<*BD zjJhy>{9v8>F;S20mrdJRx9UL6Z-KJ22Gy(^Jvd@U!rp;0t%gpikXMaeTQw*8shx|D zUi{j*U9*D1I;N}Ee(TrrebI>4F@47NY#6b-GNq|akVC}56C*b??tD}Gr`!-F6~!)g zbMvrSyncJo{RP$wyZg@F8ra2l#jVe6F8Xix489(kQ2s4uj!BBgG}#G*n<36MtuNnp3s2X1Z==z!Z+n@tsjfBZrhT@5Zc(J)Z+m1TM4)7?g7vGy;BJ5*k{41bGIDp z_Gk{(Y-Lh1r_0MbL1&9buT*|xd^ySDly>7shZf)P({uCMEg7WLF*Y++f1uh~m8T7( zT4}9VIV`O8#4bCQo@iKjuuy%&-Oc-lcXv>}ZFldpUz^CphHsx5=YPBBGw0*|&n|Bs zzV4(nv#dlmHnFLGai5mf*DP8TWnSC#+N80S%JHusCz!R^+Fs7F^cJ#(qT2)i2y9U^ z=H9xI8F#<+@2T=;>@V8qN=_CwIYxHr+rH)ZlJU;9euXdnHoZF>(-?KMYNSlb#C9{D ztap^TP@r=+WuwLX+EdL|DtT*u{Cs2Psh*$uWHwJp7}V$HsJu3p6hhw}4VZQ4qw)F! zHm<+aztXv z%r=AVPkQbfJhLix^PG}F;oHXyn|I+s=E|FYuCMIU*yL=F#P@A{C)a0c14>ImwWb}3 zsjh!wF<{!mEx%{Tf1J|mnfG_=nL^oB*QQggI>-j*I)J9N9O-2Bz`&evVt zWp_3+*?Ku-<3*2VJtxT&o=};S|HP_hz%v=^DwoO|PYXWyX?++j9IA3FZoln8ow}Dt zv**8OOgub%<&mOUe$9{RH=kF$Vts_c!Y=L$Q_d$$e$#Gw=C4DvQ*_451P3e$S-Eu5 zvh`2qj_XmEb!BPo(i=w>lsVoWa#>MznYX3v$c)3qWu2!ixuY=P?AO^!I~F!qAD-8& zyYld?$sbZ?4{yO2sQl9WN;2 z=Inzl1Mz#KHA%&p*9yx*Ci(xOnA@k(WPH3^|9Z>8shMTlt4mreo8P^i%m~jt6H63ih74;FW)~WI zcF~Z5DqR$KGdjtCD>{D7MDcCq`o_!0N8i%=a>i$XoNVC9X4m^KNbI>ecxGMh zz2E*=XKc7^W_o(Aj^>pevYqRjU%&oGuh9)(4n6O4Br0!%!;BXrvQLbWo7nHNg69Oq zU8b|gwO=}G)Zws+ySp3hGdi$;ThiPF-(1BDnZ|9hy?=NAFkpG<>??W4Cw`3bYIW6T zPDA;}IbWXX#D04;WLp1{lY?qPzpaa|i+Nsi(yazU{N;nKdHsOnSsc zZX8f}I&FLf`bskP+tl8yTPic#VcBI@h48l7hwW;nn@;EE{Ys!pbM z*o@KT&A(?(?CKvnyJtw(=VSIIH;$jPJtSmf#keO%%CYv38Y+TZUuG_z^XdGHpe=Xz zl|6rB>jfQ}+QP8V+#=WL`_z!?mUkYy&E)I!+tviQ9zI`m*HckR{kG@+hMrA3ePZ8xKArR7vXa)fQ?0F(H=bYq zxzXc-{Dej8>Q<`{P-^{2c8vR$ojotFmKoG*k9Xv;L57QT(*okYuIbm@xKl&H(QWs1 zWv)IydQjD}wcII$J3|b((PZVAl9Qyu3%98o67kv+9@X z;r;W!CoMLg{dT9yUHc9%l4@_>sj(K6Bi(A=Xl(s<(86nO%@D(B4Yt>EJ=)~$`<{Ep zy+^&>NVV_vCohq_52h2En<*Mz^sKMWKx3@FhkV}ZUuUivmF;m~xsO}pF|$(3K|>U~ z?e3pvyX~Vxr%g_87P>vS?~}H1mb}NvG~KC}gR6BP@4MVlUUkXJ-sUv(=Anc5jM-}KngW4xz< z@5EJdt4n%~80;BbZ6VirL}tn49go$}l5Q-mIGZ{=W_rHE`%mAej=T9@V@ZAV)o*69 z87m%sv@3m5kP~jv$5H9M(}xK)`dW?OZtH8!s+tr2szq7)Ev0-cqA1?_6ks;x4|l)) zb8Cj%Cu?8MYHRlXxa{_^$Md3Pvxk4b>sd5);Pk$oT9%bYRL-0=``f*+qezUE``cr) z*NjdvS|=PGC$2Lv?U6LGO&g!m!E^5&-zfiQK<2Xr8kcuY@ICMTx@p(jpa+q|XSR7+ zYj^a#x35ET%9pH`VS}osS;VNQXcoGlum1g|+}Ni<@|G`b{ns1(S<~@G<+Y$z?mCeL zX3zSyXdDyy`mWKj+^UDw?{CL^DJp4jRT9juxlH~%XY|cuBV}aD>U8Vd8lJu(+ssrU zw_<+N9sQPN1?GEpXgs(w)yZ%`e!t#1eNK;^b=&{U{mSAZQ}f1x&u7Cz-hTLC-M2J; zK$=!RyG{yQZL)K$Z}uvzsZW_}*=qOBX3zp>=LFKbiW7}{AeSu8ei|RfFCBMXdy(7EBb9hkK8rQis^Q&dO zZLd9lc)O-X^+C0ZnYLVHdhDnn)4hEzKP_yfbfd8}b3oJ-^S(1JQZq;Pyr_1^(O_)i z{$0O^-|p`a5x%b7)y*4z*NigTTTyR~tt%e7Iq#kBRy(}^Xsa`P_SeaE2j1OYQ5*Q= zgHRXvGO(@lg4qt%Ya?F2sLJm1ZGHY*8+nZuiur+IvKn%$8Z$e#tAFxGc)OyKqKt~J zw@bJ5=`i_pU3ibXPYTS|#LvmyF>OxLn7p%A=3a^#{r@y6ee&J*c+bz7H5zdjCtSXm zDYLbM;x+Ty9Id**x(~K9-c{#pzGePy>WJe3r#^i>KHR=>Ly+009_QYttoZmk`}>HN z?zVTw_R1cz-)yC!lJ}<^Sr4<`S6ofKJZnFz54igz^W+~L$C-aKyOve4DA4SiS?B7& zm9fUhBkxx~sf+pK*jPQR)_1FnO!Erv1vp=mcz3f^{@7oe$Ml_k`#&wrLewuqQS4XVmx39(J~e{lU)`nXQXL%7SV-Y|&7?lX|LJ zxkaG7YyO{C?)W^hGo2*kQgFy2rC@P=tGik+&C2pSHaDA;k{Vf~csZuL-ssM!wy#1H zbNifXatk!Gom>@Pe<9a!cE_1!^=XA`h3^e6O)&-2PJUk^{^4I_YK})=G*{YT)+zq9 zi|N%2`OP(59^GB$H`ct^tl(+j?8>_PcIJXgy``y_Vxyh8g@)#-XBVG*vVEUBqOFGRU3sCHjK@rx`Lmr!{7V^sRVU6VhaU*txOx+n&2`YCe{YlzDc$;K{63 zEltgH`>Y&4)Ma^}fwwE{ay$NE{vhjwMWa(r!0CDyyLRd|HDy{t=I419bxFfB?(VCX zm0z=IfXP5(xf3<7jayWr*%WD`|K92Hom;gEIroE3f1lIiMUaln^qf~czUI!oSM5^Y zSZ)4HXVZX-gI|4$7wV>#o4WOkDScXBUw>QH{cyu6vp6%abDu0#o<6L8Z9YwYYS5Ki z*T1{fG~QnRH0bU~w_KY!GMbuZE1X|iXH?YN%CEk;_2u_^gJTZRaa{Vm(bWn(HREU21M!nADmRi#smCp`+XT`@>qRAlmDfl$LFiL4`cCR+Q z>e2ZdfgfHyPBh$f_U_a-YE3U~@77g+w!hm+X0M5SbYWTa)bppmX?))tbGB)PtJ~d8 zpKmqU{C^GUH-%0H>D2~vZzu*}tB%alg~|)k=4pG5z_B||;Btg!*!&{i+ThN=ZvUEr zf6c(ZX5e2l@UI#8ziS2<-2M^R9WL|l0sl{f%s=Aad!F>%Kfdq30_p#p?MUZd$_07D z)kz|7O|J|#_sX;e+WbH}jO~8_zf&mF@dt3loD8l46VVytKSKH#M?ROY+>pDjKzE=g z&>QFj^aln4gMnedZ~*nc47$HEV}P;1_#cqND24RgxF65q^G5+pqkjj60E2)50DcT! z<~N`h@GH;_=mOAgXfw1G+R4xM!S5rr-+$QwCgaELXRhf>^erjRoKJGhIVQiH_kqAr zfV_~;3BXif7BB}`04xDk0IPu2z&bz!&;qmpT|fuW2lReGdTulBYXcjB4Zs>e4Nw7; zfJMMuKpvO@Oa^E>v=!PK?T$7``=DJ)ZG$%Zvt39vgWv!E5B4DajvV=&TLR>pK0?0f zH}q-xGyRHO4+1!+S<0m~M z292Bel;`+ZuR%j^;i&;NFV_?3SF}ndDfN_JiUHuv)5unYF1BL^G0mg`50cwKO4t~~ye+FAj`P*l3iE)uI7b_iS60XS(pFZ9wnAH&MP0x+6YocTn7Bx(anRTaPuh3t zd^#j}i>X-?z8K5RC1Lgs=137?NI0&E~^Z>d5?Ez{*OMv|Uoo#^J z^Rx0Z{{qmK`CSG8{BE>$#zKDQ6~H<`2QUX5fbBpaun&j_lG=Cfa%S{Qg{O1ZXnvo! zcB3$VodgRpF5a+7SgN^MP};afSf;gEP~NO3tlDBAtkN+QRCSF6b$t^-UC&q?SL+)K zYB;Z=tt%*R(h-(xY75IYXbDT#X$p&0uNUTne~ydSY!DXxzyh^(!b0_R!UBLcF$Xp= zmv*vhji@cNX=ecA$~4#*ZDGQKrJs5a9#+%5Ws7`#{xska5DkO?%okh%sU9$YR0Ze< z^oNPSXkaM7oTwK-8=w}n1^&)9K@ashyn}sD>TZHA{LIu97rf({& zHZ&F18gCW3-bl_Yt%c3x)yhH8wRIG9tQ`b>dlx~^&PgzGbQ6r7-30^O=dr%MvtZ=p zE*Ltw3MS4Tf-#Oc8ri$zaaTdl))~(Q?3@LCK-Y%v=O}1dSP2_o7ixM&g7QXuCh)!p z{8J|uQY&B|3s!FsZD9`M31X7M$~D3)=*4V|!zNFEAlt4j^8@NYD6k7~2W$XifO!FR zU=c72m;j6f1_JaU#scO9^eyt=0{FY!q_#+HY6CEbCI9@~Qr%~4n+fpy@q6<7@_W+< z+<={}+qR9HFmKU=C7bkwrJLY;n+=2&fGT{OSOfpow6GSm;H$)DaswEGS3_`U>gpxJ z%xybHPr<@{hp^SdTQGO?k{o;Tc)MWf=>vGMsZDILvV*=@3u|GEj3-OiY6?pjM?`zjkZ1zzV=m%{0%FB1r#yD?)wof0RFVH8H07YODAk_f+P)|S_2dDw`x4+YkHbA?S^4}fDzX1aQ zYX5kEcFj1a251A+KJxE5WcQW9}C(E-ka~sV{_P+nTsd%0(wIIaBvm$p%v5<9UBK>v$egj5gM_^ zzyxsv_PbsSnxHAnhfXjy%z+&!0`jWs7#kXY8#=rg-oC{0=#sEWs ze+K?(kJKdc|BpHUFq|6)Oa~SKD}jxG9(pW+b5?7-SfPh`V}532A*?3nX7KZE&~#fT zLEiy>h&ear{DXH3__PIlc-wYxw!;_P?i6f&{Y4(_eFFr0aBR0LP_W+_Bsc}^5gh$@ z3yyv`7DvgkBOc>9!WPeW5TB3N;`O49z%Hz|!!BSO60O)SZ1ck3#NXZO4t;U<1l$ly zTt#~@u*c^VZGmx!+F&E*Bg|2h5XTrBs0H(oHz*=skjL@F1xufyc4WRoKiC4S1(pE{ zz(n9@{bwHikNQua`#aspzbw!Wpbbz1n76efZ>QDa-XuzbnJn)lIg- z*AZhakcT0DQ`-%w>wu~2cF_kdJa>p(i$3kM3p@viygB-T(_Op4?;hL_5}X5r1!w0<1nv=>@R$q0^WtLxcsw9jd>`5X-^+d{Y+$FqXbaR1YJ{j6uro{OffYUn z;|h<>VFzaTj7HQX?vFU>-OS7!FKm-L~EG zIqK`LuQb{U-Ytc7=GMXnOXTD>m^aL$f#~a!SZ+z5+wKEDq+Y|X$qjte5nPiug1nPk z*Pu|rZFiX9z9(F82?`NMkKlhhcH0w%=Y`;Tcn;3k~5Jj zj8eYIIr%5A9wB=L^6n;b94dJ7KDg(39*g(!m@CfxWdnGvD{Mxh53mEq4QPo2;saxV zs0sKSj0w~q<`WhkUVr5Xrl>K@kT)7JKY$(>*g?Oj17dAyjr!6`tS{FYnG5S-1FH?q z1Xc7UmLopQN1ia7{R9>DPu=_U)4@FT2k0}*q3J`csic1Ycjq1-RlM$)4d0Kaz$g5Tr58$ti4@B2Yhpe6R;nL5K! zJjQ2WZpa*wV4c7mU@P)M3)T+co&1}Sd-%Q~asge~v>tLo9r*qh_8(Zcm|F^(rWRs< zVGT536>7;`c=!&&se0PEzCilfZnD%=Zk15+qyMCU!qSDe`mkP$CKR9s}(on=Q5h z@Ov{$VFT*K4Mt|ddiE}m=dK3#s_0d&M7^VeaRqdMHn0SJ%tae@glS7xWR93JU5<0t zf5hm23eNdi|Gk^4iKVwXV!Rr9HjMQe(ELs8*D%jRU8lz!AM@p{09V+66XLfM?1rNQe44O>UGe>_ zy}a=^;LEJ}!7E|n;EY_(Sug>=hTzl?aa<36Eb?l;4cuCRS4&|tj$uo+#;;ls4eywl{B@*9=4K} zE_$5W!eZFLLLO^w@%s1X^q=M2T1$rzRWmDLHGE(##tq1U#QrS$tnAHdqlcmcf7uLw z(SsiuV&1pH*X)qrGxw&yQ?I>3_6gg=_6t7yqlKLjv4USzyx<>wKpb~P#R)qjc`i11gGYq0#G}IgU#pNOtLT{t%XLk%l=MwZRSYed z2mbAE8aB=YS3~F5FxGEFU)~A1G5U0-9;oL~$JsFcG9JU%JmA~(Gy0G>e2Q~O|K5dp z^^cNp9Tay+JSXL!HX-3XUf2o$^MN1w?1c}4Z*ROlAUa;y9e?OAeh=lH77pg*3kk&W zlfr@Q6Mr4^Tuf$;Xa{jwx#BVHAv!%*6rTt? zJOJB^h27#aP-`$s_=m>84x9t11;{nfbD|Bfc3_{8eMRQE#+V!S71=Y;LoTe%ngO6z zu7hT-Lam^JUg$C%tUVZ7r2Xy5#|MP(r)t=^2%8<;1wCgk!H_*#^k1#PJGm$CQtl-_ z&$)|%FU5$uPJRPp4+{Q3U>rv9NuMX@v-C`|cjrhhKms%jMH&6?ZTXKCtv;pKr zn*ip?Yq9R}Z#G~os2FW^|2x|NxcA>+<1B23UF)NFXM}Z@ZOGAVd=U$omw|iM-JZ}% zFT`Z>PXFQP7Y)A#&*a<>oCo5VV*q1)Bx8Im<~<4im<}J#1J8v*@~L7W`Sckf31cGf z|2R%5Jcr}6LP}wYaI}EOXK;K@d>-vW`aHgl_Y+|c2VnsBK}yOKusWGsS!W~ z>>vWML23u&Um6=|2aF4}1K)@kd_Tk>=n;Dl)HwDc#eNcdS;#}F1+)XMFEBsgx+K>Y z^w2+GUBp>=&-z6`H9C)x*XKx!|v3)%zqf`3b@ z4RO!~+Cy|kwrB@pjsPv#2U`p~oFeQwa0K~*Bqjui--CH+oM;2I1KI$4)3gKXfTXtp zzd%okHo!GVQ`9|NUy|s6qqycJ_K(pUUt?k^C}W*Oj0L(TuT_jJ*kAwK+%`J6k6v%% z{B5(7C;WbgV1gc=C30W-yglo6F~>tM4*c)fEAe~kBzg9S--|IHy3a8TF*Yjw82tIP zsMiVP9sWrqougz@jdvuGH?3c4WL0P_dL5PS~WKs>Z3Ix|~{M2@gO zB})<)UXK zfd26ofW2epgUq8>p?}6)KuO>1#NUPdjrQ)c8g{M^wMEUB`2ALJZ-e^B26>Mw`?Grx z3q$vcc^-L}_&)17#{7681UWh5EORsJFny16p9D^l!8!etI!?aRz$dvQ$Hz)9ivE1; z+(jX~?2?dOa!KSl=X|Aj|9E+YKpZQ-Bpk=%Jf8(S$u5)F!!g)LCTt-K@5S?(XUl|C z@{hlDly(MPk;V!!kAyB9Jf1HcIDP_}#2g_9HjpVq;Ir>LihALQq+VcdD2WG>ynyjd z%n2|TE~rP?!{&OG9r7Wm4On7ri8-OzOGHknhkBTMTbK_r7g!HFVBcI>4{HcpkPjM| z>;D~WK*QcOLCfAv&~e@_7((+cQ0G{KciUa)sUqGxLHj*IS;I$&`LU!Hix%~sv79v+ zd5?o{k#}j{M&6GWNPL_+o&_JyEIBXwbXMsF@L3`HyvQ|p&ACt|Bid*}4)R4Y zPh@UzT#_5W7MLe8CeQ|UA4o(FBdHOX=djLk4}lGUfA$L4ha~^Z2P8QmZ2)UZ&;oHS z3Aw-)D+ln;-WhE`(o0*8Sg=gj_#FyTRt!N1^`tKnp{V!$m{i$vbl^&f}pxiO(NK>?Qx4?^My>f9N^%nZBM4esakh zY~g3VbHP3NlX9H{u21~nn$J5~c};vipF{rnyd2Rss{T69$7nB%Bm7$uJwTkG<{(#K z-fWT*`Ka-X zJ$w=K@g028??Bw=cjHEIx+g?DLnzW4@O(Hqie?4S;QBiF!~W z>HxJsnlCaxND;Z0@XtDu@rgP>#AUNipbemJ0Nai@nkj_;s1-vFCjYR3gJP{CtqnX` zAENK&jP)qmfIapdhqdx!}V1JBtp#gf*ThK2jG`HG81GWk3*ee6y7wZA^g%tlc zYykX+Z*p)KbX~R!2B`JSy|88rEwe`Kw@1%|>$R+h853DAF}_EpXG!WQ@_#%}%0B{_R3d=fbuKyJhl$LWX-$H*Pei!q!zK6C@Q9W|Wi#rMGb zFxJzb(~;*%-kZK%A~`RV*jHlw ziiHkDlK)injbQ7H1K~-`3)v?)i2C**>O=MnBgK5clR5w!;9S|!Z~p2NVvQNG)XWwA zA?Aaq2g$!Sz&NlLeO2ayE07B)>6u*npXOi7!F>dEpT4i>>?xQ~`#ov5-dH!^E!Oj5 zZH%57k9l7~IAc6HFaEwf!y)i@ z1R9ix_dJrv_dg}RulU}mK{zIY>qB@v0k4Vw@!A96JAw58Y?-l4+B1wwLoRqEP3%+b zO->W*0`{Eupq6ESV<&1H<^;?MJ;Nk*0qa6(PH00PLOnn&Fhg&^)CC%VeFfat%v?|d z>&ffU7g$XjfDS0>8dD2+o!S4`O~cl$h`zrC^@<^UpZoK;C(kP^617i);1635NjwT9 zi@r~PU=NM@NE?XDU_A{!Fn_d#gkut}$P?!?4)s+mo=dLc@%#jGin*un(H7F-oAhb= zGj&|5@h6e<5vQuI3k6qh3Psndg|jznghGr(*Z&aC;JE0Icqq+S133Q0jKOy>_MIv%vg`Ua|n)uFf#XJ&)Po*eM|I- z{UXs9LQjA_;vM2T2kOG$z2Y7uY5@0}Nb&&kk2Pp7?o-AdSJs7CC*U4-X^&VFy`i-x zmV!FgRk1z*8!)+#wW9x#wc?F-u1hvpI|HL5I3Ex0>0{)Wx=Rl7kf$+sBTt3kkDQT5 zq8L1qSMqxX$Hh2z_SPK?>zL)gA)He9H3Dy!~&d3}B z_Qo89bz%}Ui@8f2Y;-Slo;JY#wBLTLWkB1#_eP*s&9y1X+Mzc_uh0m|T2a`3^g*S0 zAom<`{~_u@_`NmuzidMez`bRJA?iV{4{>j#v=-!=s+!?e^n^@>75eB88d_-lPY8gf zt;=-{?Ah9cJ$vl$xgxLM&hH5RscWozxmFf(FiEWIIffz*&`)Gq zeMejy6oJ}^n$L6Gb0%3M3KVsp`(IcKaIKIzpd=5(IwAT&+Sc}BFM#VqE72F`{%Q7w zu{L1!-_1YvaZK8P9t`VFToWHX!Qv55CDWxhuO}C!E7^DYz}cv3MWHWjJ^K z?gQcco%4VcYyehI)J@l_5-*+#Gc?9L@$>Yhtv?n9=G4joM=SaUK zH^jMH5?)KdTRC_m=NG_lIk~=lPdw&*a?kN1`3LW`gNwBfg$o!7+5qi=dLVgUi5>C% zq;^5>sRw5mQ+~1osV2})sZ%-S$QRIC%tl=*)+ESBs0B&+Tt_Gt?SQtxJSPVI;>a{f zznFPZAo@eB3AkRw-Wd0!bKeX1z=&%?E|NV_><4l`sknCpzP| z>_L>m21G58)RycavqwP0Bgdr;uum-ZilGDa6V?Tc57HhX_Y`s6*kMwxZK-vau3)O}Cxw?SST zKsyGgZRDQ49p?1(ed;0mI*jwwdvc$H9*ndHC-r$T#zR|~$1$dtR3om#-^p>A$U8U| z{g^yI0Pp1YflzVpvB(+k^O%sHuc&<_K9|q0xW~sOsKj#!+6Z4qdl6#=M!uHXQYO`h zA2EY^#CRdbAm{<@m0&!O_8~da7T7alZpif{>K^+V(moMu#Awutw1F_>#q15SPb}#R z#EUf{d&FEXrU)p;95>N;(ZkM-$W+}L9pX6^mrmuC3zidVcNU+-C4Io^E06L zQom=tM!zBVtkF(m4vViMzF)fqUqej(gL%6|_o>y?ar*2f@(sRt{}MUGF?kdp$2lpl zywAt@+^YLeM2^Wbb%3@&jxXGm=)w6r)DubGAld=^pCiwe{;&bY1<@`sQkz&mQU}OC zM}ChSeyeZhTl0*!5(rYUU#T%fOR25Vd-YWDgTw^8}0D#tB;s( z;*GvO@)Z~6dt$AJeim$(n$PdTz87OYb?yjyI7d%$J(cS>sO8}I$4aqgL(OM>4$fJl zvpz4p4$Z%bSc`dO+@?2d}qbCguipK9M?=Q#hzjA8HF8e`>*8RaJ#>i0rEBi0ssbEc0hgC)4+QN1k6pPBj`8?q+6YHH#$$3%8=#%=m|zY;TaaoAb%uF> zr~@3qyO=977U1(q>qh2=Kj#Cq1ID!zm##|e{f7;3{{iiQaex}YIr=#c{Jd7gJb?S) zw*QC$%mo++xMzgDVO|qO8zBFtu2^@$ej!Ou&<5AZo8k8obZ7%t|10^|_uO@XzHc3X zeS7eI5AeSeJ+0la*-+7bk@JE31L)x$Vy>T$-Yqmw+;1c5KK;Hz?62ilT@`z6%=2gi z)Kls!=a{@pM^V4&=RY{Eybn%A?&#-_glmtU3D=)I2Y=xF(Np2t<3B}Q$H;U4b|23H zx7VNpd_DC*stM$t$K;(hQHkeK5BRr4J-~TtK=}`Qp#L*=h_--SfOP?L0_uP?7D)3# z=7R(^K-`y9R4S&_| z&rR}M7T7zAc(4&VumS4=yrxpTp4w=u>3@X{nC;x%o7!)VwS4mL#<&j~4ZwQFZsacP zZ&SypYX{N0<2o+2j&(lQXIS5{r^>Zh>b;mZ(eI)6%=4)8^eL&&U%;{G+xI0tOFoDz z;{C_M)d$dY+$YaBpS}>T!wzo14z4|Vj^pPz#yLDj+u&o@o=A?b(q0}v7p^|WIdCnp z54;ZN$Te+&$D$qJn7N|V2BkS7ZGm76kmd-q3EF_PKOx37=m70NS{JaNoPJi)BccW{ z7dU|40Q;S+lNdXxq0)V1fpOgTc;K(=3b=00>)7r6uzwcotGw==8o>2IUL(zQ0rmwq zU|nDhdP2(3fo13i;MyBrNBEz*8Se<#Y=T3zZ`GBL7#A?_ERA1ixpj7rDn=UZmdNq1I!5aa={NG5=Q{fbWOk z1$>b^`mo61L-;T`#C^%R7b5S{`}A|#0de!`OX1eDmv|kIc@D3EZHV?j8^QZhAAZ&Z zF-O4rU&h~NoRH=e^nLO#trMvO(wac55AmI(IzT(1|4VBEu`WErd=P7!KXO57O~`zC zA8ddcum_sTJ!I^oa6h~^{Ee}|nRyq$JwvuW{9OX<7jwtHVXO_&|HT-<{UO+MugWz6 z*npa;)#m>c`FOF}&OJxSzZHDn1)s$m^`3t`);tjR#acfV>od^(gL&xNi|cgQw^79P zT4+9M;aud!l6>zfYNu*3x07-&_GZ90eg0D21CjSj$jh(5zs1;0UciGG*E!NhML+%% zJU$osB)`>vlH(V`E%00YXT5L}kMTZ7@fgpM9!u@v=2JWdySRbz8Z<%F4CuyHfcz88 z5g8LIVUMgOnQKrBm>V!pr0+{}Lar|`mnHwwnwI&_&vAe~uhe46T5{5l-cTIsB(94^ zl7Fm=Fdt+tDE5r8UgW(WYenFndxe+>*mEx}VC@Y}hX3>TZWssnyD0pf6vhBvH^RLE zYG&3+|5^TxyaOIv`oZo(u!j{npErCz2x~js+d$3Yo@lYwgH2QSxj&D6p5y3=Mz*xNhjfITw3E zl6sK)1js*YLGia~&>t3K0P?^s_)Qv3TvxpoeL)rWgbd6d|7ZBO@CzPnM5&NauPwvHhA8}2L`N(%9doj76t^)b+Wz3_br^kFr?AfBHa~`;Om$4qT zJm#?!^L(nJ8uNc$$Sfvzm$2qrF2tsv6C#q%U_HH9h#->B2$4Y4QR#RN#}Y(ij7}*L zVp2=QF**h3e;^W%@wLSMAMdyKaFIZSA1cCHZXtRx1z4jxg|*yMSi8u_+U-f~O+A4< z$$41Q%Y`PNfIgqX`ehN~b_wzw5V}P2;HgQc5F<{7l)CMg4Le?m z3iBL;c?Jg|2TzOqkh2)@NM2)7C1Y$_i4d1w_7~za$^{}Wy%Z?_@m&0kQ~=M7PAL`7 z(RM@|67AR4D%a;Dpl{Ps0{Y3ITEXu!TIV|jb?I2cPetE04eR^I;KRJ8jCnrxE0tD?bg&j+=nfTeID30_f(#!U>~#+ z`}M(BS|PqmF4n=*vHvp_>m2F$ZHGgGo>R22$u>gRXdQtu3Vr2xTrZM<>jn-ATfLL8 zhw!Li>z^t(1f~m)yE6or;4G{$9>?C96WBL=O5`Xq`K-u)d`6j&ka=DNZQ?*C02_$= zVH2@w61#{IZ2@)wTZo1&MW&n;B9GDrihgK^3bAWpJJ zd<42FwE@66bp)sbSPL=+Py=WK%mKMifVF_+H}0_a(%A#Qq2em83o-{# z71xB!gjL4d{QpDb<3(HjLr+=yLvN7xyN09J58n?;K)(|D#PvPad|cmQt$!f_fe5|W7lZJr663t6f9_2h2S%X2v#20`?v%9gnjl1?mMxL zxGPxjM4!nMIfqvOuKfVQUKv<(%EQ{j3Be~4_7Hap>&%5B zrwLi-g@XV`5g8J@I6$rVNh7EWF=?;^@Xr_#iI@S-u_`Oq5 znqcFXjP*~zHwk;)lLXtH2eFqsUU1!o^&3B2-xL773B1-Z(*gOg@E5&Dfo}_Z|b|dj{G}gPnTB&_N+mVg2BD0{pewbBxWEF zjX?exhTlmHMNeuUelH^mpDP~re+XJ7;odbU8TJ?`EZ(vc*E0kPp0M4Z;5|Zcc$g5j zf1j{7GD6rN9VJA>L<>=Iu|hP){ZZh27k=-_-CMBt@D_Fj1PH;Q!NTs~-GX0WfZ(&s zPw@7~9PY;cny@5XBbWz`J`K%e%s2xLC>IVLyC5PV^8#$5Tu6W|9Dq(xBN!{F2h0&- zQeg+k8={iWVSh^T|0_S(h4}9nn1<^blCa+;S+Mp^1lO=ff9z*RO%}LkkFX~!6yIg9 z5Do+dqfd(UQ3up$J5aOlkBSt(QzX9EJ{*Vb+b8S}4Hf)%2MIfN?iAcSJ@Gw#a4krz z;1QlA_{BykDzOsFv+&Xt=l1xi7lV*yklip*DEyfZ{ zjIsCLKm`k8L6IV$hyntlAl;4y5l{h9npm;-9yN*4l$rb9op;~6>wSOwaE$RYxpQNZ zJ9FFu^F)@j^`9{tC!x-p4DGuKg8zkGWvz{dURR6FE6y!nZa){8PTEoa#>Tefngtz5m@R;^uYdF#;e_?nG- zjIm!e9ALLM7-)Ai9BOyGImB*zeSp<(ITQ@7$(FQWf#Z{e@-85v+(OtnW_4RiN;dxIf%JNK?RXfBPr zkFoHW1m?NMmgnZ$V&Kq#~Wf63o2acey=Fo`=sn{HRuZ8dj zu^{m zs|yz`Vy%|g3h14;e!UfL+GLwbORaRv7RxUzvL?O8+fQE~XuoJW+J4nC(0=vq6uYZ# z{HpaN`{g@h?T$tx?CwSbY-PH(Q<=%9Uy4P#>&HZaGnv>?%xL1I!&d;|E#l^O+pukqHS>wJh8D5%= z9tnew$4;FI52S*fFxTGg8DK5DLB~E|NsSFfzGCXmhJ`CI*X;wf7aU0ruFeAbb4IV+ z(C*lPPMi@U|M-C8gemu}{*8=^`;kw?oV^36>rrm^Wa7}H!{%C}55`!lUX#GF3*+o5 zn%H9;dOwMrm4*1DspK(bIoS`1U1@CwL|VhH!O%Xz(vbIM@cp{NLff=?vu&-avTZwd z*v>t~2#QPX!FPt)&l>yKovhuRtpn|@S3j`dJo&o)y8g5F>&ITSyPtd8?rbu|?rJ;L zt+Cc}!1x(fv~h#2UPrCyaxehWsTWR6w8&YrZ1S|JHZ5{4wsnis^~(x(kte>xmgakS zL3%; ztIbq*kGfagv+iAU&|EYp%}sNB@SUNSSGd6{s;jM}tjzNHKIsJghIB!AB(<|av&gMo z;B>5)2j1>98Vq_L@I=8F@|i;X2TUa8j1dbONgQA}KA^Bw`i-CHFcmwE@X)`b&lq7# zeye}b{#NY&Kl_BwvZ0(cbr>9APd6I?Ug2nax7TFrGAtbYp4sqR9QTpzXde)s=45~B zoTccm1bd~!WE($yu4Uw8TP}QF1ka1^J9h83y$251!6Qd(&;EV(SnCn?^QNO5ZSQ)$ ztKECweRlu-_t^vW>RG)9ALRO=-T%M?cHe#Xu&yuIovi}w&XyD0x=)Nsw6gN8R7Lod;7$L?L=OD(XUKzrSb?n(Eid(^$^o;~+o&&@@1(%i(qn(L#j zM%eaUyBz=P`!>K&vVpP*;(@Tp8DLS(A;&h++V`7mt-6l|Q`jGD=~3{&aQa#dvDaD- zpx?zHaOB3~gOMu+4`>f4`ga3wO}MJs19lkUFTCAv^^dsk-9E_Ac=Eei^zya)pMT$; zZ$1EA^U<6$PbTkVhV$h{;QRRnFCl8^Htlo zTkZb+cKGN~J8|liojre!y5xWsu$dd@H-}-rv~$tldM8)VGK0KWYy>`j|cZ zDA)S+?ZJm1c58dj0}t7qE$|UqjI*D;(ckhnY;rUy!k#Q&MSd~1cuqWdwxOXG5t~N5 zhC1Gjdu%1Kz!in?LBUR2ww`z(SJ?&Wf-H1__6wQtKmzfg5!090%=i@Ok>zx>Y}J;^ zO4}~pJxK1tmI}M$jehPPbT7Im(Ovhbdv*7$d)FM8i{_-cX^xt!=G=SSOgnbsxRV9x z!eaE|syy;0;o%s3$l&lW^m!b4esipKk8xnlkFn+-jHEY-54}i+(Su~5z4A_9deL;Z zN6|4ax9km`;K(}p_v``c^1?@dE8_F!Q8VX0f&9DJ-rvkR9l z*$&QvfBGtGi2U63W-qrs4?Os=TeJF)J#LRa@uWTWID_k>k3V6Lu$~V-@`#5A9)8m9 zY!hTZZw!9csBo*@x7X1pANwM|G7%p!JSx&6<5KYH%WakD&$z}1(g#i#?6k#oJRo}@ z9*Ae}FZ#zOrRsKJ>H;;)qA16{qnIE_KU~fwin*%hR)Xh-=DlN zAK{FDtAE7)Ud8{nfLO(T7Ljj0)t-8*2l5XdRi8=Zo`pO5`(XRWhNP0ioB_^W4mpeI z_Dt(>U}4V2w_jle8#h|Twr!5bkDWY;%%8W5AAMw(uY5}WXo}sA&vYj~(mnMaVSOHQ za#R2D$KCop{?t?U=TJp2fHR{FGyTgRU_7+^b*%WXS%I=d_# zumE3Ee!%ScInJM3y@?qA##+nWRO|R)1?K_F#RJj>1-sw@_@K@wNJd`_pHA)eg0Jf? z@vr7^_}DS~MT7qCx9@zdi`~z?NXB(u@q_*&p~EnA{}6knML&C? zSucCCK_`3g#rN#4CtKQ2>NT=ke(|#1^5bXh<#)Q|wd^xoxU%2sAM}5lvwsVWBj1PE zUj%-CZG0<{15@@2bn^;2uubE5sc*%+(eX0*Nh%1idjYp>hOufA$8y!?ti_u@qlR3dxYB>47Su|Yx$j8=TFI}UYG_(RP-!M%p@0)Jzrkw zK3iK{YimmOIzCv%*-vhfY=VaemaN}_EvVxG_68$Dme`DWi){_QrEGo;wp#wm>2qgo z@tPw0=^KOWH|?g`b8o)GeZR(izh*DJ@~S=m(#!VD^Do$MpMB2VyY657D;{_RJ@BC8 z-FxlMMuY4Z&BxlCJp=8N%b(b}3l|)3)$ZHp^w?VVNAd+?h?7hp=en!UEGKu8|E3*% z=~Xqt(O*8m^NoAh6AeDF2VQIs{ae_N?{8?g-ua5%@}u9{kAL~nO`QRcj*f3Oia4C) ze>&$rQN(>ilG4#R&*3&lrq5c^T=Z)ETs^pKx*9Xj2~|Hz<3 zNB_y}`}&WcXHVb@#gHQ++24%p?}ndc^Ur?xp@z>tB2cCNu``^rda_<}H|L5$M zf2fa-*ki}HQv7vq_M0{D&C${GocxC@q<%GnoR6j8-w~hg=@U#ZHFA#pXA=9F2mMp9 z{n_N5hTALeO<*s(0-th*L=A33eL37BZ90`=T6q) zgHG1I!~52zU3+W!ZX0{MMN4Z8A2iTfqFmK0cZQ`w~~_sALN%w7kGI9zrd>p>Uco=f}DJ8KqxUx_Okg!g-$1nmyhB5 zO`Dr$Z}bbZZqu@?OV_UU0r%aZfm)CXws&-oRk?f#W>1Z$HG|Xx-ml zdb_(l)37r=rrOzkPrqZoc(|ec=-0^p?N8BHpc6SDW9??>kN$ttkMoy_suWYx+4 zO6X6{^0GD7Y2ak*Gm_fGNpaLElAkmy%U*8Bx$}?^_Didr{_@()Q)ka!v-_8?UUl;S z#h0I3US#-+Xi@`=ms8;9#~uA)dS>%U;`8< zP>f(1c3?(wA?K3WmbGlP+rMg$cJRnyOJAOEZ}ttbfisp`Z*W+8_3CY1d-Sxl`d!<X^%GZr8Z%ftFQ{Gbh09v*OZ0Qt|~0yY%a>v>=m@~;?y_61%Y;DZkEpONkKitO1=e2iU; z7di!)FXz02C(p4#g9cdN0sZ0OzSg~GPjp#Vd#__hd$&zHXA|DSH+U6a=BcNjHN^qs z|7-6m|35H#k$v&ymw%l8>;+}Z;)!WaCzjE%-&p#V`q&#S``D|^yW4XO-?t}TX=M*R z-Nc@LqqQ}8uRHxOhd6Bg-qdGz^Ftne$6dV{`j4GE|L6WO2E*|%G3nTdsD4`lM(d9i6I`FXPb!WYpq0o=`{KM(*K{}`-#`De*T%& z9z0@i^bRtAawmL3=G%zj!)(Z~VK!jEAnVhoA8XmmI(6xcO?c1QSNU15BTG*{^`!mg zy8VCqp;N7B(?*ZoPo8g?xzyZY!%M2E*Q+@S{SRAl75O;ufNX*EKq0muU$y|hP`;km-Ksv0QHEYqr8sZyjZ*%{B_Ymvo<9xrLvj49oPv}$hzxG60qf_|F zPXFU?D5jaYnA*BnumOUCtbKR({O=C17aM6 zVKVfA{$1#uhWsDD8TyZlP5u!&;184LQR{*Jk4)3q?Lr|Fyh7@fheSK`W z&j=elWT^G)&sw5eKj_lc+P3dtE$|KHTRr#EtM;pR{9Wwrjt2eE&nvF!{Y6Xj9o>p5 z!2Z}lomLGP5!=xL;sY-aRKf#W$@PN=p`V{MYSqj06UKgsJR*X>ofjyl0Kct z+2hpt;5v}=IfvXto&9FyShJ zFaE#we~t&F2kQ9X9IwCLeFAf<1lVmV;Kli@FTxzhx&i{N#vk-hS+BJRpBSK4E^D zhWr3>NAU#|BT}4DaRILmSd1^|AF%=+NVkPKtBKXKAAkoYM<-jmk@TNPTx;Vv@A98W zA0S^}8$Nu54IG3H>)Y45b|VglU)bv1cdbd!advO}Y4-CbKK6KPA3JsWjGbrSuXw29 zN(b0qXzy2y>?j5}e<5{%(0=TMK=Yr3o}3=(dRYWU&T_p-27wjd*VoVC1^ROaDEben zqkpe4fzY1bWB!3DH%tGqbCYWW$@>gJ{%1n}xMlcOt5n-fzBlw&eXH=c7Og5W--$8w zGn#78v>0g%(lYP?zS=kMXaBGHNe_q*qze@PmA@;WXBTw=uXGu2e#8$aCg$0=xLorK zO)%d8>fV_{e`1(DMohH#{byS{a>X9%FvXp_^cx!n?G-CcW1p7KULH(8{JqLOLNOM&xt=wD-gZ(E-E;r3Z9Qq?k~z35zT# zJr_N&$;zuLY{=wjYc(RuCMT`60Pfu{DuX^EQ8tVmjQ;55UPHlc^$oUmV-u~>&={8! z@Nn}X`1iZ)Byw>CdEdubnCQNxe5>W-!(^fJlTsI147uOYocRkYLO3z%aiacHJ`=$K zp>KvTfrKqTkujEBFyG(^?gzhg;xy|qR`f^yM+Z#2S^A^@7f-08e`Gp+577S$R^wxV z<*^w3r~Eb5HWgIwuz6Xl(M3`Ac;g|&2B)!aA$G$4brZa-z4IRSPO@u?149OiL#oSAxuf_Xs^}_EJw&3m!-<*bd@>o#+90V9R#&06IYaz$Sb`=L_)uqH^lD z>-L0-5qkXq#f7vN5bZT|Hjqi4;mFXX*2N#6I6lYL7Zs4Zu-Ssi^?I?>I2*zl*aUJM z$IM;HeJ{6RQHyOrXr}cFO0kwBW^z_VKk0sf?kr?4>rumgqMUvHM)b*=f$^myc0lXeao|Nc6DkQ>&1%=QzGsyK;6aBl5 znb_`T=^qfkFfc&zALaex|IH!q)5*W1KRT+kf?Qtkx2W;juyZ%LRfX_q3TFk876g4H zm)gH*PcA;tT(yVN-exy3VZ}Lg4y?Gk&OZ(vK4dA2bIDr>vA23pvQ|UG?Y)t+to85+ zd%5cbd!>^f`9>k`JT`-KxrN{+EL&e?xyWmA)gkB(E(mn5W>oE=K5sW;7kS4!@d0E5 zwo!9f)K~ z#9A-J_uzb}u)v+$4Vn;X&HGKXMt!DOJD&(^!x?Eq_IJ;;^RZU_0xTXsx}2PWlCmwf zp$u8yyv0_R3g5U6Q?!u0VRC@yFJDbx1N9UDBPPxx_v%F@+6x~Tx!KUE+FP2`bKg7Fq1V{l$mAO;fxf z_c5!aZbPGjQ4Za=K=(5Izs=Nilxzd90Y2F%-S74Q`)xh8e_d&MVf6l( zpO%TQxQXAavf}Nkg#-71TA20Q_fQ+U1DvyJmp?6hB-MeaC(WEpXun_)^i6cV$;M0z z1t&hrVWSIMPyLM4J3;cV{vrWUF|H@BZ}1EogzoQ;{}0`*)5vkZ?>=VYP4|q!_q&6A zfK4O*7lHpjJBOOD6`W7k(O+1M!cTYdk3AFpOPJeg_66(9tF09JZ==q0=ZVv{@63mG z@EmoU=fG_^N?pxvFaXLc-P$Zw?hAQU$@seRcjfo!s@Qh|xg2riL(C=yIx9B8<|JoZ zQWjWBi^-YE-)bAT?Bsj!mn-*LX%+Pb)%$HTH6*&0RDs=9N$pVubvWhVK5xN4*bGka zX7GbcsK+VZX=^r7o4H{JXF=O-MZq>(mR}8DRa(y43d>qee)+00TLirqE-SHQ^7<3V zWsgnEw>hbK79PJGEXFz3yjKV~Owl$sb&0Jif~Tu$Yzsb(!xN&;#akDox<}Q7crdT{ zZF0a>1EAVTM|*U>>w%D*YSYQ_48Yb;B-dZ~=$@J|50-RTq9+$T$kl^+Y`-7;;fwz_ zfc%fX)Pi(X{@1AS+izC(y`LK&zwp9T;{P+S|IyjYT?`;)U6I2wP#vSI?Wf*j1GQcn zrM1+;>^o#@H$xk6Ubes!jt7pPwEd^g+oAK9>@amyCqKSoC#c&yefe`cbLDe8cl8T9 z_3>rfO`S-^F6t&rs3BehW@JW|%}t`uQXIN4hMZe+FryPPEHx|FGMAwPatm$w+D*1< zeVMH-Dz~*8D%{B10InQkO%Yf;g%y@t0Iu+Qut?yUWqH)9F_x?WlVMeUP(I30qua1r?k#?KohS2T!=#(IeCys@`xf zb5s4A7mvi%gi#l$+Q3rQL^Z(#S2A;bk;A!6qV_Xp5ptG9tsnke@SIrc zCKkJzumtje)o)18BkO!Y$-Z#4g|9pgTnO3z5$OMZ(7reNzpGy$F^a&sUOL|FHE>>P z#w2q8!_$%fY+_L>R$D6jf8n+YAAdFT5I+}C?^gnEmom13FZ=k*-`ly%d=4Hueja@Se#`!2oS9IAy_5Q)-3O1`4r=eV)#4BAIfN}>Kd_5? z+OZFNu-}cXy7F4Z?t@mn@0isb;4@$i?L0yr#;FVFsY`a`(kFK6@@IDP@>M&*I1ay_ z{PZ(B%Jm5Mtm{E)68E1|{rP3+PJO7xDb*-~AH)5q=4mtWol@0ljwnS(gBP!Jpb_O=XUy2$g3pMA-9 zer6ZAYUp>wYmWDz>lwy*o}Z*9_%x4Ch&Mm^lmYE|P4qwJXiu&21y619e&k*C$igJ? z;8duN9sIB(s&x|{DZVE9Pxdh%nHNr^Y^Lyrg%O;PgHM%~W#R1YX5$;m1_&F#*#qdG zoJ$Y7rMc8us2u<5553NcHqi9EXbxmhc;99ShSt`Z+L$#KC*me(LD{E9AO8~ z1@})Fnd(C*Oo&xw^qJtQxT@-^gdv}V>}v=|S@ieHf5^NA)Bu3RLhXs@?;l1y2>m~p zy?=lFKjhxJ_)XaBmErGt4NOei7nIByKn57*=%yqW10V)i#J(H)3+JN%{KJj-w8iNC zE!ethbYC^~zB|y(<*Y^imU8w3du#`?u}5~`%y~O@@nhuevZKSPIvsEZ-7dW^8j0SL zc@OP9a_yzRbbw_4A~gO4dVgHU58?s6CLXwS)x$fE7tkl?>*z1qyWilu#d~M@E!m>8 zynd4FY4rYa?&pMPe(ACugYLQ>g7$|mf){`vyB|9yjEY?+!7reey#l+l^#J=z_%kVBu~Lu-p=<{amCN zU=g{B!~j-psRaLw+zZAge17SE>3}Nd`%~l18kOT06qHw41%C0aqbHpmIDG!19fb!( zd&%Ny>hzUb+t^JRPk*#SM*RkWAPUx2ok(DQn~cu4Z^=q}nb z&LZz#o8xp3za`pB56CZ-{y)OKiT0xV5z!r*AK;$%an+o*qsyw~-!a!x^!&yhVE$15 zzNQT9KlHqC=u=kG3kJVUnBZy9R9LqTFAiA|CXz5i9Zr^f0(8H6iiq~YixnP#7Y{_*H6~0?uWexKu|BiLoj0{w;Cfo3VcAyirR(lv#$j8R&?N+`2knLve4xj^$ z;Kv=q7KjHVhv(n}*#ODE^tH!!OPAN#0547XyKKDlfQR;9$-UDNyw7U`ygcBgzrJ63 zM)Y^OA6lRM82;n8PkiLrmmI~XlaF%f!;i7|;DO+`>_y)9oC1>${;hz=x8m29?k2Yg z8m=eip;*qcB6>qXyZPvN(OrEA)}bGT8!1c((Oz}&!o%~(KDa={0OUuhznQ}e#=Z(q zO??wo2durH2NMXKSZFWbZz8c^^;H`OF4ri|1%^xsf&RhPoqc~7zrZtI+I?Tw$@4R! zbq*Ac-I}`uoD$+dX`BOR7Zf|ZTg|b6IZ6H{3uWm1D)hhXz%G1r*@0TtuKEBmm~A_( z5WPQ&m@MQ5_w}VYt zj%|}qQ;e(^RUzxpe8mQOf)^$P@#5XCuilN{bDyA4>qFd^J)eQiAMt(B z-TOVn0DnCtY0($KH^Wedun`%#jOT>NGV8^tF zb@4mw`noOHJnZ^nWIH`~EoTFTwzjMSJ8;-xh6&5eVFN+`^1~inOW^_u6UvJjEj$?c zO{$%D`$1&iiwh?_Ag}FrIML)@y53O>(!dN~;PLyA|FPQl%l0eogYNHx@888k|N36K zeVquH1APN z!1J7aJFlJNeWxywQ_E-d{!`fR)A*YDz7rRT9YE(}{Dyw>Fu%F~^jQYDvGD31^pgD4 zD(uu&{Mk+0h;QJ#tSwaxsEC|^4a9(|Z7V!3|4&#^yWs1c;_c($%}egt`#9N$*M)Id z4E-hh!h@3Ew}!Z>a6oj1Dl8y}3CB7LPeuK)91aZUE$S;O*_ZF99t+a_>ZLg`8r>f` z+u?AlzxDt|SAS>s2YjD2zy7;|7i8QvHGaYWo)nwp!T-c3NmvRVz)EUZWYw!iv z;|mm2ZMPEUEBh#YskN#i-=_w9AbE0YjBJ$F?6fMaBkR4-?F-0%gbqi=3-H7VXmtF; zi^O{1i;K_lz(C?ys2|Qg5Efwc+djM$e#U$JXE}UXM;sN2;d2#K8 zV_U|Yy}Dm`U|vix^)eI&h_F*M+@4>4KXzYnA7KG{b-%*~h6hA@^--Jx{nb}hy|z@F ztNu$}i1*M3=+O1_`XL@qpPwG29&drzpJ47sd>NOs)b+$spC0vMT3Ni=>BD^1tq^@# z#3uV|(~pEwAgl_i*;Gi`RBS%WB=nUgCqb z`>k|4@yl)7-F-;rcS5^;?Cs_MA4ks|#vjoBUl?H^HsJ$qVlPmNT$OGIKY#O9axp5bl-IW)dt2d` zYSCuTUaNsewllWzyoNYpb?rXRk80iX%00Xfdg-+)c&m!{SM1tDoR{z5dn$LqchGio z%?>L=*OXM(@O#7~`FxG+HGCl-MDgg8pWy%FA87xl{l92`7#ng3-{c@Z;Q?qZ9Kn6i zTd_Z3!PVlsIGlOtFa0k)p#Bt+ePNsyqx-z)KEeo>{+I3-MxqxRT6;d{_apzpgO%jwKdb;>eINoJczz^R4i9Nur;Tg-$%*vs! z-74^kuvH830fc9)_+=V#tE@a~u6R9zUVjoN&W;O-9~N*{UIhOX@Vdr&&W8$0%WOTLTeqpi z^0~Uf>zg=hErrhI=#=f~l-lDb&>v@=f2qC2hl(qG#(sc(fa1Q2^(h8$n!W$2%lI7d zfres!hw%#~_mcU;_zsE%I9yriFPzFfr-Vz-fcC<)6Rx4o`(*Ql4Xtw@#YMH}Q@;!0 zg0JChRK1La0jYBU>3-2)*y*CZ!vZGe=aqfWdH({}M_K!Q^@0=Do6h;=^U3G$K5o*W z>*e%^d>od(w0}eAtAfJ4Zl%(-z)o~|7KzY-rjNr?1{AJ69%L=-lKT0FyTde$&aU>I6VQ- zqp{f@49F<#emH*LlsWO>ypZ2DajFfU8VV*us149r5AmMv0aH%)7(4lIe@L3&_}%cp z@!7-y;?V&q_^g@40>#h5{?$HE@lTxvXdk$Ru??HM9owtDpkhJ$v7P(bW68$qOjzdu ziU(gi6F^QSo7$%R}|0p&{eec#&xu>JICva87O|F7@s@uffu~7en)rS z=iT#5*B^tpZYxkVrlJcQ}uX9rk;Xg|Et0#owJ@Wh9c@OlL>@@LuS{`QDB6`JtajX02!?9T0;Km`}Vil~~Z?jrg+cWfTi6!lo+* zqIh_@Vr8sF)uAJt1E09I58Ma+4H$0#7@Qu!y#6x;bx?Z~9bN1tj`O5~JV6S+Ty`p?Q4e5HtdY!+= zzCt`8+KUHjxysj*>~ANoA>4X*_JhwSd}G;t^*M0ozN~}x`ojN}-uK4(wBNtx_p^q= z)SZXlFWM{4s~o=oa(#8i8$gcN_^3HtPsz1=EV_DQe7xV~mhhUsN3lNd(7FC8V!kJd z_v#Gd7~duNKZcGM?REa|V*b$D>3q)l-F^?frK`?-W$V?GO1+9id-aFfjLp}6Zxb<4 z>3;Pg_x1$(8ul-8e+~B$*;l+zalVLT^6k;}8p`j`USIxRAozi!@b`Vel^Yri?pok< z(f;3hO_=)lH__*ZejOc9Z${>_f1N`;pw0vrf?=4A&%czImgXu9XwhFoc3>+pkZRUR z@pIV$javM&y$r_#thI6j4zb^t9yp4;Ne6iCf^@c%-@2>xfQHVE&Rj-!^Iq|Y_jT`8 zKAqDe{7o@leUEhfG3j|H@9-M@A$q%Wz6;Qv?~>e0{=G8qrN8vO&itzJ^R^uk?z5){ zrSOfN-^V;ffAyqYM^7;IgIcBG;=GU_EPfq!jk9##r}E{ zXM7WN&IbnjsIZx?*KU7j_k+kqpZdL>@!c%1grzSDi~tif7QZ!Fv8#3J0f8^ieor{S z>$Km)_bFj-rZe$M{I_c73!EgTjt)>v7(KclJ0Ko7K#WFlcP|g0Dp=93MHlJKDno^7%!3r|;#bz?XaQ zQxv=2%~f_^xZgGKZ#BHUmH4J?zB}J>zP|SPqCK(V%AM|v&x7~M8K2_3jAYhJ{ZQ2x zbQV6I^8P$HkHUNh?^kjDcbU8#}NB-&VFx=bP#SuyH4OulPZ-13EYJ#)RG30CKdKwcSrVPUkJk6OaP}%X8QF1)Hxp?@Z!pqWyIAfMj2^cXBVAPksk97w!LF@4#u#{732Y zL%%O7dqq8B0{;@T4F6^2I!n#ph+hMKMJYL#oNKRRPpESNoedT<S2#d|K` zIU6FjSLYLIUm!Y2{S%rKxp;%u+reeH($m{ME z$ewR}(2yURrr-AaBeR!xkH{isL4IgLE`8qfJ$AtB3n>4sux1Co0J*coLZk;O7?tb^ zygZ=m9&Ezi)5PW7-q52D-2PBBQ4Akm5Kl-qNZz$q5bfnJ>MGsf_yyV?hqi7=&e7+h zzvz9G&q?O>J)*PnIu7#O=^kE_4p3ZgFS)#m@wz-8=r4Wm;yc7MB=_Z9T~E+D`b+2Q z94wnSZVEJBxN?ol_foEpw;!hZWvJJO>-B)IFZrL%`JQ6@UfO%)ey%&)8^&H=wC}In zKI9+W|Gl5>ep_09)B9&+E>D=bn7SqGK;kN5f$NK}?Fkk0SjV0~IpUjkaK5q&j1%au z_>f{lHN^a#Er18U(gpN{!9P&WsC0qGA!wyotsBVe5r*`F?1b~Iyztr_Q2+13zF6p+M;~cf%7f(f>XR(c>+bqiH7n-lq;xQ z8V?V6VgsrdkZ-sfU0bVjA9R8ILk;o5ex2Vzvum*fXePe!=9N1?vd*7$JcDdYhiJGu z6wU;{qB}CqUe0Upb(OyN(%$*{+)FvOUGa>(tyT1ppeSTa{U%G0%IM+kpE4Hs*+Wui+>L|W9C4{{m{ysk6z^UQV z`=9ll9CG(x3Z1{{K4vb?{c%M0ioLU_^#!;>4g5x=agwtU6ui;6k#r;jn$RnT-5bapil=rZy0TIM1j zS9?6|cSLv5-_ai1FWRfOk8=8C|8-vO!S(m_`qX}J3c0-M=P{c7y$`hak07Uuyq@9E zU;Vaw6X!$szwu3L{+IYValxNZFR*!bwrYmh8{!kBkvpOF(E8-DUY>j**@Ifvow^~; zW3?~Pd4ZP?ym5j(oYRX|iWlgy=)DJikguTpEYJQyF=elw@bHCr-~jX&-Ni%I>_0bi z)=*TrjoLx{)K$o1COvJ^vMdeXMY&w-wo;c?!Tl+YiOegnReRVC_;nlE!xVAV-rnW) z>pTa#iw~3wtvqk(1I2Z-3pcsmUXpv|amv;!wkLfbj-MA43%<@Q>bJtdSV!*1MA2V2 zI?hIh&$40c_XY-qfsHiX`Ui!5Yy8H)1fGallKXeyMpVwx-f*dEN68yyEmZd+8@Y_L zzm>(*kRelf${k|83#-TFPSw z*BRU_Xg(fWFPpD^>H+xtqlxj32#d18QzNYJlu+wCIqc6KuMcIM**jCzrFoQvQ&5K)fJ2ZxhXr zfR)9$l19y8@;dMz#TPsEoWJLBR-C$Y1!JY4Pg=Ms~ABkaWtJ9s(y4UIUg0!T=bV;pdtBJ zKB2Di4|JBGv4hvNXONHJ@geEs4qZ2}|6I4V%H<+Szc?P_H5a)@aO)%kmS_F&}6V=73;wF zResw7;vlMlRBhBc#R{bZSmzRA1TK#p+DJaj$QMxDutNGDxt4#Rd_2Vr!~-sdz+>@* z=1hKss+4n?GzrOH9utJFC&ti|Se(4b@#P`5QmD~r; zO~l@VpFVT04GW2Ka^Ei~?Eei6j_mX2rqvJi`_z%=2v0PGHBlbBa4cq}kWaiY&Ehh0 zTpvNLcTtVbjubP-H-rb=`4N2J>Mqa=UO!P+@q*43-Py9P@WBrG20YePXN`J~9_tKJ z`MmPybMZZLi{S_M@T<^4vO{Z;>pc8^?dw(3uy%_cgE7M2<=ZWR?&8%-wdBbWG>5_i7l8-j^nJ1CDgPdFZe}~)E4LrBom)4pS2gJNFis)9-Dwq zAYCn+z;HTSkKql`RD4lcXB)gcA)BH41JT|)w6{=QS|y*6&zVMknucohmO$4f`0UG| zvFf*$;mc_(fmasudO9>u<-IBBE7j}Emyh9oMfW-B;7*dWm$Z@?IKFNIdwlgrkA|m3 z`*3Qvrq55cAZQ;DlRz)^ID9?iK5Q1WkCd(7HfVa}uWn{N|0{lmGo#7G32ZiN6^~z- zxQhKTv4X_qtgX(Gcuo1S>&cZ@F1dI>`q}NlxC&>$`Ree5$39@g;RT&7xO@|Ig=nm^ zIp;^fD;4DCY{93KpC?xfyeSIb#=Lk{9W(S(0PR7QCWEf&JIOlvuCH!ODYo_ zHt0N`xPbPpvh%8S@$Bu^vzH;B2i-MAo^99kgWGA&d>?7qvh~^sN0gVlc0r6SI z@TF7a_ldXky|VAg=x@A70=!>27f;WjKrDLNQcYE z!9<=6zBt16DHx=HOB^4ZVJSC^eAgeO#o>U?_n4(!!kyiR*d=o3`l&)ul zV&{YBr(x$)EP!5?{?ObXAAfi_z0&aWhJ?;485SP>==ZT^{~f<0B5PSoa*OvzWUaKB zIp8I*&U3NB3GhG?a+pGXiE>MpvhP;!WXBKCO8ary3B_WSce55ciq>n<8S9AkO15?G zu&!ME!oCiBqVq`k`HDg5Y)W&$E%l^Pss6oe_OtM8up{{~c-eL(BpfqE0|7o2T?7nF0J!0^pq@_#r8AorvPqkQ!xn|<;XXb;)2*0J`_ov_+B<1E=Ecc;3OL%IQll5uy!RaHW z5yZZ3LL9l;PS?jnci~#c*s$=~`{||l{tvN6{}aA5GJ9o{(DbDRq4al{L4HXTV|LCe zi)Z zd4WDp+`f+9sq95m+p++gpNzdv1otpuIX)i0D;zxG;ZDQ1n=~)Q^~j=MuF*5YM$*3= zIk({vF@?TSu}%Ib(C9y7j`#)l!2_Yeixyu9S+v+xdw_nhX!LRn=S!YiG|pU{&qy7m z@(}SC(%IJwt4x@6dY%D|m7k~{2I=^gdfy@*3(q8(9OmRT#PaYx<#)`(r=N%IiRJqh zyB79|a8M(leHijT9bD8Y;Nna`=Z}K+^vk?J&z#Uvv*Pdj&sdZHslO4HvFz25^rf-W zQnJr5OuB*mLuVuAK|AH2i67=Eu8<3k67nm$YRu>Hd|sQsy1)|n`#f}df_zPMNgTdL zEc=hS`2Lddnb3L`{-|UTTD3coH2EJpP@nE|cC*vkdu*G*lJWkJw=Vj}q7^XPR8&Bx5un16UoZ1SA3bCUi? z@8SPkwEttj8;1r!2_$m#L{)|H}3Mfo=A0(E1M(6Vv`>Vp7_tfr*QbfOl64&6hAD!9VTG z>(BGrPyVuI_Sd`lE-QeJ_$Pdae+*9Hx-jeSr!LI=!Lbv*%l-cKvwvNIzplVvSKzNJ z@Yfai>k9mJ1-`Epu$%ffZ2wu08jB;9tIa?mqDOSI^xqocZdxyQi|Rp5Lk;2>$B1`}4}m^XqQ+mRstXeeF3DxbAk{gl>F(-R(P; zx$*g#>+gpNmtFsy3E%iU_=dm#yU$sW>)(D03-T?We{DHfuc_8fWn8vp;P=g8aF6@~z{_gbAnXjHZ{dL`hZhT%(-+$c=HrDg& zC^}8gue%}l^s5_kw{zVJy4$&K1>Nmjw?gjculvEqp6|Q%gVQ|Eul-=%Q?H7t`}%7? zQ1^A$zOb?P{dHe(?WyMru6?}jj;?*2_i4$#`ndary2;gjiBqj#eWCr|de=SqE)Ufl zun8lWaqBG)@<0EYc`kqb|IfYxib?&k@n^rW?{EW}kMiDxU8CNF|HM#i^>)V38R}W| zYsNi{`xy@~>eUTBzK@~5sTNxK(m!L|#`rPgM+|+ZzFWVc-}-a^(>>^ZbZ@%PUov$6 zk1&Mc@)|=D*PhXxp<2(8jPZ=gjA@MEx-pgOM8;T#52HV$3!@FAG2>;%Q;dfgT0^a; z*7hG6f6MsKTo3)8=6nZ3_wq2~IYuLf@CtSBnnxHTfsuLZ-~7$`+kScH_TM~Q|LDWd zJb&S-*WSGH%$rTVe5O&ee}0znbb}^eKJi+EEBYJnIdc0i@7#9lt$&lpXVVyS8NrNE zjNXiQ84VauGsHjQE3LoQLcH-q{nK}A-r~!98BZ`?XS8MXV~DO%jD@%U&8=&HeES{S z>OJ+$`4``A`M(-==xlGc>u7Jb>0k}ozGn^FzHe`}?`VzMe_)L|d|-_`baF$ly~S${ z-}}HCaDBdMi~oJ!6TdzCquXw;;Cq)ck{DXo(TtvqcNi}*>N7+O$(rQk`{oDHTym(j z77sqpc$*=<*1d!?lAv4Z^G)Bm+@fbcYt?I@wdp&^-s?ZaJ{Ua0x(pj>-F-$|4H$Ru7TE6GAA7+ITWvVW=Ni=|M>RXm%ZA$ z{pB|Ohg$oA!>luN>oIZ+J&h;WAn<&L(a(GMoa<+bs6Gg9r_Kj)^1IDSkq43tqJ4xHt+x8?uQ@Q!SBX0rZ9#wBzNM) z#~8n1h!6gb@qPW1YgSU3QH*}PBV$MBBkFx<_7YoPOm-+dDWj!V= z(#D0)w19|c3#2A`0wXXg#yt*<;yJGefQ2+JEQ)@+5#|>h?)u*QvL?g9#2p+s#rpb# zg+0vI+V&n`Z+F&O^srZ3wg2L$KmTPa_n`T|&v=9JL(N~ZFP@TJlFoVd_Fw$Ur&ZrU zSA@^sdu$;0In{&lz??N-&2!SMx%6|1b+y4B?8kWy|1oHea3JSVHyZE$ruV4dyIUXD zV|;ksT1*SGk>U;bXUK%ftZkt6@f+{tsTDHTgtd6&`Ik0wKaxf1L-D`pBzk?H{Lj}p z-Ky{X@x#x);NN*9J*dGa9{^7A@F^iS8eALU9f+oyx9Vaw=V0n1G}P&bHJ74Mf*Q`s=;I5-5STFwo>(BiRnJ@+U4YpC!Lft)&hu_u9 zI}qHDiSYTPnR6_N`2|7apxN+(cmi5a;_m^_d7OBj&yMChe4z6P_1VysoxO&Sv~GikTjv2otYe+dY%9IlXP`Cj(f5m2TDJA|-scZ-?KXB&cqiX6 z))gJz8(AL&PW>q4d@OSo4MpD>)PF`%4>^lkXw}bY%%lc1A}Ix|dvGx0lPrwd(8%Oe z{+13tVwM}xi!$kloLTo7u6#a9pQD~SjL+%2#Zv(hv)nps%?AfevVN>l4_|-lgnelT zKeQV%SfWLCEQN7Iow`hxT<%Duw7>^^wc;yyhrAtIST_a zn)%0NEvC+Fm8&&z_)+Ak>Z+l-BlU+6hM;OugfF1}P^wFaC1+_iwFi-I4Zx3!2WJ48 zlCID?_#<<&A43C!Y{0mQ){CA29fyswwu60s*M69v?7;W(51g9Ydyb#-@t~<;=05{H z9v$a!jnuPD{flO%GIvMsbc>}f($nX*z~N)5kDzk0m5;6bZO>4CHuzfnZMkx^={Kt$ zX<83qs(Ep`@YVITFgP#fSNPkX_20IyDIR^RhLH`V!I0gMU$=TfwLr2oT z-FNTzGI_oPY__T)LE&KbA=B`=Fr9?s96{Zucr-SXe$M0?3KLNC(43TmE^JWMF9=7- z;R{g5q8>r{4AnB|b=5YkqCP>n>#BKBF0%($Y$NL+OgZ?0IyLb^bb1!QCwWMA_G2Qt zB_INf8ElT$U?{q%AGWC5$g%d`5MOIE*eCM4u0gNBX;TL9-J@jF&|Shb3PBd5;CbQR zsGp(ct^9h|H=6mXre3{+g^Mn{MD<2de;oBmx&G?ynWKJ*p4twuv{?u7jO(2OKL~$8 zb(q3cluX2=d-|n@Qg1sAoE^^^APXVkP8OsSWFx!cf3+LzYwd=NlwG)~f8cUG+;36{ z_^kLb*rh<$TXdhtyi>_3*1avJ##A)-)*YzE$U|%DP*j_uniSST^=FO`#0zeyhGmnJq#V@XZh~opWhLqc^HBhcAxPw{)Z_ilqfo!Yr#K&`ge&~Y{=*58n=mP9h z$6=$<1->;mHF-YNd&0C5={w)x84j;{4t%bjbFX12R9&;F~s}gpa)?_Jp z_`*ySj)vx=S{%_fucF$6uLaL*{%gvs=q>eC&lKUU