Compare commits

...

119 Commits

Author SHA1 Message Date
svk
53869b8fe4 Обновить README.md
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2025-01-30 12:19:56 +03:00
svk
6854093ee1 Обновить README.md
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
2025-01-30 12:18:14 +03:00
svk
202f8d3d82 Обновить README.md
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
Исправлено описание и добавлены изображения
2025-01-30 12:14:09 +03:00
svk
7afdd33c58 Обновить README.md
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2024-10-31 19:48:30 +03:00
74e288d596 Новая сборка
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2024-08-22 15:18:59 +03:00
17636c13e3 changelog-gen.tcl: Добавлена генерация текстового журнала изменений 2024-08-22 15:09:19 +03:00
7d0c5796e5 build-deb-projman.sh: добавлена генерация changelog из git log 2024-08-22 13:38:52 +03:00
79c2e6f1dc changelog-gen.tcl: Вывод в файл вынесен в отдельную процедуру 2024-08-22 13:18:49 +03:00
2024aa86ba changelog-gen.tcl: Добавлено создание резервной копии выходного файла. Исправлен вывод в файл. 2024-08-22 13:12:28 +03:00
cb5c21c077 changelog-gen.tcl: Добавлены опции командной строки, добавлен вывод в файл 2024-08-22 13:01:17 +03:00
6b5d116743 Добавлен запуск changelog-gen при сборке пакета 2024-08-22 11:04:37 +03:00
6fc78c75b3 Добавлено чстение журнала начиная с определенной даты 2024-08-22 10:30:33 +03:00
4a3394183f Новая сборка 2024-08-22 10:29:44 +03:00
Калинин Сергей Валерьевич
e1db775b3b Генерация списка изменений для debian приведена к корректному виду
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2024-08-20 13:30:43 +03:00
Калинин Сергей Валерьевич
42349a4701 Генерация списка изменений для debian приведена к корректному виду 2024-08-20 13:28:51 +03:00
Калинин Сергей Валерьевич
f6bbc530bb Исправлен фокус при создании нового файла. #3
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2024-07-29 17:31:07 +03:00
svkalinin
c9e804b614 Исправлена неправильная замена выражение при поиске, если есть несколько совпадений в строке.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2024-07-17 12:28:30 +03:00
svkalinin
4bf10a1d30 Исправлена неправильная замена выражение при поиске, если есть несколько совпадений в строке. 2024-07-17 12:11:53 +03:00
svkalinin
f68cd75600 Реализовал базовые функции генератора журнала изменений
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
2024-07-02 14:24:14 +03:00
svk
9ad7523e7c Финальный тест сборки
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 5s
2024-06-27 14:44:47 +03:00
svk
ea988f6b8d Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 7s
2024-06-27 13:29:10 +03:00
svk
23de123a0b Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-06-27 13:25:16 +03:00
svk
b287ee5551 Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-06-27 13:24:03 +03:00
svk
dc9837b7c2 Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2024-06-27 13:13:08 +03:00
svk
2caba8db1a Попытка загрузки собранного пакета
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2024-06-27 13:10:23 +03:00
svk
299638b1f8 Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2024-06-27 12:53:09 +03:00
svk
56e7168d8e Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4s
2024-06-27 12:52:10 +03:00
svk
b0a3292d9f Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 14s
2024-06-27 12:47:05 +03:00
svk
93dd90e355 Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4s
2024-06-27 12:45:22 +03:00
svk
aff70dd8b7 Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 13s
2024-06-27 12:44:31 +03:00
svk
dea2ff0023 Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-06-27 12:43:20 +03:00
svk
6361043c25 Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
2024-06-27 12:41:34 +03:00
svk
4f8e7e306d Обновить debian/build-deb-projman.sh
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4s
2024-06-26 16:22:29 +03:00
svk
b42977f416 Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 5s
2024-06-26 16:18:45 +03:00
svk
78c5f3784b Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3s
2024-06-26 16:17:27 +03:00
svk
65c4213836 Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 4s
2024-06-26 16:16:30 +03:00
svk
993c1f7e3e Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4s
2024-06-26 16:15:32 +03:00
svk
29bdac41fe Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 4s
2024-06-26 16:13:20 +03:00
svk
ad3aac9b4b Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 3s
2024-06-26 16:12:16 +03:00
svk
2e36bbc100 Обновить .gitea/workflows/build.yml
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Failing after 6s
2024-06-26 16:00:54 +03:00
svk
190ec5200f Обновить .gitea/workflows/build.yml
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
2024-06-26 15:58:14 +03:00
svk
b495161d81 Обновить .gitea/workflows/build.yml
Some checks failed
Projman build the packages / Projman-Build (push) Failing after 1m2s
2024-06-26 15:53:21 +03:00
svk
faeeef6048 Обновить .gitea/workflows/build.yml
Some checks failed
Projman build the packages / Projman-Build (push) Failing after 12s
2024-06-26 13:02:29 +03:00
svk
8e496cb6bd Обновить .gitea/workflows/build.yml
Some checks are pending
Projman build the packages / Projman-Build (push) Waiting to run
2024-06-26 12:59:04 +03:00
svk
cfb29d6038 Обновить .gitea/workflows/build.yml
Some checks failed
Projman build the packages / Projman-Build (push) Has been cancelled
2024-06-26 12:39:02 +03:00
svk
6051f6821a Обновить .gitea/workflows/build.yml
Some checks failed
Projman build the packages / Projman-Build (push) Has been cancelled
2024-06-26 12:35:54 +03:00
svkalinin
6f99707fd7 Добавлена иконка для jinja template
Some checks are pending
Projman build the packages / Projman-Build (push) Waiting to run
2024-06-24 10:15:38 +03:00
svkalinin
d17aef0878 Исправил остатки слияния веток
Some checks failed
Projman build the packages / Projman-Build (push) Has been cancelled
2024-05-17 10:46:08 +03:00
svkalinin
397117e770 Исправлено некорректное определение типа файла при открытии 2024-05-17 10:40:21 +03:00
svkalinin
09d8a06f9e Исправлено некорректное определение типа файла при открытии. 2024-05-17 10:34:53 +03:00
svk
72abc2b84f Обновить .gitea/workflows/build.yml 2023-10-30 10:44:37 +03:00
svk
8bd48159d6 revert 61f2bca699
revert Обновить .gitea/workflows/build.yml

TEst actions
2023-10-30 09:55:41 +03:00
svk
61f2bca699 Обновить .gitea/workflows/build.yml
TEst actions
2023-10-30 09:46:02 +03:00
svk
55fe5c3023 Fix 2023-07-30 12:11:49 +03:00
svk
d04d419548 Fix 2023-07-30 12:01:24 +03:00
svk
bc56f02a35 TEst 2023-07-30 11:49:45 +03:00
svk
791a4c59a3 Test gitea actions 2023-07-30 11:44:41 +03:00
svk
f21e750967 Gitea actions add 2023-07-30 11:33:52 +03:00
svkalinin
3ee60f48c3 Merge branch 'master' of https://git.nuk-svk.ru/svk/projman 2023-07-27 13:04:32 +03:00
svkalinin
496514649a Исправил открытие файлов с разными путями (~/ ./ ../) 2023-07-27 13:03:02 +03:00
svk
336a05cd61 Добавил изображений программы 2023-02-23 13:46:56 +03:00
svkalinin
06c6205177 Исправлена ошибка при создании нового файла. 2023-02-06 09:27:38 +03:00
svk
6180a35718 Test 2022-12-22 19:59:05 +03:00
svk
0b92e4a1f0 Изменил(а) на '.woodpecker/.build.yml' 2022-12-22 19:48:06 +03:00
svk
87ae490b94 Изменил(а) на '.woodpecker/.build.yml' 2022-12-22 19:42:53 +03:00
svkalinin
005f832b7a Test 2022-12-21 16:53:44 +03:00
svkalinin
9b2477c954 Тесты 2022-12-21 16:34:00 +03:00
svkalinin
2328090962 Fix 2022-12-21 16:16:38 +03:00
svkalinin
9d86d26b2b Fix 2022-12-21 16:09:47 +03:00
svkalinin
a7af815ce4 Woodpecker test 2022-12-21 16:06:36 +03:00
svkalinin
b6afcc4c5f Добавил пиктограммы файлов 2022-12-21 14:59:40 +03:00
svkalinin
8de8ec16be Исправил процедуру Files::CloseAll ('Закрыть всё') 2022-12-20 12:38:22 +03:00
svkalinin
cb6cefd8ac Добавлена поддержка Lua 2022-12-19 15:29:30 +03:00
svkalinin
0fe4541dc0 Исправлена процедура (рас)комментирования 2022-12-19 15:29:17 +03:00
svkalinin
3467d6a89a Исправил ошибку при выходе в процедуре (Congig::Write) 2022-12-16 15:00:52 +03:00
svkalinin
3bf3b80e38 Добавил раскраски в ruby 2022-12-16 10:11:07 +03:00
svkalinin
a1248f6941 Добавлена возможность многострочных комментариев, если это поддерживается языком (html, go, ruby).
Добавлен параметр для включения данной фунциональности в меню и в конфиге.
2022-12-16 09:33:01 +03:00
svkalinin
777eaa01e5 В Ruby lexer добавлен поиск переменных коде. 2022-12-15 12:18:18 +03:00
svkalinin
2043a03c0b Новая сборка 2022-12-15 12:12:00 +03:00
svkalinin
d215c1ca25 Немного почистил. Добавлен поиск переменных по питоньим исходникам (lexer) 2022-12-15 11:59:05 +03:00
svkalinin
6f85de472a Еще одно исправление подсветки для INI 2022-12-09 15:45:23 +03:00
svkalinin
c929e53803 Новая сборка 2022-12-09 15:35:46 +03:00
svkalinin
c738d496e6 Исправлене подсветки комментариев в INI 2022-12-09 15:34:06 +03:00
svkalinin
fa55ce53c6 Новая сборка 2022-12-09 15:31:14 +03:00
svkalinin
6327d45a5c Изменения в подсветке для INI 2022-12-09 15:25:47 +03:00
svkalinin
52a0edfec8 fix 2022-12-09 15:04:28 +03:00
svkalinin
5319c475d9 Добавил подсветку для Desktop и Spec файлов 2022-12-09 15:02:53 +03:00
svkalinin
f2926cd047 Добавил вывод отладочной инфы в процедуру 2022-12-09 12:04:53 +03:00
svkalinin
84735e0dee Исправил подсветку комментариев в TCL 2022-12-09 11:51:24 +03:00
svkalinin
508933006e Оптимизация процедур 2022-12-09 11:34:54 +03:00
svkalinin
28ceaf1c67 Добавлена подсветка и навигация по HTML. Исправлена подсветка XML 2022-12-09 11:25:34 +03:00
svkalinin
cfae63d36a Новая сборка 2022-12-08 15:31:31 +03:00
svkalinin
fa0bda3c25 Добавил иконку для изображений 2022-12-08 13:32:18 +03:00
svkalinin
8b294582f3 Добавил иконки для perl, tcl, обновил для ruby 2022-12-08 13:12:30 +03:00
svkalinin
b3ac2fb649 Fix 2022-12-08 09:39:44 +03:00
svkalinin
64a4a35cc6 Исправлена подсветка и навигация по коду для Ruby 2022-12-08 09:39:14 +03:00
svkalinin
5d07141ef1 Обновил список изменений 2022-12-07 16:12:04 +03:00
svkalinin
a2880d5dd6 Исправлено сохранение сессии в редакторе (открытие папки и файлов при следующем запуске) 2022-12-07 16:00:04 +03:00
svkalinin
9099d4ad61 Добавлена новая секция UserSession 2022-12-07 15:59:12 +03:00
svkalinin
dd22f2cf15 Исправление ошибки при открытии файла 2022-12-07 14:27:08 +03:00
svkalinin
0adea30af9 Добавлена поддержка INI-файлов (подсветка, навигация по структуре) 2022-12-07 14:21:09 +03:00
svkalinin
c829ec1156 Добавлена поддержка perl 2022-12-07 13:14:37 +03:00
svkalinin
3e3000de62 Добавил икогнку для файлов git 2022-12-07 09:08:43 +03:00
svkalinin
fbb107f14a Новая сборка 2022-12-05 15:59:46 +03:00
svkalinin
b91790f756 Добавлены иконуи для ключей и сертификатов. Изменен поиск иконки (вощзвращает теерь с размером) 2022-12-05 10:56:30 +03:00
svkalinin
417fb9db23 Новая чборка 2022-12-01 12:51:50 +03:00
svkalinin
3b52b9af34 Реализован двухпанельный режим работы (вертиикальное разделение) 2022-12-01 12:37:13 +03:00
svkalinin
47f6cc436a Test 2022-11-29 13:33:12 +03:00
svkalinin
6b71cfa4d0 Тесты 2022-11-29 13:27:58 +03:00
svkalinin
a21d7c58d3 TEsting drone build 2022-11-29 13:14:51 +03:00
svkalinin
f422aa9d64 ДОбавил сборку в drone 2022-11-29 13:03:50 +03:00
svkalinin
c7fb966326 Исправлена ошибка при открытии ansible.cfg, если отсутствует inventory файл упомянутый там. 2022-11-29 08:59:54 +03:00
svkalinin
64c9957991 Добавил деактивацию кнопки 'Создать репу' если не выбран активный проект (не открыто ни одного каталога/папки) 2022-11-28 16:37:42 +03:00
svkalinin
52a3e9a4ac Добавлены команды git init и git config (зачаток). Изменен диалог клонирования репозитория (добавлена кнопка Создать репозиторий) 2022-11-28 16:27:06 +03:00
svkalinin
b10b1802a5 Исправил ошибку git при открытии файла или каталога если репозиторий не инициализирован (нет .git каталога внутри проекта) 2022-11-28 15:29:40 +03:00
svkalinin
37ab3e4a6b Переименовал файл 2022-11-28 14:15:30 +03:00
svkalinin
2bd1b76981 Добавил скриты сборки rpm, переделал сборку deb 2022-11-28 13:30:01 +03:00
svkalinin
c50768ba56 Добавлено обрамление выделенного текста прии нажатии '_' в markdown 2022-11-25 12:51:21 +03:00
svkalinin
ef4a636623 Исправление подсветки 2022-11-25 12:41:00 +03:00
28 changed files with 2390 additions and 429 deletions

View File

@@ -0,0 +1,17 @@
name: Gitea Actions Demo
run-name: ${{ gitea.actor }} is testing out Gitea Actions 🚀
on: [push]
jobs:
Explore-Gitea-Actions:
runs-on: tcl-tk-builder
steps:
- name: Build the packages
run: |
git clone ${{ vars.main_url }}${{ gitea.repository }}
pwd
cd projman/debian
./build-deb-projman.sh
cd ../../
curl --user ${{ vars.user}}:${{vars.api_token}} --upload-file "$(ls -1| grep projman | grep -E 'deb$')" ${{vars.main_url}}api/packages/${{vars.user}}/debian/pool/bookworm/main/upload
- run: echo "This job's status is ${{ job.status }}."

2
.gitignore vendored
View File

@@ -4,3 +4,5 @@ debian/update-desktop-database
debian/projman.substvars
debian/files
debian/projman.debhelper.log
debian/*.tmp
*.tmp

437
CHANGELOG
View File

@@ -1,129 +1,350 @@
######################################################
# Tcl/Tk Project manager 2.0
# Distributed under GNU Public License
# Author: Sergey Kalinin svk@nuk-svl.ru
# Home page: https://nuk-svk.ru
######################################################
projman (2.0.0-alfa16)
20/06/2022
- Beginning the project
Sergey Kalinin <svk@nuk-svk.ru> Thu, 22 Aug 2024 15:09:19 +0300
- changelog-gen.tcl: Добавлена генерация текстового журнала изменений
- build-deb-projman.sh: добавлена генерация changelog из git log
- changelog-gen.tcl: Вывод в файл вынесен в отдельную процедуру
- changelog-gen.tcl: Добавлено создание резервной копии выходного файла. Исправлен вывод в файл.
- changelog-gen.tcl: Добавлены опции командной строки
- Добавлен запуск changelog-gen при сборке пакета
- Добавлено чстение журнала начиная с определенной даты
- Новая сборка
13/07/2022
- Added open file dialog
- Added open folder dialog
- Added save file function
- Added a command line argument support (open file(s) or folder(s))
- Added TCL and BASH highlite
- Added a configuration file (progman.ini) and a procedure for reading/saving them
Sergey Kalinin <svkalinin@samsonpost.ru> Tue, 20 Aug 2024 13:30:43 +0300
- Генерация списка изменений для debian приведена к корректному виду
- Генерация списка изменений для debian приведена к корректному виду
- Исправлен фокус при создании нового файла. #3
14/07/2022
- Added On/Off viewing toolbar
- Added On/Off viewing line numbers bar
- Added a Comment/Uncomment text support
- Added text auto format
Калинин Сергей Валерьевич <svkalinin@samsonpost.ru> Wed, 17 Jul 2024 12:28:30 +0300
- Исправлена неправильная замена выражение при поиске
- Исправлена неправильная замена выражение при поиске
- Реализовал базовые функции генератора журнала изменений
15/07/2022
- Added a close file (tab) function with Ctrl+w
- Added a insert/remove the tabspace
- Fixed comment/uncomment selected text
svk <svkalinin@samsonpost.ru> Mon, 24 Jun 2024 10:15:38 +0300
- Добавлена иконка для jinja template
- Исправил остатки слияния веток
- Исправлено некорректное определение типа файла при открытии.
20/07/2022
- Fixed indent text
- Fixed insert " and '
- Added a main window geometry option into config, and autosave current geometry
<svk@nuk-svk.ru> Mon, 30 Oct 2023 09:46:02 +0300
- Gitea actions add
21/07/2022
- Added Save file dialog before tab was closed
- Added Save file dialog when exiting, if file was modify
22/07/2022
- Added GO highlight
27/07/2022
- Fixed comment/uncomment procedure (last line in selected text)
- Fixed error with save new (untitled) file
svk <svkalinin@samsonpost.ru> Thu, 27 Jul 2023 13:04:32 +0300
- Merge branch 'master' of https://git.nuk-svk.ru/svk/projman
- Исправил открытие файлов с разными путями (~/ ./ ../)
01/08/2022
- Added inserting base64 encoded image
- Added read the file structure and inserting into tree
- Added GUI font, and GUI foreground color setting
- Added tcl and go files images
- Added image for file type (extention)
svkalinin <svk@nuk-svk.ru> Thu, 23 Feb 2023 13:46:56 +0300
- Добавил изображений программы
03/08/2022
- Added some files icon
- Fix finded procedure (function) (tree click)
- Fix showing position in statusbar
svk <svkalinin@samsonpost.ru> Mon, 6 Feb 2023 09:27:38 +0300
- Исправлена ошибка при создании нового файла.
12/08/2022
- Fixed comment/uncomment procedure depending on the file type
- Added About dialog
- Fixed read structure (procedure names like Proc:Name)
15/08/2022
- Added open/close braces highlight
- Fixed GO structure reader
svk <svkalinin@samsonpost.ru> Wed, 21 Dec 2022 16:53:44 +0300
- Добавил пиктограммы файлов
- Исправил процедуру Files::CloseAll ('Закрыть всё')
- Добавлена поддержка Lua
- Исправлена процедура (рас)комментирования
- Исправил ошибку при выходе в процедуре (Congig::Write)
- Добавил раскраски в ruby
- Добавлена возможность многострочных комментариев
- В Ruby lexer добавлен поиск переменных коде.
- Новая сборка
- Немного почистил. Добавлен поиск переменных по питоньим исходникам (lexer)
- Еще одно исправление подсветки для INI
- Новая сборка
- Исправлене подсветки комментариев в INI
- Новая сборка
- Изменения в подсветке для INI
- Добавил подсветку для Desktop и Spec файлов
- Добавил вывод отладочной инфы в процедуру
- Исправил подсветку комментариев в TCL
- Оптимизация процедур
- Добавлена подсветка и навигация по HTML. Исправлена подсветка XML
- Новая сборка
- Добавил иконку для изображений
- Добавил иконки для perl
- Исправлена подсветка и навигация по коду для Ruby
- Обновил список изменений
- Исправлено сохранение сессии в редакторе (открытие папки и файлов при следующем запуске)
- Добавлена новая секция UserSession
- Исправление ошибки при открытии файла
- Добавлена поддержка INI-файлов (подсветка
- Добавлена поддержка perl
- Добавил икогнку для файлов git
- Новая сборка
- Добавлены иконуи для ключей и сертификатов. Изменен поиск иконки (вощзвращает теерь с размером)
- Новая чборка
- Реализован двухпанельный режим работы (вертиикальное разделение)
- ДОбавил сборку в drone
- Исправлена ошибка при открытии ansible.cfg
- Добавил деактивацию кнопки 'Создать репу' если не выбран активный проект (не открыто ни одного каталога/папки)
- Добавлены команды git init и git config (зачаток). Изменен диалог клонирования репозитория (добавлена кнопка Создать репозиторий)
- Исправил ошибку git при открытии файла или каталога если репозиторий не инициализирован (нет .git каталога внутри проекта)
- Переименовал файл
- Добавил скриты сборки rpm
- Добавлено обрамление выделенного текста прии нажатии '_' в markdown
- Исправление подсветки
- Добавлена поддержка markdown (подсветка
- Обновил описание
- Новая сборка
- Исправлена ошибка с закрытием файлов в редакторе при закрытии папки
- Новая сборка
- Переделана процедура определения активного проекта. Исправлено определение ветки git. Теперь можно нормально работать в двух и более открытых проектах (каталогах/папках)
- Новая сборка
- Доделан вид диалога поиска по файлам
- Исправлен поиск имени функции
- Новая сборка
- Добавлен диалог клонирования репозитория
- Добавил разделитель
- Исправлено переключение вкладок при закрытии
- Исправлено закрытиие вкладки Git по нажатию соотв. кнопки в панели инструментов
- Добавлен пункт 'Закрыть всё'
- Новая сборка
- Исправлено соответствие открытого файла в редакторе и выделение этого файла в дереве
- Исправлено переключение отображения панели (лево/право) в без перезапуска программы.
- Украшательства интерфейса - Реакция на нажатие кнопки в панели инструментов теперь зависит от контекста
- Добавлено включение отключение отображения Меню
- Добавлено копирование текущей строки в буфер по Atl+Y
- Исправлена ошибка с отображением файловой панели
- Добавлены и исправлены функции отображения меню
- Фикс
- Добавлен параметр statusBarShow - показ строки статуса
- Добавлены переводы
- Добавлена проверка параметров вызова файл или просто строка
- Новая сборка
- Добавлен вывод сообщений об ошибке в диалоге
- Добавлено обновления списка файлов в дереве
- Добавлена процедура вывода информационного сообщения
- Добавлена команда Git::Reset (git reset _file_) на кнопке в диалоге. Для отмены 'git add'
- Добавлена кнопка Обновление в диалог работы с Git
- Исправление процедуры поиска наименования функции
- Фиксы диалога работы с Git (работа с выделенными файлами в списках)
- Фиксы и тесты работы с git
- Исправление выборанескольких файлов в диалоге Git
- Новая сборка
- Украшательства
- Новая сборка
- Исправление рег. выражения чтения файлов командой git status
- Настройки темы
- Исправлено рег. выпражение определения mime типа файла
- Ntvs
- Новая сборка
- Добавил очистку текстовых полей при добавлении файлов в коммит
- Исправрелдение Git::Commit (индексация всех файлов в проекте)
- Изменения
- Исправления глюков
- Украшательства строки статуса
- Добавлен просмотрщик изображений
- Добавил рамку кону ввода номера
- Добавлен диалог перехода по номеру строки Ctrl-G
- Добавлено определение типа файла
- Новая сборка
- Добавил удаление артефактов сборки пакета
- Новая сборка
- Добавлена подсветка имен файлов в выводе git show
- Новая сборка
- Допилдивание процедуры автоввода имен переменных
- Небольшие правки в подсказках по переменным
- Новая сборка
- Исправлена подсветка SHELL переменных а YAML файлах (ansible
- Новая сборка. Добавлена подсказка по переменным при вводе.
- Добавлено определение символа переменной
- Определение коррректного положения встроенного окна
- Новая сборка
- Добавлен вывод подсказки при вводе переменных
- Добавлены опции для включсения полджсказок по переменным и процедурам
- Новая сборка
- Исправления гуя
- Добавил диалог создания и переключения git-веток
- Создание ветки
- Новые иконки
- Косметические изменения
- Починил push
- Добавлены новые иконки
- Обработка ошибок
- Новая сборка
- Исправлена ошибка при клике на списке с файлами
- New build
- Сделал просмотр изменений из истории
- Добавлено обновление лога изменений
- Новый билд
- Исправление обновления диалога
- Добавлен перевод
- git reflog
- Добавлен интерфейс работы с Git
- Новый релиз
- Исправил ошибку если нет изменений
- Начало работ по поддержке git
- New build
- Bug fix
- Добавлен диалог поиска строки в файлах в текущем каталоге. Используется 'grep -r'.
- Добавлены настройки для системной команды поиска в фвайлах
- Добавлено рекурсивное чтение каталога при открытии. Диалог поиска теперь работает раздельно при разделении окна. Диалог навигации по функци так-же работает раздельно
- Добавлены ключевые слова для подстветки питона
- Добавлена проверка на отсутствие файла и удаление из дерева
16/08/2022
- Added selection of all words in the text by clicking on the any word
17/08/2022
- Added "Vew Panel" menu and "Panel side" (left/right)
- Changed standard Tk menu on TTK::menu
- Added config options filesPanelPlace (left/right)
- Fixed ViewFilesTree procedure with rigth variable filesPanelShow (true/false)
svkalinin <svk@nuk-svk.ru> Sun, 18 Sep 2022 10:46:59 +0300
- Добавлен поиск переменной в тексте после открытия файла где она указана
- Исправлена ошибка при запуске
22/08/2022
- Fixed clicking on proc or func names into tree if file was closed
Sergey Kalinin <svkalinin@samsonpost.ru> Fri, 16 Sep 2022 16:37:17 +0300
- Новая сборка
- Исправил сохранение открытого каталога в настройках
- Рефакторинг
- Переделал дилог навигации по переменным
- Добавлен еще один каталог с переменными - default
- Добавлено сохранение состояния редактора (открытые каталоги
- Изменения в диалоге поиска
- Отображение горизонтальной полосы прокрутки в зависимости от переноса строк в редакторе
- Установка фокуса на текст в редакторе при щелчке на заголовок вкладки
- Сделал перемещение курсора в такуюже позицию в тексте при разделении окна редактора
- Добавлено горизонтальное разделение окна редактора. Исправлено удаление строки по Alt+R - реперь строка удаляется полностью вместе с символами переноса. Исправлено сохранение нового файла (untitled) но всеравно как-то криво.
- Изменения по чтению и отображению переменных по файлам. Причесал диалог
23/08/2022
- Added procedure and function navigation window by Ctrl+j pressed on editor
- Fixed correctly focused on editor text widget
Sergey Kalinin <svkalinin@samsonpost.ru> Fri, 2 Sep 2022 17:01:53 +0300
- Добавил поддержку ruby
- Исправлен выход окна со списком функций за пределы экрана. Поиск и замена теперь работает. Добавлены некоторые иконки для файлов
- Начало реализации процедуры поиска и замены (поиск криво но работает)
- Исправлено закерытие вкладки по щелчку мыши. Добавлена настройка переноса строк в редакторе. Добавлены сочетания клавиш ctrl+pgup cntrl+pgdown для переключения между вкладками редактора. Добавлен диалог закрытия папки (каталога)
- Укоротил имя корневого каталога в дереве
- Добавлены ключиевые слова GO
- Исправлена подсветка ключевых слов tcl и добавлены виджеты
- Исправлена некорректная установка иконки на каталог
- Добавлены горячие клавиши для удаления слова
- Добавлены сочетания клавиш для удаления слова
24/08/2022
- Fixed ReadStructure procedure (added lexer)
svkalinin <svk@nuk-svk.ru> Fri, 26 Aug 2022 12:36:14 +0300
- Изменил(а) на 'README.md'
25/08/2022
- Fixed focus on the editor window after clicking Escape in the function selection dialog
- Change color scheme for FindFunction dialog
- Added sh icon (for shell scripts)
- Fixed lexers for find procedures and functions
svk <svkalinin@samsonpost.ru> Fri, 26 Aug 2022 12:29:19 +0300
- Добавлена поддержка python. Обновлена библиотека иконок.
- Исправлена установка фокуса на окно диалога GotoFunctionDialog и обратно на текст. Переделан механизм чтения структуры файла и добавлены команды для sh (bash)
- Добавлены настройки темы для диалога навигации по функциям
- Добавлена иконка shell (*.sh)
- Исправлено комментирование строк
- Добавлен диалог навигации по структуре (процедурам) по Ctrl+F. Исправлена ошибка при закрытии файлов (функции из дерева теперь удаляются).
- Добавил цвет фона для панели с номерами строк
26/08/2022
- Update image library (added some icons)
- Added hot keys:
- Alt+p - Show/Hide additional panel
- Alt+w - delete word on the cursor below
- Alt+r - delete row
- Alt+b - delete text beetween line Begin and cursor
- Alt+e - delete text between cursor and line End
- Fix close braces indent
svkalinin <svk@nuk-svk.ru> Wed, 17 Aug 2022 21:37:06 +0300
- Убрал доки по tcl
- Слегка поменял стиль оформления
30/08/2022
- Fix the clicked by the close button on a tab
- Added "View"->"Editors word wrap" menu and procedure
- Added bindings "Ctrl+PgUp" and "Ctrl+PgDown" for next or prior tab selecting
- Added "Close file" dialog
Sergey Kalinin <svkalinin@samsonpost.ru> Wed, 17 Aug 2022 16:52:22 +0300
- Добавлен выбор расположения боковой панели
- Добавлено выделение всех слов в тексте по двойному щелчку мышой на любом слове
- Исправлено чтение структуры GO файлов: корректное отображение в дереве функций возвращающих значения разных типов
- Добавлена подсветка скобок
- Новая сборка
- Исправлены процедуры comment/uncomment
- Изменены имена переенных
- Изменены имена переменных
- Добавлена запись номера сборки (build) в исходник
- Добавлено меню Помощь -> О программе. Добавлено окно 'О программе'
- Исправлен поиск процедуры в тексте по клику в дереве
- Исправлен поиск процедуры в тексте по клику в дереве. Исправлено отображение позиции курсора в строке статуса
- ДОбавлены иконки для некоторых типов файлов
- Добавлено отображение структуры исходника в дереве (функции (go) и процедуры (tcl))
- Добавлено кодирование изображения в base64 и вставка в редактируемый текст
- Добавлены шрифт и цвет шриыта для общего интерфейса
- Исправлено комментирование выделенного фрагмента (последняя строка) Исправлено закрытие untitled вкладок
- Исправлено комментирование выделенных строк
- Добавлена подсветка для GO
- Исправлено подключение требуемой процедуры подсветки
- Убрал вставку закрывающихся кавычек в пустой строке. Ибо пока глючит.
- Добавлен диалог сохранения файла при закрытии вкладки редактора и при выходе из программы если есть несохраненные файлы
- Исправлен рабочий каталог
- Добавлены переводы для диалога
- Исправлен скрипт сборки пакета для Debian
- Исправил скрипт сборки пакета. Добавил .gitignore
01/09/2022
- Added search function name into Function navigation whem press key
- Added find and replace dialog
- Fixed correct placement the Function dialog
svkalinin <svk@nuk-svk.ru> Thu, 21 Jul 2022 12:18:29 +0300
- Изменил(а) на 'README.md'
14/09/2022
- Added procedure for the horizontal split a text window
- Fixed untitled file saved
- Fixed Alt+R (delete row), now will are deleted row with a "\n\r" symbols
20/10/200
- Added Git support: add and commit changes, show git log, show each commit...
svk <svkalinin@samsonpost.ru> Thu, 21 Jul 2022 12:15:19 +0300
- Change readme
- Added Dark theme
- New version of ProjMan
- Some changes into GUI (tabs)
11/11/2022
- Added GoTo Line dialog
- Fixed Git commit procedure
- Added variable and procedure helper
svkalinin <banzaj28@yandex.ru> Thu, 5 Jul 2018 08:41:18 +0300
- Fixed error if file was not select
- README.md отредактирован онлайн на Bitbucket
18/11/2022
- Add Refresh button into Git Dialog
- Fixed FindFunction
Sergey Kalinin <banzaj28@yandex.ru> Sat, 24 Mar 2018 12:20:27 +0300
- Rename readme
Sergey <banzaj28@yandex.ru> Sat, 24 Mar 2018 12:17:09 +0300
- README отредактирован онлайн на Bitbucket
- Added sort procedure for projects tree
- Added small toolbar into project tree
- Added insert base64 encoded image into source code
- Some GUI change
- Change messages files
- Added Menu button into tollbar and Hide/Show options into config
- Added procedure arguments into tree Change read config procedure (error fixed) Fixed error when project running
- Some Fix
- GoToNumber entry small change
- GoToLine procedure tuning
- Added GoTo line into toolbar Fixed fileinfo update when tree one click Fixed bug with opened files have extention is a upper case
- Critical fix again
Sergey Kalinin <banzaj28@yandex.ru> Sat, 24 Feb 2018 18:16:01 +0300
- Critical bug fixed with create project
- Refactoring all procedures is the Tree working
Sergey <svk@s.kalinin-nb> Sat, 24 Feb 2018 12:22:08 +0300
- Fixed Add new file if name was existing into tree
svk <banzaj28@yandex.ru> Fri, 23 Feb 2018 11:58:39 +0300
- Rename archive projman-latest
- Fixed AddToProj procedure for file browser tree Disable OpComplite procedure
- Refactoring Settigs procedure source code Some changes into messages files (localisation)
- Added option "constrainedwidth true" for ScrollableFrame
- Fix saving "Show dot files" option Fixed correctly highlightning procedure names
- Refactoring auto update file structure (tree). Now structure updated when file was saving Refactoring "Settings" dialog
- Fix "New file" proc ctrl+n hotkey
- - Fixed edit files into root node from file browser tree - Change "Delete project" dialog and procedure
- Refactoring "Add New Projects" "Project Settings" (e.t.c.) dialogs Added "Add as new project" dialog for file browser Add popup menu for file browser Fixed some highlight bug
- Fixed runing on Win7 without installation
- Added opening last active project when project run
- Fixed parsing procedure with names like ::proc::name or proc_na::me(aa) and parameters {{} {} {}}
- Put logo and icon images into source code
- Fixed AutoComplite precedure for TCL/TK-projects Added colored icon for main window Fixed "Close all" procedure if opened files from projects and file browser
- Added saving main window geometry into projman.conf file when close programm
- Merge branch 'master' of https://bitbucket.org/svk28/projman
- Delete temp file
- bitbucket-pipelines.yml отредактирован онлайн на Bitbucket
- change docker image
- add apt
- bitbucket-pipelines.yml отредактирован онлайн на Bitbucket
- Initial Bitbucket Pipelines configuration
- Add web site into Readme
- Added gray theme Fixed work with file from directory but not project.
- Some FileDialog fixes
- File Browser added
- Auto indent added for () [] braces
- Some changes
- Change hotkeys "Control+
- Add comment/uncomment selected text
- Tcl
- - Russian help files was conerting into utf-8 encode
- Change Logo and About dialog (added new homepage and git repo addresses)
- Added binding mouse button: click on notebook tab highlight opened file name in tree Change "Paste from Clipboard" function Change popup editor menu (undo
- Modules load procedure changes
- Remove some files
- GiTK running fixed
- Fixed paste text highlight Fixed setting edited flag when paste the text from buffer Change authors email and home page
Sergey Kalinin <svk@kalinin.carfix> Mon, 22 Jan 2018 17:54:18 +0300
- - Remove ctags support - Added gitk (gui for git) support
- Change version into Install.tcl script
svk <svk@l0001h.office> Fri, 12 Jan 2018 13:44:26 +0300
- README отредактирован онлайн на Bitbucket
- test.tcl deleted online with Bitbucket
Sergey Kalinin <banzaj28@gmail.com> Mon, 19 Oct 2015 14:22:09 +0300
- some bugs in install.tcl fixed
svk28 <ksv@L-AO-TEH1.DALS.local> Mon, 19 Oct 2015 13:37:21 +0300
- Initial commit with contributors
- Initial release

View File

@@ -1,9 +0,0 @@
######################################################
# Tcl/Tk Project manager 2.0
# Distributed under GNU Public License
# Author: Sergey Kalinin svk@nuk-svl.ru
# Home page: https://nuk-svk.ru
######################################################

123
README.md
View File

@@ -1,10 +1,10 @@
# About
## About
ProjMan (aka "Tcl/Tk Project Manager") is a editor for programming in TCL/Tk (and other language).
It includes a file manager, a source editor with syntax highlighting and code navigation, a context-sensitive help system, Git support, and much more.
Working an Linux and Windows.
# Support languages
## Support languages
Highlightning and source code navigation:
@@ -16,19 +16,134 @@ Highlightning and source code navigation:
* Shell (BASH)
* Markdown
* YAML (Ansible support)
* Lua
Highlightning:
* HTML
* XML
# Requirements
## Requirements
For UNIX-like OS
Tcl/Tk >= 8.6 http://tcl.tk
tcllib, tklib
# Credits
## Screenshots
- Navigation the source code structure, and syntax highlighting
![projman_go_codenav.png](https://nuk-svk.ru/images/projman_go_codenav.png)
![projman_tcl_vars.png](https://nuk-svk.ru/images/projman_tcl_vars.png)
![projman_tcl_codenav.png](https://nuk-svk.ru/images/projman_tcl_codenav.png)
![projman_syntax_highlight.png](https://nuk-svk.ru/images/projman_syntax_highlight.png)
![projman_html.png](https://nuk-svk.ru/images/projman_html.png)
- Hints when entering names of variables and procedures
![projman_proc_vars.png](https://nuk-svk.ru/images/projman_proc_vars.png)
- Searching for a variable definition in ansible files
- Navigation the ansible source code structure
![projman_yaml_variables.png](https://nuk-svk.ru/images/projman_yaml_variables.png)
- Navigation the markdown source code structure
![projman_md_codenav.png](https://nuk-svk.ru/images/projman_md_codenav.png)
- Git dialog (commit history)
- Git dialog (changes)
![projman_git.png](https://nuk-svk.ru/images/projman_git.png)
- Flexible interface configuration
![projman_gui_flexibility.png](https://nuk-svk.ru/images/projman_gui_flexibility.png)
- Find/Replace dialog
![projman_find_replace.png](https://nuk-svk.ru/images/projman_find_replace.png)
- Global searching dialog
![projman_global_search.png](https://nuk-svk.ru/images/projman_global_search.png)
## Getting source code
Download the source code https://git.nuk-svk.ru/svk/projman/
Or use git:
```
git clone https://git.nuk-svk.ru/svk/projman.git
```
## Build package
```
cd projman/debian/
./build-deb-projman.sh
cd projman/redhat/
./build-rpm-projman.sh
```
## Install
Use package manager for you system:
Debian ```sudo dpkg -i projman_2.0.0-alpha_amd64.deb```
Redhat ```sudo rpm -Uhv projman_2.0.0-alpha_amd64.rpm```
## Usage
Running command (need full path to the each file or folder):
Open files
```
projman ~/tmp/test.tcl ~/tmp/2.go ...
```
Open folders
```
projman ~/projects/projman ...
```
Or type "projman" into terminal, Or choose the name of the program "Projman" on the Start menu.
### Keyboard shortcut
- Ctrl-N - Create new file
- Ctrl-O - Open file
- Ctrl-W - Close editor (file)
- Ctrl-K - Open folder
- Ctrl-Q - Quit from ProjMan
- Ctrl-J - Show procedures (functions) list for navigation in open editor
- Ctrl-L - Find and display files where the variable is defined, the name of which is located under the cursor in the editor
- Ctrl-F - Search text in open editor
- Ctrl-[ - Move the line (or selected lines) one position (see config tabSize=4) to the right
- Ctrl-] - Move the line (or selected lines) one position to the left
- Ctrl-, - Comment the line (or selected lines)
- Ctrl-. - Uncomment the line (or selected lines)
- Ctrl-I - Insert base64 encoded image into edited text
- Ctrl-G - Go to line dialog
- Ctrl-C - Copy selected text into buffer
- Ctrl-V - Paste text from buffer
- Alt-P - Show/Hide the file tree panel
- Alt-W - Delete the current word
- Alt-E - Delete text from current position to end of line
- Alt-B - Delete text from current position to begin of line
- Alt-R - Delete current line
- Alt-Y - Copy current line into buffer
- Alt-S - Split the edited window horizontally
## Credits
Sergey Kalinin - author
svk@nuk-svk.ru

337
changelog-gen.tcl Executable file
View File

@@ -0,0 +1,337 @@
#!/bin/sh
# Tcl ignores the next line -*- tcl -*- \
exec tclsh "$0" -- "$@"
######################################################################
# ProjMan 2
# Distributed under GNU Public License
# Author: Sergey Kalinin svk@nuk-svk.ru
# Copyright (c) "SVK", 2024, https://nuk-svk.ru
#######################################################################
# Changelog generator from the Git commit history.
# For DEB and RPM packages
# usage a git command:
#
# git log --abbrev-commit --all --pretty='%h, %ad, %an, %ae, %s, %b'
#######################################################################
# puts $tcl_platform(platform)
# Устанавливаем рабочий каталог, если его нет то создаём.
# Согласно спецификации XDG проверяем наличие переменных и каталогов
if [info exists env(XDG_CONFIG_HOME)] {
set dir(cfg) [file join $env(XDG_CONFIG_HOME) changelog-gen]
} elseif [file exists [file join $env(HOME) .config]] {
set dir(cfg) [file join $env(HOME) .config changelog-gen]
} else {
#set dir(cfg) [file join $env(HOME) .changelog-gen]
}
if {[file exists $dir(cfg)] == 0} {
file mkdir $dir(cfg)
}
# Use whereis command for finding the git executable file.
# for unix-like operating systems
proc GetGitCommandUnix {} {
global gitCommand
set cmd "whereis -b git"
catch "exec $cmd" result
# puts $result
if {$result ne ""} {
set fields [split $result ":"]
# puts $fields
if {[lindex $fields 1] ne ""} {
# puts [lindex $fields 1]
set gitCommand "[string trim [lindex $fields 1]]"
} else {
puts "GIT command not found"
exit
}
}
}
# Setting the git-command for windows family OS
proc GetGitCommandWindows {} {
global gitCommand
set gitCommand "c:/git/bin/git.exe"
}
switch $tcl_platform(platform) {
unix {GetGitCommandUnix}
windows {GetGitCommandWindows}
}
proc ReadGitLog {} {
global args gitCommand lastCommitTimeStampSec
set cmd exec
set i 0
lappend cmd "$gitCommand"
lappend cmd "log"
lappend cmd "--abbrev-commit"
# Проверяем была ли запись для данного проекта если была то к времени последнего коммита прибавляем 1 сек.
# и получаем журнал после этой даты
if {[info exists lastCommitTimeStampSec] && [info exists args(--last)]} {
lappend cmd "--after='[clock format [clock add $lastCommitTimeStampSec 1 second] -format {%a, %e %b %Y %H:%M:%S %z}]'"
}
lappend cmd "--all"
lappend cmd "--pretty='%h, %ad, %an, %ae, %s, %b'"
# puts $cmd
catch $cmd pipe
# puts $pipe
set outBuffer ""
foreach line [split $pipe "\n"] {
# puts $line
# set line [string trim $line]
set line [string trim [string trim $line] {'}]
if {[regexp -nocase -all -- {^[0-9a-z]+} $line match]} {
set outBuffer $line
if {$outBuffer ne ""} {
lappend res [list $i $outBuffer]
incr i
}
# puts $outBuffer
} else {
if {$line ne ""} {
append outBuffer ". " $line
}
}
}
# puts $res
if [info exists res] {
return $res
} else {
puts "\nRepository '$args(--project-name)' do not have any changes\n"
exit
}
}
proc StoreProjectInfo {timeStamp} {
global dir args
set cfgFile [open [file join $dir(cfg) $args(--project-name).conf] "w+"]
puts $cfgFile "# set args(--project-version) \"$args(--project-version)\""
puts $cfgFile "# set args(--project-release) \"$args(--project-release)\""
puts $cfgFile "set lastCommitTimeStamp \"$timeStamp\""
puts $cfgFile "set lastCommitTimeStampSec [clock scan $timeStamp]"
close $cfgFile
}
proc GenerateChangelogDEB {} {
global args
# puts "GenerateChangelogDEB"
set lastCommitTimeStamp ""
set commiter ""
set commitText ""
# ReadGitLog
set lst [lsort -integer -index 0 [ReadGitLog]]
# puts $lst
# exit
set outText ""
foreach l $lst {
set index [lindex $l 0]
set line [lindex $l 1]
# puts "$index - $line"
set record [split $line ","]
set timeStamp [string trim [lindex $record 1]]
set email [string trim [lindex $record 3]]
if {$lastCommitTimeStamp eq ""} {
set lastCommitTimeStamp [string trim [lindex $record 1]]
}
set timeStamp [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}]
# puts "> $commiter"
if {$index == 0} {
puts "$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n"
append outText "$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n\n"
set commiter [lindex $record 2]
StoreProjectInfo $timeStamp
# puts "\n \[ [string trim $commiter] \]"
}
# puts ">> $commiter"
if {$commiter ne [lindex $record 2]} {
puts "\n -- [string trim $commiter] <$email> $timeStamp"
append outText "\n -- [string trim $commiter] <$email> $timeStamp\n"
puts "\n$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n"
append outText "\n$args(--project-name) ($args(--project-version)-$args(--project-release)) stable; urgency=medium\n\n"
set commiter [lindex $record 2]
# puts "\n \[ [string trim $commiter] \]"
}
set commitTex [lindex $record 4]
puts " * $commitTex"
append outText " * $commitTex\n"
}
puts "\n -- [string trim $commiter] <$email> $timeStamp"
append outText "\n -- [string trim $commiter] <$email> $timeStamp\n"
return $outText
}
proc GenerateChangelogRPM {} {
puts "GenerateChangelogRPM"
}
proc GenerateChangelogTXT {} {
global args
set lastCommitTimeStamp ""
set commiter ""
set commitText ""
set lst [lsort -integer -index 0 [ReadGitLog]]
puts "$args(--project-name) ($args(--project-version)-$args(--project-release)"
foreach l $lst {
set index [lindex $l 0]
set line [lindex $l 1]
# puts "$index - $line"
set record [split $line ","]
set timeStamp [string trim [lindex $record 1]]
set email [string trim [lindex $record 3]]
if {$lastCommitTimeStamp eq ""} {
set lastCommitTimeStamp [string trim [lindex $record 1]]
}
set timeStamp [clock format [clock scan $timeStamp] -format {%a, %e %b %Y %H:%M:%S %z}]
# puts "> $commiter"
if {$index == 0} {
append outText "$args(--project-name) ($args(--project-version)-$args(--project-release))\n"
set commiter [lindex $record 2]
puts "\n[string trim $commiter] <$email> $timeStamp"
append outText "\n[string trim $commiter] <$email> $timeStamp\n"
StoreProjectInfo $timeStamp
}
if {$commiter ne [lindex $record 2]} {
puts "\n[string trim $commiter] <$email> $timeStamp"
append outText "\n[string trim $commiter] <$email> $timeStamp\n"
set commiter [lindex $record 2]
}
set commitTex [lindex $record 4]
puts " - $commitTex"
append outText " - $commitTex\n"
}
return $outText
}
# puts [ReadGitLog]
proc ShowHelp {} {
puts "\nChangelog generator from the Git commit history. For DEB and RPM packages"
puts "Usage:\n"
puts "\tchangelog-gen \[options\]\n"
puts "Where options:"
puts "\t--project-name - name of project (package) "
puts "\t--project-version - package version"
puts "\t--project-release - package release name (number)"
puts "\t--deb - debian package format of changelog"
puts "\t--rpm - rpm package format of changelog"
puts "\t--txt - plain text changelog out"
puts "\t--out-file - changelog file name"
puts "\t--last - The timestamp since the last launch of this program for a given project"
}
proc StoreChangeLog {outText} {
global args
if [file exists $args(--out-file)] {
file copy -force $args(--out-file) "$args(--out-file).tmp"
set origOutFile [open "$args(--out-file).tmp" "r"]
set origText [read $origOutFile]
close $origOutFile
set outFile [open $args(--out-file) "w"]
puts $outFile $outText
puts $outFile $origText
close $outFile
if [info exists args(--last)] {
set outFile [open $args(--out-file) "r+"]
puts $outFile $outText
close $outFile
} else {
set outFile [open $args(--out-file) "w+"]
puts $outFile $outText
close $outFile
}
} else {
set outFile [open $args(--out-file) "w+"]
puts $outFile $outText
close $outFile
}
}
set arglen [llength $argv]
set index 0
while {$index < $arglen} {
set arg [lindex $argv $index]
switch -exact $arg {
--project-name {
set args($arg) [lindex $argv [incr index]]
}
--project-version {
set args($arg) [lindex $argv [incr index]]
}
--project-release {
set args($arg) [lindex $argv [incr index]]
}
--deb {
set args($arg) true
}
--rpm {
set args($arg) true
}
--txt {
set args($arg) true
}
--out-file {
set args($arg) [lindex $argv [incr index]]
}
--last {
set args($arg) true
}
--help {
ShowHelp
exit
}
default {
set filename [lindex $argv $index]
}
}
incr index
}
if ![info exists args(--project-name)] {
puts "You mast set --project-name option\n"
exit
}
if ![info exists args(--project-version)] {
puts "You mast set --project-version option\n"
exit
}
if ![info exists args(--project-release)] {
puts "You mast set --project-release option\n"
exit
}
if [file exists [file join $dir(cfg) $args(--project-name).conf]] {
source [file join $dir(cfg) $args(--project-name).conf]
}
foreach arg [array names args] {
puts "$arg $args($arg)"
}
if [info exists args(--deb)] {
set outText [GenerateChangelogDEB]
if [info exists args(--out-file)] {
StoreChangeLog $outText
}
}
if [info exists args(--rpm)] {
GenerateChangelogRPM
}
if [info exists args(--txt)] {
set outText [GenerateChangelogTXT]
if [info exists args(--out-file)] {
StoreChangeLog $outText
}
}

View File

@@ -3,14 +3,16 @@
cd ../
VERSION=$(grep Version projman.tcl | grep -oE '\b[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\b')
RELEASE=$(grep Release projman.tcl | grep -oE '\b[0-9A-Za-z]{1,3}\b')
RELEASE=$(grep Release projman.tcl | grep -oE '[0-9A-Za-z]+$')
BUILD_DATE=$(date +%d%m%Y%H%M%S)
TXT="# Build: ${BUILD_DATE}"
echo "$VERSION, $RELEASE, $BUILD_DATE"
sed -i "/# Build:.*/c$TXT" projman.tcl
cp projman.tcl projman
cp changelog-gen.tcl changelog-gen
./changelog-gen.tcl --project-name projman --project-version ${VERSION} --project-release ${RELEASE} --out-file debian/changelog --deb --last
sed -i "s+^set\ dir(lib)+set\ dir(lib)\ /usr/share/projman/lib ;#+g" projman
@@ -19,10 +21,9 @@ sed -i "s+\[pwd\]+/usr/share/projman+g" projman
tar czf ../projman_${VERSION}.orig.tar.gz .
dpkg-buildpackage
dpkg-buildpackage -d
#cp ../projman_${VERSION}-${RELEASE}_amd64.deb /files/
rm -v projman
rm -v projman changelog-gen
rm -r -v debian/{projman,.debhelper}

339
debian/changelog vendored
View File

@@ -1,5 +1,338 @@
projman (2.0.0-alpha) stable; urgency=medium
projman (2.0.0-alpha16) stable; urgency=medium
* Initial release
* build-deb-projman.sh: добавлена генерация changelog из git log
* changelog-gen.tcl: Вывод в файл вынесен в отдельную процедуру
* changelog-gen.tcl: Добавлено создание резервной копии выходного файла. Исправлен вывод в файл.
* changelog-gen.tcl: Добавлены опции командной строки
* changelog-gen.tcl: Добавлена генерация текстового журнала изменений
* Добавлен запуск changelog-gen при сборке пакета
* Добавлено чстение журнала начиная с определенной даты
* Новая сборка
-- Sergey Kalinin <svk@nuk-svk.ru> Thu, 22 Aug 2024 13:38:52 +0300
projman (2.0.0-alfa15) stable; urgency=medium
* Генерация списка изменений для debian приведена к корректному виду
* Исправлен фокус при создании нового файла. #3
-- Калинин Сергей Валерьевич <svkalinin@samsonpost.ru> Wed, 17 Jul 2024 12:28:30 +0300
projman (2.0.0-alfa14) stable; urgency=medium
* Исправлена неправильная замена выражение при поиске
* Реализовал базовые функции генератора журнала изменений
-- svkalinin <svk@nuk-svk.ru> Thu, 27 Jun 2024 14:44:47 +0300
projman (2.0.0-alfa13) stable; urgency=medium
* Добавлена иконка для jinja template
* Исправил остатки слияния веток
* Исправлено некорректное определение типа файла при открытии.
-- svkalinin <svk@nuk-svk.ru> Mon, 30 Oct 2023 10:44:37 +0300
projman (2.0.0-alfa12) stable; urgency=medium
* Обновить .gitea/workflows/build.yml
* Gitea actions add
-- svk <svkalinin@samsonpost.ru> Thu, 27 Jul 2023 13:04:32 +0300
projman (2.0.0-alfa11) stable; urgency=medium
* Merge branch 'master' of https://git.nuk-svk.ru/svk/projman
* Исправил открытие файлов с разными путями (~/ ./ ../)
-- svkalinin <svk@nuk-svk.ru> Thu, 23 Feb 2023 13:46:56 +0300
projman (2.0.0-alfa10) stable; urgency=medium
* Добавил изображений программы
-- svk <svkalinin@samsonpost.ru> Mon, 6 Feb 2023 09:27:38 +0300
projman (2.0.0-alfa9) stable; urgency=medium
* Исправлена ошибка при создании нового файла.
-- svkalinin <svk@svk.home> Thu, 22 Dec 2022 19:59:05 +0300
projman (2.0.0-alfa8) stable; urgency=medium
* Добавил пиктограммы файлов
* Исправил процедуру Files::CloseAll ('Закрыть всё')
* Добавлена поддержка Lua
* Исправлена процедура (рас)комментирования
* Исправил ошибку при выходе в процедуре (Congig::Write)
* Добавил раскраски в ruby
* Добавлена возможность многострочных комментариев
* В Ruby lexer добавлен поиск переменных коде.
* Новая сборка
* Немного почистил. Добавлен поиск переменных по питоньим исходникам (lexer)
* Еще одно исправление подсветки для INI
* Новая сборка
* Исправлене подсветки комментариев в INI
* Новая сборка
* Изменения в подсветке для INI
* fix
* Добавил подсветку для Desktop и Spec файлов
* Добавил вывод отладочной инфы в процедуру
* Исправил подсветку комментариев в TCL
* Оптимизация процедур
* Добавлена подсветка и навигация по HTML. Исправлена подсветка XML
* Новая сборка
* Добавил иконку для изображений
* Добавил иконки для perl
* Fix
* Исправлена подсветка и навигация по коду для Ruby
* Обновил список изменений
* Исправлено сохранение сессии в редакторе (открытие папки и файлов при следующем запуске)
* Добавлена новая секция UserSession
* Исправление ошибки при открытии файла
* Добавлена поддержка INI-файлов (подсветка
* Добавлена поддержка perl
* Добавил икогнку для файлов git
* Новая сборка
* Добавлены иконуи для ключей и сертификатов. Изменен поиск иконки (вощзвращает теерь с размером)
* Новая чборка
* Реализован двухпанельный режим работы (вертиикальное разделение)
* Test
* Тесты
* TEsting drone build
* ДОбавил сборку в drone
* Исправлена ошибка при открытии ansible.cfg
* Добавил деактивацию кнопки 'Создать репу' если не выбран активный проект (не открыто ни одного каталога/папки)
* Добавлены команды git init и git config (зачаток). Изменен диалог клонирования репозитория (добавлена кнопка Создать репозиторий)
* Исправил ошибку git при открытии файла или каталога если репозиторий не инициализирован (нет .git каталога внутри проекта)
* Переименовал файл
* Добавил скриты сборки rpm
* Добавлено обрамление выделенного текста прии нажатии '_' в markdown
* Исправление подсветки
* Добавлена поддержка markdown (подсветка
* Обновил описание
* Новая сборка
* Исправлена ошибка с закрытием файлов в редакторе при закрытии папки
* Новая сборка
* Переделана процедура определения активного проекта. Исправлено определение ветки git. Теперь можно нормально работать в двух и более открытых проектах (каталогах/папках)
* Новая сборка
* Доделан вид диалога поиска по файлам
* Исправлен поиск имени функции
* Новая сборка
* Добавлен диалог клонирования репозитория
* Добавил разделитель
* Исправлено переключение вкладок при закрытии
* Исправлено закрытиие вкладки Git по нажатию соотв. кнопки в панели инструментов
* Добавлен пункт 'Закрыть всё'
* Новая сборка
* Исправлено соответствие открытого файла в редакторе и выделение этого файла в дереве
* Исправлено переключение отображения панели (лево/право) в без перезапуска программы.
* Украшательства интерфейса - Реакция на нажатие кнопки в панели инструментов теперь зависит от контекста
* Добавлено включение отключение отображения Меню
* Добавлено копирование текущей строки в буфер по Atl+Y
* Исправлена ошибка с отображением файловой панели
* Добавлены и исправлены функции отображения меню
* Фикс
* Добавлен параметр statusBarShow - показ строки статуса
* Добавлены переводы
* Добавлена проверка параметров вызова файл или просто строка
* Новая сборка
* Добавлен вывод сообщений об ошибке в диалоге
* Добавлено обновления списка файлов в дереве
* Добавлена процедура вывода информационного сообщения
* Добавлена команда Git::Reset (git reset _file_) на кнопке в диалоге. Для отмены 'git add'
* Добавлена кнопка Обновление в диалог работы с Git
* Исправление процедуры поиска наименования функции
* Фиксы диалога работы с Git (работа с выделенными файлами в списках)
* Test
* Фиксы и тесты работы с git
* test
* Исправление выборанескольких файлов в диалоге Git
* Новая сборка
* Украшательства
* Новая сборка
* Исправление рег. выражения чтения файлов командой git status
* Настройки темы
* Исправлено рег. выпражение определения mime типа файла
* Ntvs
* Новая сборка
* Добавил очистку текстовых полей при добавлении файлов в коммит
* Исправрелдение Git::Commit (индексация всех файлов в проекте)
* Изменения
* Фиксы
* Test
* Исправления глюков
* Украшательства строки статуса
* Добавлен просмотрщик изображений
* Добавил рамку кону ввода номера
* Добавлен диалог перехода по номеру строки Ctrl-G
* Добавлено определение типа файла
* Новая сборка
* Добавил удаление артефактов сборки пакета
* Новая сборка
* Fix
* Добавлена подсветка имен файлов в выводе git show
* Новая сборка
* Допилдивание процедуры автоввода имен переменных
* Небольшие правки в подсказках по переменным
* Новая сборка
* Исправлена подсветка SHELL переменных а YAML файлах (ansible
* Fix
* Новая сборка. Добавлена подсказка по переменным при вводе.
* Добавлено определение символа переменной
* fackup
* Определение коррректного положения встроенного окна
* Новая сборка
* Добавлен вывод подсказки при вводе переменных
* Добавлены опции для включсения полджсказок по переменным и процедурам
* Новая сборка
* Исправления гуя
* Fix
* Фикс
* Добавил диалог создания и переключения git-веток
* Создание ветки
* Фикс
* Новые иконки
* Косметические изменения
* Ченю push
* Ченю push
* Починил push
* Добавлены новые иконки
* Обработка ошибок
* Обработка ошибок
* Новая сборка
* Исправлена ошибка при клике на списке с файлами
* New build
* Сделал просмотр изменений из истории
* Добавлено обновление лога изменений
* Новый билд
* Исправление обновления диалога
* Fix
* Добавлен перевод
* git reflog
* Добавлен интерфейс работы с Git
* Новый релиз
* Исправил ошибку если нет изменений
* Начало работ по поддержке git
* New build
* Bug fix
* Добавлен диалог поиска строки в файлах в текущем каталоге. Используется 'grep -r'.
* Добавлены настройки для системной команды поиска в фвайлах
* Добавлено рекурсивное чтение каталога при открытии. Диалог поиска теперь работает раздельно при разделении окна. Диалог навигации по функци так-же работает раздельно
* Добавлены ключевые слова для подстветки питона
* Добавлена проверка на отсутствие файла и удаление из дерева
-- svkalinin <svk@nuk-svk.ru> Sun, 18 Sep 2022 10:46:59 +0300
projman (2.0.0-alfa7) stable; urgency=medium
* Добавлен поиск переменной в тексте после открытия файла где она указана
* Исправлена ошибка при запуске
-- Sergey Kalinin <svkalinin@samsonpost.ru> Fri, 16 Sep 2022 16:37:17 +0300
projman (2.0.0-alfa6) stable; urgency=medium
* Новая сборка
* Исправил сохранение открытого каталога в настройках
* Рефакторинг
* Переделал дилог навигации по переменным
* Исправил ошибку
* Добавлен еще один каталог с переменными - default
* Добавлено сохранение состояния редактора (открытые каталоги
* Изменения в диалоге поиска
* Изменения в диалоге поиска
* Отображение горизонтальной полосы прокрутки в зависимости от переноса строк в редакторе
* Установка фокуса на текст в редакторе при щелчке на заголовок вкладки
* Сделал перемещение курсора в такуюже позицию в тексте при разделении окна редактора
* Добавлено горизонтальное разделение окна редактора. Исправлено удаление строки по Alt+R - реперь строка удаляется полностью вместе с символами переноса. Исправлено сохранение нового файла (untitled) но всеравно как-то криво.
* Изменения по чтению и отображению переменных по файлам. Причесал диалог
-- svkalinin <svk@nuk-svk.ru> Fri, 2 Sep 2022 21:42:40 +0300
projman (2.0.0-alfa5) stable; urgency=medium
* Добавил поддержку ruby
* Исправлен выход окна со списком функций за пределы экрана. Поиск и замена теперь работает. Добавлены некоторые иконки для файлов
* Начало реализации процедуры поиска и замены (поиск криво но работает)
* Fix
* Исправлено закерытие вкладки по щелчку мыши. Добавлена настройка переноса строк в редакторе. Добавлены сочетания клавиш ctrl+pgup cntrl+pgdown для переключения между вкладками редактора. Добавлен диалог закрытия папки (каталога)
* Укоротил имя корневого каталога в дереве
* Добавлены ключиевые слова GO
* Исправлена подсветка ключевых слов tcl и добавлены виджеты
* Исправлена некорректная установка иконки на каталог
* Добавлены горячие клавиши для удаления слова
* Добавлены сочетания клавиш для удаления слова
-- svkalinin <svk@nuk-svk.ru> Fri, 26 Aug 2022 12:36:14 +0300
projman (2.0.0-alfa4) stable; urgency=medium
* Добавлена поддержка python. Обновлена библиотека иконок.
* Исправлена установка фокуса на окно диалога GotoFunctionDialog и обратно на текст. Переделан механизм чтения структуры файла и добавлены команды для sh (bash)
* Добавлены настройки темы для диалога навигации по функциям
* Добавлена иконка shell (*.sh)
* Исправлено комментирование строк
* Добавлен диалог навигации по структуре (процедурам) по Ctrl+F. Исправлена ошибка при закрытии файлов (функции из дерева теперь удаляются).
* Добавил цвет фона для панели с номерами строк
-- svkalinin <svk@nuk-svk.ru> Wed, 17 Aug 2022 21:37:06 +0300
projman (2.0.0-alfa3) stable; urgency=medium
* Убрал доки по tcl
* Слегка поменял стиль оформления
-- Sergey Kalinin <svkalinin@samsonpost.ru> Wed, 17 Aug 2022 16:52:22 +0300
projman (2.0.0-alfa2) stable; urgency=medium
* Добавлен выбор расположения боковой панели
* Добавлено выделение всех слов в тексте по двойному щелчку мышой на любом слове
* Исправлено чтение структуры GO файлов: корректное отображение в дереве функций возвращающих значения разных типов
* Добавлена подсветка скобок
* Новая сборка
* Исправлены процедуры comment/uncomment
* Изменены имена переенных
* Изменены имена переменных
* Добавлена запись номера сборки (build) в исходник
* Добавлено меню Помощь -> О программе. Добавлено окно 'О программе'
* Исправлен поиск процедуры в тексте по клику в дереве
* Исправлен поиск процедуры в тексте по клику в дереве. Исправлено отображение позиции курсора в строке статуса
* ДОбавлены иконки для некоторых типов файлов
* Добавлено отображение структуры исходника в дереве (функции (go) и процедуры (tcl))
* Добавлено кодирование изображения в base64 и вставка в редактируемый текст
* Добавлены шрифт и цвет шриыта для общего интерфейса
* Исправлено комментирование выделенного фрагмента (последняя строка) Исправлено закрытие untitled вкладок
* Исправлено комментирование выделенных строк
* Добавлена подсветка для GO
* Добавлена подстка для GO
* Исправлено подключение требуемой процедуры подсветки
* Убрал вставку закрывающихся кавычек в пустой строке. Ибо пока глючит.
* Добавлен диалог сохранения файла при закрытии вкладки редактора и при выходе из программы если есть несохраненные файлы
* Исправлен рабочий каталог
* Добавлены переводы для диалога
* Исправлен скрипт сборки пакета для Debian
* Убрал лишнее
* Исправил скрипт сборки пакета. Добавил .gitignore
* Исправил скрипт сборки пакета. Добавил .gitignore
-- svkalinin <svk@nuk-svk.ru> Thu, 21 Jul 2022 12:18:29 +0300
projman (2.0.0-alfa1) stable; urgency=medium
* Изменил(а) на 'README.md'
-- svk <svkalinin@samsonpost.ru> Thu, 21 Jul 2022 12:15:19 +0300
projman (2.0.0-alfa0) stable; urgency=medium
* Change readme
* Added Dark theme
* New version of ProjMan
* New version of ProjMan
* Some changes into GUI (tabs)
-- svkalinin <banzaj28@yandex.ru> Thu, 5 Jul 2018 08:41:18 +0300
-- Sergey Kalinin <svk@nuk-svk.ru> Wed, 20 Jul 2022 16:56:31 +0300

5
debian/install vendored
View File

@@ -1,7 +1,8 @@
projman /usr/bin/
changelog-gen /usr/bin/
lib/*.tcl /usr/share/projman/lib
lib/msgs/* /usr/share/projman/lib/msgs
theme /usr/share/projman/
README.md /usr/share/doc/projman
debian/projman.desktop /usr/share/applications
projman-48.png /usr/share/pixmaps
projman.desktop /usr/share/applications
projman.png /usr/share/pixmaps

View File

@@ -23,8 +23,6 @@ if [info exists env(LANG)] {
set ::configDefault "\[General\]
cfgModifyDate=''
opened=
editedFiles=
searchCommand=/usr/bin/grep
searchCommandOptions=-r -n -H
gitCommand=/usr/bin/git
@@ -36,7 +34,7 @@ locale=$locale
theme=dark
toolBarShow=true
menuShow=true
statusbarShow=true
statusBarShow=true
filesPanelShow=true
filesPanelPlace=left
geometry=1024x768
@@ -62,6 +60,10 @@ lineNumberShow=true
tabSize=4
procedureHelper=false
variableHelper=true
multilineComments=true
\[UserSession\]
opened=
editedFiles=
"
proc Config::create {dir} {
set cfgFile [open [file join $dir projman.ini] "w+"]
@@ -81,7 +83,7 @@ proc Config::read {dir} {
}
proc Config::write {dir} {
global activeProject
global activeProject editors
set cfgFile [ini::open [file join $dir projman.ini] "w"]
foreach section [array names ::cfgINIsections] {
foreach key $::cfgINIsections($section) {
@@ -91,14 +93,30 @@ proc Config::write {dir} {
set systemTime [clock seconds]
# Set a config modify time (i don't know why =))'
ini::set $cfgFile "General" cfgModifyDate [clock format $systemTime -format "%D %H:%M:%S"]
ini::set $cfgFile "UserSession" editedFiles ""
# Save an top level window geometry into config
ini::set $cfgFile "GUI" geometry [wm geometry .]
if {[info exists activeProject] !=0 && $activeProject ne ""} {
ini::set $cfgFile "General" opened $activeProject
ini::set $cfgFile "UserSession" opened $activeProject
# Добавим пути к открытым в редакторе файлам в переменную
if [info exists editors] {
foreach i [dict keys $editors] {
# puts [dict get $editors $i]
if [dict exists $editors $i fileFullPath] {
lappend edited [dict get $editors $i fileFullPath]
}
}
if [info exists edited] {
ini::set $cfgFile "UserSession" editedFiles $edited
}
}
} else {
ini::set $cfgFile "General" opened ""
ini::set $cfgFile "UserSession" opened ""
ini::set $cfgFile "UserSession" editedFiles ""
}
# puts $editors
ini::commit $cfgFile
ini::close $cfgFile
}

View File

@@ -20,30 +20,55 @@ namespace eval Editor {
# Comment one string or selected string
proc Comment {txt fileType} {
global lexers
global lexers cfgVariables
set selIndex [$txt tag ranges sel]
set pos [$txt index insert]
set lineNum [lindex [split $pos "."] 0]
set PosNum [lindex [split $pos "."] 1]
# set posNum [lindex [split $pos "."] 1]
set useMultiLine false
if [dict exists $lexers $fileType commentSymbol] {
set symbol [dict get $lexers $fileType commentSymbol]
} else {
set symbol "#"
}
puts "Select : $selIndex"
if {[dict exists $lexers $fileType commentMultilineSymbolBegin] == 1 && $cfgVariables(multilineComments) eq "true"} {
set symbolBegin [dict get $lexers $fileType commentMultilineSymbolBegin]
} else {
set symbolBegin ""
}
if {[dict exists $lexers $fileType commentMultilineSymbolEnd] == 1 && $cfgVariables(multilineComments) eq "true"} {
set symbolEnd [dict get $lexers $fileType commentMultilineSymbolEnd]
} else {
set symbolEnd ""
}
# puts "Select : $selIndex"
if {$selIndex != ""} {
set lineBegin [lindex [split [lindex $selIndex 0] "."] 0]
set lineEnd [lindex [split [lindex $selIndex 1] "."] 0]
# Если выделенно больше одной строки то включаем многострочный комментарий
if {$lineBegin < $lineEnd} {
set useMultiLine true
}
set posBegin [lindex [split [lindex $selIndex 1] "."] 0]
set posEnd [lindex [split [lindex $selIndex 1] "."] 1]
if {$lineEnd == $lineNum && $posEnd == 0} {
set lineEnd [expr $lineEnd - 1]
}
for {set i $lineBegin} {$i <=$lineEnd} {incr i} {
#$txt insert $i.0 "# "
regexp -nocase -indices -- {^(\s*)(.*?)} [$txt get $i.0 $i.end] match v1 v2
$txt insert $i.[lindex [split $v2] 0] "$symbol "
if {$symbolEnd ne ""} {
$txt insert $lineEnd.end "\n$symbolEnd"
set lineEnd [expr $lineEnd + 2]
}
if {$symbolBegin ne ""} {
$txt insert $lineBegin.0 "$symbolBegin\n"
}
if {$symbolBegin eq "" && $symbolEnd eq ""} {
for {set i $lineBegin} {$i <= $lineEnd} {incr i} {
#$txt insert $i.0 "# "
regexp -nocase -indices -- {^(\s*)(.*?)} [$txt get $i.0 $i.end] match v1 v2
$txt insert $i.[lindex [split $v2] 0] "$symbol "
}
}
$txt tag add comments $lineBegin.0 $lineEnd.end
$txt tag raise comments
@@ -62,14 +87,14 @@ namespace eval Editor {
set lineNum [lindex [split $pos "."] 0]
set posNum [lindex [split $pos "."] 1]
if {[info procs GetComment:$fileType] ne ""} {
set commentProcedure "GetComment:$fileType"
} else {
set commentProcedure {GetComment:Unknown}
}
# set commentProcedure "GetComment"
# if {[info procs GetComment:$fileType] ne ""} {
# set commentProcedure "GetComment"
# } else {
# set commentProcedure {GetComment:Unknown}
# }
set commentProcedure "GetComment"
# puts "$fileType, $commentProcedure"
puts "$fileType, $commentProcedure"
if {$selIndex != ""} {
set lineBegin [lindex [split [lindex $selIndex 0] "."] 0]
set lineEnd [lindex [split [lindex $selIndex 1] "."] 0]
@@ -80,7 +105,7 @@ namespace eval Editor {
}
for {set i $lineBegin} {$i <=$lineEnd} {incr i} {
set str [$txt get $i.0 $i.end]
set commentSymbolIndex [$commentProcedure $str]
set commentSymbolIndex [$commentProcedure $fileType $str]
if {$commentSymbolIndex != 0} {
$txt delete $i.[lindex $commentSymbolIndex 0] $i.[lindex $commentSymbolIndex 1]
}
@@ -91,7 +116,7 @@ namespace eval Editor {
} else {
set posNum [lindex [split $pos "."] 1]
set str [$txt get $lineNum.0 $lineNum.end]
set commentSymbolIndex [$commentProcedure $str]
set commentSymbolIndex [$commentProcedure $fileType $str]
if {$commentSymbolIndex != 0} {
$txt delete $lineNum.[lindex $commentSymbolIndex 0] $lineNum.[lindex $commentSymbolIndex 1]
}
@@ -101,35 +126,47 @@ namespace eval Editor {
}
proc GetComment {fileType str} {
global lexers
puts [dict get $lexers $fileType commentSymbol]
if {[dict exists $lexers $fileType commentSymbol] == 0} {
return
# puts [dict get $lexers $fileType commentSymbol]
if [dict exists $lexers $fileType commentSymbol] {
# return
set symbol [dict get $lexers $fileType commentSymbol]
} else {
set symbol "#"
}
regsub -all {\{} $str "\\{" str
regsub -all {\}} $str "\\}" str
regsub -all {\[} $str {\\[} str
regsub -all {\]} $str {\\]} str
if {[regexp -nocase -indices -- {(^| )([dict get $lexers $fileType commentSymbol]\s)(.+)} $str match v1 v2 v3]} {
puts "$match, $v1, $v2, $v3"
set cmd "regexp -nocase -indices -- {(^|\s+)\\s*($symbol\\s*)(.*)} {$str} match v1 v2 v3"
puts $cmd
# puts [eval $cmd]
if [eval $cmd] {
puts "$match, $v2, $v3"
return [list [lindex [split $v2] 0] [lindex [split $v3] 0]]
} else {
return 0
}
}
proc GetComment:TCL {str} {
if {[regexp -nocase -indices -- {(^| )(#\s)(.+)} $str match v1 v2 v3]} {
return [list [lindex [split $v2] 0] [lindex [split $v3] 0]]
} else {
return 0
}
}
proc GetComment:GO {str} {
# puts ">>>>>>>$str"
if {[regexp -nocase -indices -- {(^| |\t)(//\s)(.+)} $str match v1 v2 v3]} {
# puts ">>>> $match $v1 $v2 $v3"
return [list [lindex [split $v2] 0] [lindex [split $v3] 0]]
} else {
return 0
}
}
# proc GetComment:TCL {str} {
# if {[regexp -nocase -indices -- {(^| )(#\s)(.+)} $str match v1 v2 v3]} {
# return [list [lindex [split $v2] 0] [lindex [split $v3] 0]]
# } else {
# return 0
# }
# }
# proc GetComment:GO {str} {
# # puts ">>>>>>>$str"
# if {[regexp -nocase -indices -- {(^| |\t)(//\s)(.+)} $str match v1 v2 v3]} {
# # puts ">>>> $match $v1 $v2 $v3"
# return [list [lindex [split $v2] 0] [lindex [split $v3] 0]]
# } else {
# return 0
# }
# }
proc GetComment:Unknown {str} {
if {[regexp -nocase -indices -- {(^| )(#\s)(.+)} $str match v1 v2 v3]} {
return [list [lindex [split $v2] 0] [lindex [split $v3] 0]]
@@ -338,19 +375,12 @@ namespace eval Editor {
proc SelectionHighlight {txt} {
variable selectionText
$txt tag remove lightSelected 1.0 end
set selBegin [lindex [$txt tag ranges sel] 0]
set selEnd [lindex [$txt tag ranges sel] 1]
if {$selBegin ne "" && $selEnd ne ""} {
set selectionText [$txt get $selBegin $selEnd]
# set selBeginRow [lindex [split $selBegin "."] 1]
# set selEndRow [lindex [split $selEnd "."] 1]
# puts "$selBegin, $selBeginRow; $selEnd, $selEndRow"
# set symNumbers [expr $selEndRow - $selBeginRow]
set symNumbers [expr [lindex [split $selEnd "."] 1] - [lindex [split $selBegin "."] 1]]
# puts "Selection $selectionText"
if [string match "-*" $selectionText] {
set selectionText "\$selectionText"
}
@@ -359,7 +389,6 @@ namespace eval Editor {
set selFindLine [lindex [split $ind "."] 0]
set selFindRow [lindex [split $ind "."] 1]
set endInd "$selFindLine.[expr $selFindRow + $symNumbers]"
# puts "$ind; $symNumbers; $selFindLine, $selFindRow; $endInd "
$txt tag add lightSelected $ind $endInd
}
}
@@ -369,6 +398,7 @@ namespace eval Editor {
set win .varhelper
# if { [winfo exists $win] == 0 } { return }
set ind [$win.lBox curselection]
puts ">>>>>>>>>>>> VarHelperBind <<<<<<<<<<<<<<<<"
switch -- $K {
Prior {
@@ -413,27 +443,22 @@ namespace eval Editor {
}
} ;# proc auto_completition_key
proc VarHelperEscape {w} {
puts "VarHelperEscape"
bindtags $w.t [list [winfo parent $w.t] $w.t Text sysAfter all]
puts ">>>>>>>>>>>> VarHelperEscape <<<<<<<<<<<<<<<<"
# bindtags $w [list [winfo parent $w] $w Text sysAfter all]
bindtags $w [list [winfo toplevel $w] $w Ctext sysAfter all]
catch { destroy .varhelper }
puts [bindtags $w]
puts [bind $w]
puts [bindtags $w.t]
puts [bind $w.t]
}
proc VarHelper {x y w word wordType} {
global editors lexers variables
variable txt
variable win
# set txt $w.frmText.t
# блокировка открытия диалога если запущен другой
if [winfo exists .findVariables] {
return
}
set txt $w
set win .varhelper
# set win .varhelper
puts "$x $y $w $word $wordType"
set fileType [dict get $editors $txt fileType]
@@ -502,20 +527,38 @@ namespace eval Editor {
}
}
# unset item
# puts $findedVars
bindtags $txt [list VarHelperBind [winfo toplevel $txt] $txt Ctext sysAfter all]
# bindtags $txt [list VarHelperBind [winfo toplevel $txt] $txt Ctext sysAfter all]
# bindtags $txt.t [list VarHelperBind [winfo parent $txt.t] $txt.t Text sysAfter all]
bind VarHelperBind <Escape> "Editor::VarHelperEscape $txt; break"
# bindtags $txt.t {[list [winfo parent $txt.t] $txt.t Text sysAfter all]};
# bindtags $txt {[list [winfo toplevel $txt] $txt Ctext sysAfter all]};
# catch { destroy .varhelper }"
bind VarHelperBind <Key> {Editor::VarHelperKey $Editor::txt %K %A; break}
if { [winfo exists $win] } { destroy $win }
# bind VarHelperBind <Escape> "Editor::VarHelperEscape $txt.t; break"
# # bindtags $txt.t {[list [winfo parent $txt.t] $txt.t Text sysAfter all]};
# # bindtags $txt {[list [winfo toplevel $txt] $txt Ctext sysAfter all]};
# # catch { destroy .varhelper }"
# bind VarHelperBind <Key> {Editor::VarHelperKey %W %K %A; break}
#
if {$findedVars eq ""} {
return
}
# puts $findedVars
VarHelperDialog $x $y $w $word $findedVars
}
proc VarHelperDialog {x y w word findedVars} {
global editors lexers variables
variable txt
variable win
# puts ">>>>>>>>>>>>>$x $y $w $word $findedVars"
# set txt $w.frmText.t
# блокировка открытия диалога если запущен другой
# if [winfo exists .findVariables] {
# return
# }
# if { [winfo exists $win] } { destroy $win }
set txt $w
set win .varhelper
# if {$findedVars eq ""} {
# return
# }
toplevel $win
wm transient $win .
wm overrideredirect $win 1
@@ -542,15 +585,13 @@ namespace eval Editor {
focus -force $Editor::txt.t
break
}
# bind $win.lBox <Return> {
# set findString [dict get $lexers [dict get $editors $Editor::txt fileType] procFindString]
# set values [.varhelper.lBox get [.varhelper.lBox curselection]]
# regsub -all {PROCNAME} $findString $values str
# Editor::FindFunction $Editor::txt "$str"
# destroy .varhelper.lBox
# # focus $Editor::txt.t
# break
# }
bind VarHelperBind <Control-Return> {
$Editor::txt delete "insert - 1 chars wordstart" "insert wordend - 1 chars"
$Editor::txt insert "insert" [.varhelper.lBox get [.varhelper.lBox curselection]]
# eval [bind VarHelperBind <Escape>]
Editor::VarHelperEscape $Editor::txt
break
}
# Определям расстояние до края экрана (основного окна) и если
# оно меньше размера окна со списком то сдвигаем его вверх
@@ -590,7 +631,7 @@ namespace eval Editor {
$txt tag remove lightSelected 1.0 end
if { [winfo exists .varhelper] } { destroy .varhelper }
puts $k
# puts $k
switch $k {
Return {
regexp {^(\s*)} [$txt get [expr $lineNum - 1].0 [expr $lineNum - 1].end] -> spaceStart
@@ -683,6 +724,9 @@ namespace eval Editor {
grave {
QuotSelection $txt {`}
}
underscore {
QuotSelection $txt {_}
}
parenleft {
# QuotSelection $txt {)}
}
@@ -726,12 +770,13 @@ namespace eval Editor {
$txt tag remove sel {insert linestart} {insert lineend + 1char}
return
}
proc BindKeys {w txt fileType} {
proc BindKeys {w txt fileType nb} {
global cfgVariables
# variable txt
# set txt $w.frmText.t
bind $txt <KeyRelease> "catch {Editor::ReleaseKey %K $txt $fileType}"
bind $txt <KeyPress> "Editor::PressKey %K $txt"
bind $txt <Control-eacute> Quit
bind $txt <Control-igrave> "Editor::SelectionPaste $txt"
bind $txt <Control-v> "Editor::SelectionPaste $txt"
bind $txt <Control-l> "SearchVariable $txt; break"
@@ -744,7 +789,7 @@ namespace eval Editor {
bind $txt <Insert> {OverWrite}
bind $txt <ButtonRelease-1> "Editor::SearchBrackets $txt"
bind $txt <Button-1><ButtonRelease-1> "Editor::SelectionHighlight $txt"
bind $txt <<Modified>> "SetModifiedFlag $w"
bind $txt <<Modified>> "SetModifiedFlag $w $nb"
bind $txt <Control-i> ImageBase64Encode
bind $txt <Control-u> "Editor::SearchBrackets %W"
bind $txt <Control-J> "catch {Editor::GoToFunction $txt}"
@@ -879,7 +924,8 @@ namespace eval Editor {
set nbEditorItem [NB::InsertItem $nbEditor $fileFullPath "file"]
# puts "$nbEditorItem, $nbEditor"
Editor $fileFullPath $nbEditor $nbEditorItem
SetModifiedFlag $nbEditorItem
SetModifiedFlag $nbEditorItem $nbEditor
focus -force $nbEditorItem.frmText.t.t
}
proc ReadStructure {txt treeItemName} {
@@ -1128,20 +1174,32 @@ namespace eval Editor {
set lstFindIndex [$txt search -all -nocase -count matchIndexPair $findString $line.$x end]
# set symNumbers [string length "$findString"]
}
# puts $lstFindIndex
puts $lstFindIndex
# puts $matchIndexPair
# set lstFindIndex [$txt search -all "$selectionText" 0.0]
# Найдем разницу в длине строк для установки правильного
# индекса для выделения текста после вставки
set stringLengthDiff [expr [string length $findString] - [string length $replaceString]]
set i 0
foreach ind $lstFindIndex {
foreach ind [lsort -dictionary -decreasing $lstFindIndex] {
set selFindLine [lindex [split $ind "."] 0]
set selFindRow [lindex [split $ind "."] 1]
# set endInd "$selFindLine.[expr $selFindRow + $symNumbers]"
set endInd "$selFindLine.[expr [lindex $matchIndexPair $i] + $selFindRow]"
# puts "$ind; $selFindLine, $selFindRow; $endInd "
puts "$ind; $selFindLine, $selFindRow; $endInd "
if {$replaceString ne ""} {
$txt replace $ind $endInd $replaceString
# Вычисляем индекс вхождения строки после замены для выделения в тексте
if {$stringLengthDiff > 0} {
$txt tag add sel $ind "$endInd - [expr [tcl::mathfunc::abs $stringLengthDiff]] chars"
} else {
$txt tag add sel $ind "$endInd + [expr [tcl::mathfunc::abs $stringLengthDiff]] chars"
}
} else {
$txt tag add sel $ind $endInd
}
$txt tag add sel $ind $endInd
incr i
}
.finddialog.lblCounter configure -text "[::msgcat::mc "Finded"]: $i"
@@ -1269,7 +1327,7 @@ namespace eval Editor {
}
# Horizontal split the Editor text widget
proc SplitEditorH {w fileType} {
proc SplitEditorH {w fileType nb} {
global cfgVariables
puts [$w.panelTxt panes]
if [winfo exists $w.frmText2] {
@@ -1278,7 +1336,7 @@ namespace eval Editor {
focus -force $w.frmText.t.t
return
}
set frmText [Editor::EditorWidget $w $fileType]
set frmText [Editor::EditorWidget $w $fileType $nb]
$frmText.t insert end [$w.frmText.t get 0.0 end]
# $w.panelTxt add $w.frmText -weight 0
@@ -1288,25 +1346,34 @@ namespace eval Editor {
ReadStructure $frmText.t ""
focus -force $frmText.t.t
}
proc SplitEditorV {w fileType} {
proc SplitEditorV {fileFullPath} {
global cfgVariables
.frmBody.panel add $frmTree -weight 0
puts [$w.panelTxt panes]
if [winfo exists $w.frmText2] {
$w.panelTxt forget $w.frmText2
destroy $w.frmText2
regsub -all {\.|/|\\|\s} $fileFullPath "_" itemName
set itemName ".frmWork.nbEditor2.$itemName"
# puts $itemName
if {[winfo exists $itemName] == 1} {
.frmWork.nbEditor2 forget $itemName
destroy $itemName
if {[llength [.frmWork.nbEditor2 tabs]] == 0} {
if [lsearch -exact [.frmWork.panelNB panes] .frmWork.nbEditor2] {
grid forget .frmWork.nbEditor2
.frmWork.panelNB forget .frmWork.nbEditor2
}
}
return
}
set frmText [Editor::EditorWidget $w $fileType]
$frmText.t insert end [$w.frmText.t get 0.0 end]
pack .frmWork.nbEditor2 -side left -fill both -expand true
pack propagate .frmWork.nbEditor2 false
# grid .frmWork.nbEditor2 -row 0 -column 1 -sticky nsew
# grid columnconfigure .frmWork .frmWork.nbEditor -weight 1
# grid rowconfigure .frmWork .frmWork.nbEditor -weight 1
# grid columnconfigure .frmWork .frmWork.nbEditor2 -weight 1
# grid rowconfigure .frmWork .frmWork.nbEditor2 -weight 1
.frmWork.panelNB add .frmWork.nbEditor2 -weight 0
puts [FileOper::Edit $fileFullPath .frmWork.nbEditor2]
# $w.panelTxt add $w.frmText -weight 0
$w.panelTxt add $frmText -weight 1
$frmText.t see [$w.frmText.t index insert]
# $frmText.t mark set insert [$w.frmText.t index insert]
}
proc GoToLineNumber {text lineNumber} {
@@ -1366,7 +1433,7 @@ namespace eval Editor {
focus $win.ent
}
proc EditorWidget {fr fileType} {
proc EditorWidget {fr fileType nb} {
global cfgVariables editors
if [winfo exists $fr.frmText] {
@@ -1413,7 +1480,7 @@ namespace eval Editor {
} else {
Highlight::Default $txt
}
BindKeys $fr $txt $fileType
BindKeys $fr $txt $fileType $nb
return $frmText
}
@@ -1448,9 +1515,9 @@ namespace eval Editor {
set btnSplitV "btnSplitV[string range $itemName [expr [string last "." $itemName] +1] end]"
set btnSplitH "btnSplitH[string range $itemName [expr [string last "." $itemName] +1] end]"
ttk::button $fr.header.$btnSplitH -image split_horizontal_11x11 \
-command "Editor::SplitEditorH $fr $fileType"
-command "Editor::SplitEditorH $fr $fileType $nb"
ttk::button $fr.header.$btnSplitV -image split_vertical_11x11 \
-command "Editor::SplitEditorV $fr $fileType" -state disable
-command "Editor::SplitEditorV $fileFullPath"
# pack $fr.$btnSplitH $fr.$btnSplitV -side right -anchor e
pack $fr.header.$lblName -side left -expand true -fill x
pack $fr.header.$btnSplitV $fr.header.$btnSplitH -side right
@@ -1464,7 +1531,8 @@ namespace eval Editor {
if {[lsearch -exact $imageType $fileType] != -1} {
ImageViewer $fileFullPath $itemName $fr
} else {
set frmText [Editor::EditorWidget $fr $fileType]
set frmText [Editor::EditorWidget $fr $fileType $nb]
dict set editors $frmText.t fileFullPath $fileFullPath
}
$fr.panelTxt add $frmText -weight 0

View File

@@ -31,7 +31,8 @@ namespace eval FileOper {
# lappend cmd $activeProject
lappend cmd $fileFullPath
catch $cmd pipe
# puts $cmd
catch $cmd pipe
# puts $pipe
if [regexp -nocase -- {(\w+)/([\w\-_\.]+); charset=([[:alnum:]-]+)} $pipe m fType fExt fCharset] {
puts "$fType $fExt $fCharset"
@@ -43,11 +44,14 @@ namespace eval FileOper {
}
}
}
# линуксовый file не всегда корректно определяет тип файла
# используем пакет из tcl
lassign [::fileutil::fileType $fileFullPath] fType fBinaryType fBinaryInterp
puts "File type is $fType, $fBinaryType, $fBinaryInterp"
switch $fType {
"application" {
if {$fExt ne "json"} {
return false
}
"binary" {
return false
}
"text" {
return text
@@ -195,17 +199,22 @@ namespace eval FileOper {
proc CloseAll {} {
global nbEditor modified
foreach nbItem [array names modified] {
if {$modified($nbItem) eq "true"} {
$nbEditor select $nbItem
# puts "close tab $nbItem"
if {[Close] eq "cancel"} {return "cancel"}
foreach nb2Item [.frmWork.nbEditor2 tabs] {
.frmWork.nbEditor2 forget $nb2Item
}
if {[lsearch -exact [.frmWork.panelNB panes] .frmWork.nbEditor2] != -1} {
.frmWork.panelNB forget .frmWork.nbEditor2
}
foreach nbItem [$nbEditor tabs] {
catch {$nbEditor select $nbItem}
if {[Close] eq "cancel"} {
return "cancel"
}
}
}
proc Close {} {
global nbEditor modified tree
global nbEditor modified tree editors
set nbItem [$nbEditor select]
# puts "close tab $nbItem"
@@ -240,6 +249,8 @@ namespace eval FileOper {
if [info exists modified($nbItem)] {
unset modified($nbItem)
}
# puts $nbItem
set editors [dict remove $editors $nbItem.frmText.t]
.frmStatus.lblPosition configure -text ""
.frmStatus.lblEncoding configure -text ""
.frmStatus.lblSize configure -text ""
@@ -277,7 +288,7 @@ namespace eval FileOper {
puts -nonewline $f $editedText
puts "$f was saved"
close $f
ResetModifiedFlag $nbEditorItem
ResetModifiedFlag $nbEditorItem $nbEditor
}
proc SaveAll {} {
@@ -381,12 +392,12 @@ namespace eval FileOper {
$txt see 1.0
}
proc Edit {fileFullPath} {
global nbEditor tree
proc Edit {fileFullPath {nbEditor .frmWork.nbEditor}} {
global tree
if {[file exists $fileFullPath] == 0} {
return false
} else {
# puts [::fileutil::magic::filetype $fileFullPath]
puts "$fileFullPath File type [::fileutil::magic::filetype $fileFullPath]"
set fileType [FileOper::GetFileMimeType $fileFullPath]
}
switch $fileType {
@@ -414,7 +425,7 @@ namespace eval FileOper {
Editor::Editor $fileFullPath $nbEditor $itemName
ReadFile $fileFullPath $itemName
$itemName.frmText.t highlight 1.0 end
ResetModifiedFlag $itemName
ResetModifiedFlag $itemName $nbEditor
$itemName.frmText.t see 1.1
}
$nbEditor select $itemName
@@ -442,7 +453,7 @@ namespace eval FileOper {
set selBegin [lindex [$txt tag ranges sel] 0]
set selEnd [lindex [$txt tag ranges sel] 1]
set str [$txt get $selBegin $selEnd]
puts $str
# puts $str
set res [SearchStringInFolder $str]
}
}

View File

@@ -92,8 +92,11 @@ namespace eval Git {
global cfgVariables activeProject
set cmd exec
set d [pwd]
if {$activeProject ne ""} {
if {$activeProject ne "" && [file isdirectory $activeProject] == 1} {
cd $activeProject
if ![file exists .git] {
return
}
} else {
return ""
}
@@ -127,7 +130,14 @@ namespace eval Git {
proc Status {} {
global cfgVariables activeProject
cd $activeProject
if [file isdirectory $activeProject] {
cd $activeProject
if ![file exists .git] {
return
}
} else {
return false
}
set cmd exec
lappend cmd $cfgVariables(gitCommand)
lappend cmd "status"
@@ -239,6 +249,10 @@ namespace eval Git {
# puts "$cmd"
catch $cmd pipe
puts $pipe
if [regexp -nocase -- {^fatal:} $pipe match] {
ShowMessage "Command: '$cmd' error" $pipe
return
}
foreach line [split $pipe "\n"] {
# puts "$line"
lappend res $line
@@ -385,6 +399,40 @@ namespace eval Git {
puts $pipe
return
}
proc Config {repo user email} {
global activeProject cfgVariables
# puts $values
set cmd exec
lappend cmd $cfgVariables(gitCommand)
lappend cmd "config"
lappend cmd $repo
lappend cmd $dir
puts $cmd
# catch $cmd pipe
# puts $pipe
return
}
proc Init {} {
global activeProject cfgVariables
# puts $values
if [file isdirectory $activeProject] {
cd $activeProject
} else {
return false
}
set cmd exec
lappend cmd $cfgVariables(gitCommand)
lappend cmd "init"
lappend cmd $activeProject
puts $cmd
catch $cmd pipe
if [regexp -nocase -- {^fatal:} $pipe match] {
ShowMessage "Command: '$cmd' error" $pipe
return
}
}
proc Key {k fr} {
# puts [Editor::Key $k]
@@ -572,6 +620,7 @@ namespace eval Git {
}
proc CloneDialog {} {
global activeProject
set win .clone
set x [winfo rootx .frmWork]
set y [winfo rooty .frmWork]
@@ -608,10 +657,22 @@ namespace eval Git {
ReadFilesFromDirectory $repoDir $repoDir
destroy .clone
}
ttk::button $win.btnInit -compound left -image new_20x20 \
-text [::msgcat::mc "Init repository"] -command {
Git::Init
FileOper::ReadFolder $activeProject
ReadFilesFromDirectory $activeProject $activeProject
destroy .clone
}
if ![info exists activeProject] {
$win.btnInit configure -state disable
}
grid $win.entUrl -row 0 -column 0 -columnspan 2 -sticky new
grid $win.entFolder -row 1 -column 0 -sticky new
grid $win.btnFolder -row 1 -column 1 -sticky e
grid $win.btnFolder -row 1 -column 1 -sticky ew
grid $win.btnClone -row 2 -column 0 -columnspan 2 -sticky new
grid $win.btnInit -row 3 -column 0 -columnspan 2 -sticky new
bind $win <Escape> "destroy $win"
@@ -639,7 +700,7 @@ namespace eval Git {
}
return
}
if {[info exists activeProject] == 0} {
if {[info exists activeProject] == 0 || [file exists [file join $activeProject .git]] == 0} {
Git::CloneDialog
return
}

View File

@@ -26,7 +26,6 @@ bind . <Control-Q> Quit
bind . <Control-eacute> Quit
bind . <Insert> Add
bind . <Delete> Del
bind . <Control-Return> Edit
bind . <F1> ShowHelpDialog
bind . <Control-n> Editor::New
bind . <Control-N> Editor::New
@@ -168,10 +167,19 @@ grid rowconfigure $frmTree 0 -weight 1
set frmWork [ttk::frame .frmWork -border 0 -relief flat]
ttk::panedwindow $frmWork.panelNB -orient horizontal -style TPanedwindow
# grid $frmWork.panelNB -row 0 -column 0 -sticky nesw
pack $frmWork.panelNB -side left -fill both -expand true
set nbEditor [ttk::notebook $frmWork.nbEditor]
pack $nbEditor -side left -fill both -expand true
# grid $nbEditor -row 0 -column 0 -sticky nsew
# grid columnconfigure $frmWork $nbEditor -weight 1
# grid rowconfigure $frmWork $nbEditor -weight 1
# set nbEditor2 [ttk::notebook $frmWork.nbEditor2]
set nbEditor2 [ttk::notebook $frmWork.nbEditor2]
$frmWork.panelNB add $nbEditor -weight 10
# pack $nbEditor2 -side left -fill both -expand true
#
# Create an image CLOSE for tab

View File

@@ -13,9 +13,11 @@ namespace eval Highlight {} {
ctext::addHighlightClass $txt variable_funcs gold {set global variable unset}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt namespaces #4f64ff {::}
ctext::addHighlightClassForSpecialChars $txt qoute #b84a0c {"'`}
ctext::addHighlightClassForRegexp $txt colors #68ceff {(#)(\w)+?(\s|$)}
ctext::addHighlightClassForRegexp $txt comments #666666 {(^|;)\s*(#)[^\n\r]*}
ctext::addHighlightClass $txt bool #3e803b {null false true}
}
proc Default {txt} {
@@ -53,12 +55,13 @@ namespace eval Highlight {} {
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClass $txt bool #3e803b {nil false true}
ctext::addHighlightClassForSpecialChars $txt qoute #b84a0c {"'`}
}
proc PY {txt} {
ctext::addHighlightClassForRegexp $txt flags orange {-+[a-zA-Z\-_]+}
ctext::addHighlightClass $txt stackControl #19a2a6 {if else: elif for while case switch def import from return make break defer continue package len print with open try: except: in}
ctext::addHighlightClass $txt stackControl #19a2a6 {if else elif for while case switch def import from return make break defer continue package len print with open try: except: in}
ctext::addHighlightClass $txt types #7187d5 {string int int16 int32 int64 float bool byte}
ctext::addHighlightClassWithOnlyCharStart $txt vars #4471ca "\&"
ctext::addHighlightClassWithOnlyCharStart $txt vars #4471ca "\*"
@@ -68,6 +71,7 @@ namespace eval Highlight {} {
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForSpecialChars $txt qoute #b84a0c {"'`}
}
proc YAML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {\s*?[\w]+:}
@@ -77,44 +81,114 @@ namespace eval Highlight {} {
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
}
proc YML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {\s*?[\w]+:}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)(\{|)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt varsansible #4471ca {(\{\{)(\s*?|)[\.a-zA-Z0-9\_\-]+((\s*?|))(\}\})}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
Highlight::YAML $txt
}
proc XML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {(<|<\\)*?[\w]+>}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {(<|<\\)*?[\w]+(/|)(>)}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
# ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
# ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForSpecialChars $txt tags #666666 {<>/}
ctext::addHighlightClassForSpecialChars $txt tags lightgreen {<>/}
}
proc HTML {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt stackControl #19a2a6 {(<|</)([\w]+)}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {(\s)([\w]+)(=)}
ctext::addHighlightClassForSpecialChars $txt tags lightgreen {<>/}
ctext::addHighlightClassForRegexp $txt comments #666666 {(<\!--)\s*(.+)\s*(-->)}
}
proc HTM {txt} {
Highlight::HTML $txt
}
proc RB {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt flags orange {\s-[a-zA-Z]+}
ctext::addHighlightClass $txt stackControl #19a2a6 {def end class if else for while case when}
# ctext::addHighlightClass $txt widgets #9d468d [list canvas ctext button entry label text labelframe frame toplevel scrollbar checkbutton canvas listbox menu menubar menubutton radiobutton scale entry message tk_chooseDir tk_getSaveFile tk_getOpenFile tk_chooseColor tk_optionMenu ttk::button ttk::checkbutton ttk::combobox ttk::entry ttk::frame ttk::intro ttk::label ttk::labelframe ttk::menubutton ttk::treeview ttk::notebook ttk::panedwindow ttk::progressbar ttk::radiobutton ttk::scale ttk::scrollbar ttk::separator ttk::sizegrip ttk::spinbox ]
ctext::addHighlightClass $txt stackControl #19a2a6 {def end class if else for while case when require module begin rescue self return include unless raise private new do synchronize}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-\[\]]+}
# ctext::addHighlightClass $txt variable_funcs gold {set global variable unset}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt namespaces #4f64ff {::}
ctext::addHighlightClassForRegexp $txt dog #0082ff {(@)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClass $txt bool #7e5fb3 {nil false true}
}
proc MD {txt} {
ctext::addHighlightClassForRegexp $txt comments #666666 {^\s+?(#|//).*$}
ctext::addHighlightClassForRegexp $txt lists #4471ca {(\*|-|\+)+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt url #19a2a6 {(http|http|ftp|ssh)(://)(\w|\.|-)+?}
ctext::addHighlightClassForRegexp $txt url #19a2a6 {(http|https|ftp|ssh)(://)(\w|\.|-|/)+?}
ctext::addHighlightClassForRegexp $txt email #467a7b {(\w|\.|-)+?(@)(\w|\.|-)+?($|\s)}
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt sharp #975db4 {(#+?)\s(.*?)$}
ctext::addHighlightClassForRegexp $txt sharp #975db4 {^(#+?)\s(.*?)$}
ctext::addHighlightClassForRegexp $txt quotedtext #a9b36c {^(\s*?)(>+).+?$}
ctext::addHighlightClassForRegexp $txt italictext #dff74e {((_|\*)+?)(.+?)((_|\*)+?)}
ctext::addHighlightClassForRegexp $txt italictext #dff74e {((_|\*)+?)(\w+?)((_|\*)+?)}
}
proc PL {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt flags orange {\s-[a-zA-Z]+}
ctext::addHighlightClass $txt stackControl #19a2a6 {sub my end class new if else elsif for foreach while case when use ne eq print exit chdir rand die lt gt le ge say unless return chomp package push exec grep eval warn scalar next continue close module require}
ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-\[\]]+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
# ctext::addHighlightClassForSpecialChars $txt dog #0082ff {@}
ctext::addHighlightClassForRegexp $txt dog #0082ff {(@)[\.a-zA-Z0-9\_\-\[\]]+}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt namespaces #0093ff {->|\+\+|::}
}
proc INI {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt flags orange {\s-[a-zA-Z]+}
ctext::addHighlightClassForRegexp $txt stackControl #4471ca {^(\s*?)\[[\.a-zA-Z0-9\_\-\[\]\s\.:]+\]}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt dog #0082ff {(@)[\.a-zA-Z0-9\_\-\[\]]+}
ctext::addHighlightClassForRegexp $txt colors #68ceff {(#)[\w]+?}
ctext::addHighlightClassForRegexp $txt keyword #19a2a6 {^(\s*?).+(\s*?=)}
ctext::addHighlightClassForSpecialChars $txt equal #0082ff {=}
ctext::addHighlightClassForRegexp $txt comments #666666 {(^\s*#|^\s*;|\s+;)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt colors #68ceff {(#)(\w)+?(\s|$)}
}
proc DESKTOP {txt} {
Highlight::INI $txt
}
proc SPEC {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt flags orange {\s-[a-zA-Z0-9]+}
ctext::addHighlightClassForRegexp $txt macros #0082ff {(%)[\.a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt var #4471ca {(\$)[\.a-zA-Z0-9\_\-\[\]]+}
# ctext::addHighlightClassForRegexp $txt colors #68ceff {(#)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt keyword #68ceff {^(\s*?)[a-zA-Z0-9\_\-]+(\s*?:)}
ctext::addHighlightClassForSpecialChars $txt equal #0082ff {=}
ctext::addHighlightClassForRegexp $txt changelog lightgreen {^(\s*?)(\*|\-)(.+?)$}
ctext::addHighlightClass $txt shelcommand #19a2a6 {if fi else elseif then while case esac do in exit source echo package mkdir ls rm sed awk grep date jq zip tar gzip mount umount test make curl git iconv less gcc scp rsync cut tr function install}
ctext::addHighlightClassForRegexp $txt comments #666666 {(#|//)[^\n\r]*}
}
proc LUA {txt} {
ctext::addHighlightClassForRegexp $txt qoute #b84a0c {("|'|`).*?("|'|`)}
ctext::addHighlightClassForRegexp $txt flags orange {\s-[a-zA-Z]+}
ctext::addHighlightClass $txt stackControl #19a2a6 {and break do else elseif end false for function goto if in local nil not or repeat return then true until while}
# ctext::addHighlightClassForRegexp $txt vars #4471ca {(\$|\*|\&)[\.a-zA-Z0-9\_\-\[\]]+}
ctext::addHighlightClassForSpecialChars $txt brackets green {[]{}()}
ctext::addHighlightClassForRegexp $txt paths lightblue {\.[a-zA-Z0-9\_\-]+}
ctext::addHighlightClassForRegexp $txt comments #666666 {(--)[^\n\r]*}
ctext::addHighlightClassForRegexp $txt namespaces #0093ff {->|\+\+|::}
ctext::addHighlightClass $txt bool #3e803b {null false true}
}
}

View File

@@ -596,6 +596,22 @@ image create photo debian_16x12 -data {
rA8mrK6XByzl3QaSIFac9xqEuFa2XxzygDJS7dv2U3oGIh75yu7ibF0AAN5NOFR9hOAAAAAASUVO
RK5CYII=
}
image create photo deb_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9bxVJaHCz4gUOG6mRBVMRRq1CECqFWaNXB5NIvaNKQpLg4Cq4FBz8Wqw4uzro6uAqC
4AeIo5OToouU+L+k0CLGg+N+vLv3uHsH+BsVpppd44CqWUY6mRCyuVWh5xVBDCKCEPolZupzopiC
5/i6h4+vd3Ge5X3uzxFR8iYDfALxLNMNi3iDeHrT0jnvE0dZSVKIz4nHDLog8SPXZZffOBcd9vPM
qJFJzxNHiYViB8sdzEqGSjxFHFNUjfL9WZcVzluc1UqNte7JXxjOayvLXKc5jCQWsQQRAmTUUEYF
FuK0aqSYSNN+wsM/5PhFcsnkKoORYwFVqJAcP/gf/O7WLExOuEnhBND9YtsfI0DPLtCs2/b3sW03
T4DAM3Cltf3VBjDzSXq9rcWOgN5t4OK6rcl7wOUOMPCkS4bkSAGa/kIBeD+jb8oBfbdAaM3trbWP
0wcgQ12lboCDQ2C0SNnrHu8Odvb275lWfz803nKOXMrtNAAAAAZiS0dEALwAvAC8IuemuQAAAAlw
SFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB+YIGgYBD440/mcAAADnSURBVCjPlZIxbsIwGIU/O6Ei
CEGkzukJOkRi4A7sCIYuPQlcgx2J0FNwBNQVpogVRKuqCQhsFixZjkHwNj89f37/LwtuKCPV9vmE
Sj743rg54RpTuq2Qww+QA2/G17AV8DpkKW4CJnRqbc5HgII4+mRR+hrZkNAGmMsmMOM9EYS58dyx
KgBbX/QDxSo3sDFIX65iFsQRgGJ1Mt4Y5Ai0D1Bp8MI2AsoWf/VfmmVGqiVRY07x787vbRAQ7AB6
rA8mrK6XByzl3QaSIFac9xqEuFa2XxzygDJS7dv2U3oGIh75yu7ibF0AAN5NOFR9hOAAAAAASUVO
RK5CYII=
}
image create photo redhat_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9bxVJaHCz4gUOG6mRBVMRRq1CECqFWaNXB5NIvaNKQpLg4Cq4FBz8Wqw4uzro6uAqC
@@ -615,6 +631,26 @@ image create photo redhat_16x12 -data {
09XnzifcAaBGuUTHS9CB0kq/EeiqEzh36yeGZvgH5pLddZ5feAf2OYwxhVgpYDyx5dANP+pfyyXc
JoP7vsKvmscGvwDMplK1fiHiel7hCqIFNKp8a+dBC1kyMF5IOm1we9PY8Fgu0XnYsAsSizJ8Q9+B
fWB7/vyA9Yr/YLa1I25OKGgYfz6Rjbv9EqdKrq/6GWz7DaI/0EnQtYARAAAAAElFTkSuQmCC
}
image create photo rpm_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9bxVJaHCz4gUOG6mRBVMRRq1CECqFWaNXB5NIvaNKQpLg4Cq4FBz8Wqw4uzro6uAqC
4AeIo5OToouU+L+k0CLGg+N+vLv3uHsH+BsVpppd44CqWUY6mRCyuVWh5xVBDCKCEPolZupzopiC
5/i6h4+vd3Ge5X3uzxFR8iYDfALxLNMNi3iDeHrT0jnvE0dZSVKIz4nHDLog8SPXZZffOBcd9vPM
qJFJzxNHiYViB8sdzEqGSjxFHFNUjfL9WZcVzluc1UqNte7JXxjOayvLXKc5jCQWsQQRAmTUUEYF
FuK0aqSYSNN+wsM/5PhFcsnkKoORYwFVqJAcP/gf/O7WLExOuEnhBND9YtsfI0DPLtCs2/b3sW03
T4DAM3Cltf3VBjDzSXq9rcWOgN5t4OK6rcl7wOUOMPCkS4bkSAGa/kIBeD+jb8oBfbdAaM3trbWP
0wcgQ12lboCDQ2C0SNnrHu8Odvb275lWfz803nKOXMrtNAAAAAZiS0dEALwAvAC8IuemuQAAAAlw
SFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB+YIGgYbDKcQVQYAAAH8SURBVCjPhZJNSJMBGMd//3dr
01KpQGdqRUF1CsrNBq1IXwnxYFFRl255jKhDhzp2qGvXAqFLFBL0YUWg6aSCIB3aoUsUpYFsM0kL
rc33fZ8ObrSE6A8PPP/ni+dLrMKn9vaqdT+cHmRdJqcFgMCmJQ0uzEce7/jwrFAZr0qSS3ScMLgu
tLnC/Ksk64Epw843jqcflZ1OWcnH3Uuge0JNwmltsIVItFDc6Cm8EyMt4zKwVehBrs29+FcH+bh7
0kT/CtckZjeRtpsFk42Z9B0rxyXc10ASMEzHY5nhh5qJ96wNsfge0QzMI4a0FJyxKicWy4x8rBwx
m+jsFdZXotNLNcEuJ+QsHUNEzQlvj42PbJBZQLX6JO2dTaVqKwuYXxyooFuqF0NHHcy6gMgaFZcB
fN87ZzBv2K2gEM3m2tz95YxIJBQ1gt3IzgIeZl3KJtxRwSFgGseOxN6k3wLMJbvrPK/oOgTL9Zn0
09XnzifcAaBGuUTHS9CB0kq/EeiqEzh36yeGZvgH5pLddZ5feAf2OYwxhVgpYDyx5dANP+pfyyXc
JoP7vsKvmscGvwDMplK1fiHiel7hCqIFNKp8a+dBC1kyMF5IOm1we9PY8Fgu0XnYsAsSizJ8Q9+B
fWB7/vyA9Yr/YLa1I25OKGgYfz6Rjbv9EqdKrq/6GWz7DaI/0EnQtYARAAAAAElFTkSuQmCC
}
image create photo spec_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
@@ -1029,20 +1065,104 @@ image create photo yml_16x12 -data {
AElFTkSuQmCC
}
image create photo rb_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9Tix9UHOwg4pChOlkQFREnrUIRKoRaoVUHk0u/oElDkuLiKLgWHPxYrDq4OOvq4CoI
gh8gjk5Oii5S4v+SQosYD4778e7e4+4dINTLTLM6xgBNt81UIi5msqti5yu6ISCEGGZkZhlzkpSE
7/i6R4CvdzGe5X/uz9Gr5iwGBETiWWaYNvEG8dSmbXDeJ46woqwSnxOPmnRB4keuKx6/cS64LPDM
iJlOzRNHiMVCGyttzIqmRjxJHFU1nfKFjMcq5y3OWrnKmvfkLwzn9JVlrtMcQgKLWIIEEQqqKKEM
m/oqQSfFQor24z7+QdcvkUshVwmMHAuoQIPs+sH/4He3Vn5i3EsKx4HQi+N8DAOdu0Cj5jjfx47T
OAGCz8CV3vJX6sD0J+m1lhY9Avq2gYvrlqbsAZc7wMCTIZuyKwVpCvk88H5G35QF+m+BnjWvt+Y+
Th+ANHWVvAEODoGRAmWv+7y7q723f880+/sBmApyti9bk0oAAAAGYktHRAAAAAAAAPlDu38AAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCQIGGArNk/UwAAAAqUlEQVQoz51SMQoCMRCcxAW7
gLpgZan5/3NygpWFSAS1sDFeLNyDMya54FZhdmYYZgM0jmOKOZxSYL+E6TXdABytD5uSMGvgmGIv
7xYxAOhcROuDSok57MsgAo8xMTUspdEDWSscEvFTONfJDsbxHNMLChdErGS3cEynqsFPvI/4bH1Y
CzIvGoj4DsCkhTmmAGBW62A4o6kV1jF1u6krFMRBLrRt+RN/zRuAsFTFUDTjWwAAAABJRU5ErkJg
gg==
}
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAADfnpUWHRSYXcgcHJvZmlsZSB0eXBl
IGV4aWYAAHjatZZbduMgDIbftYpZgiVxEcvBXM6ZHczy5wfbmcZN0qTpmBOQsZCEPkFL7c/vTr/w
sEVHzkcLKYQFj0suSYZgy/bk2fPiZr+/LIdwNU9L2T8IphSjbq8Wdv1jnpcrS5wh+Q+GbDfE6/WH
5Hb7djK0O9IRkUCou6G0G1LZPvBuIG/bWkKy+HELa9vGemzRth+Nrh85idtwfncR2aseflSkKeuC
XlS2AHT8hDTjg6Bf1KDIqlOOsw97JEjIrTwtH6KiM5WLdKJyMDlDgTPeqOkpmeEy3pxnfzv5NFP8
wbOWXZLr+aVfXFwleea4V6Pe27a77AJSGvZNHVucEhRXpFznsoAW8fOQ42wJzQjVW4C8IgkrWuHE
AiydHVfO3LnNsXBBiE6aRIwiRXTOmUZJUnQhcHKjcZeoSasaGBbgVczKJRaeftN0V9jguDI0hWGM
N/zyM+2uod4HcOaRzLLlCnHJKEKEMciNHloAwv2oIz8TfLTzM7gqCPqZZsMG87JuJlbPe22NOtIJ
WqHoMW5njWPdDSBF8O0RDCsILIHVc+AlikRm5NHAJ8OQiTpZgYC9l4ooxakGwMGJgW+siTx1xcs2
jTsLILwGHCQDoAxW42JD/URnqKHs1TvvffDRm08+Bw0u+BBCDOPyy1Gjiz6GGKPFFLOpOfMWLJqR
JctJkuJy9CmkmCyllDOcZljOWJ2hkPMqq65u9WtY42prWnNB+RRXfAklFqOSSq5SteKeqKHGajXV
3LihlJprvoUWm7XUckepde2u+x567NZTzxdqTBvWT+15anxQk0lqKMYLNSyN8TDB4zrxgxmIiWMQ
j4MACloGs8XYOaGBbjBbkuBUeEGUfsCpPIiBoGssvvOF3T9yV9zIube4yUGOBrqfIEcD3R1yn7nd
oFbzvIeVJqFxDEdSF8Xxg0KzLJbHH7WnR3qo0IMbgqxWOhJawuahFW2hXCvTS25vWF+mbLhGduHk
7rb2HeUxSS+m4m5MdNfN45g+LaJbiftOTPTF1u9n97SIbsN8PTa6dvP9mOhedh9W342RHvp8IUB6
QPSlQOm9FN/B/1JpnpTovaP6b6QvKv+ZMjjjfy8mej+WTZneLsV9MT17TXx1t9ALqX440rPXxFcx
3cH/eoz0rRPy3wz13qkm/Gv7F3xOmRX/1sdOAAABhGlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw0Ac
xV9TpVUqDnYQcchQnSyILeKoVShChVArtOpgcv2EJg1Jiouj4Fpw8GOx6uDirKuDqyAIfoA4Ojkp
ukiJ/0sKLWI8OO7Hu3uPu3eA0Kwy1eyZBFTNMtLJhJjNrYqBV4QQRB/iiMnM1OckKQXP8XUPH1/v
ojzL+9yfYyBfMBngE4lnmW5YxBvE05uWznmfOMzKcp74nHjCoAsSP3JdcfmNc8lhgWeGjUx6njhM
LJa6WOliVjZU4jhxJK9qlC9kXc5z3uKsVuusfU/+wlBBW1nmOs1RJLGIJUgQoaCOCqqwEKVVI8VE
mvYTHv4Rxy+RSyFXBYwcC6hBhez4wf/gd7dmMTblJoUSQO+LbX+MAYFdoNWw7e9j226dAP5n4Err
+GtNYOaT9EZHixwBg9vAxXVHU/aAyx1g+EmXDdmR/DSFYhF4P6NvygFDt0D/mttbex+nD0CGukrd
AAeHwHiJstc93h3s7u3fM+3+fgC4vXLDfzo5HwAAD4tpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAA
ADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4
OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4w
LUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8y
Mi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHht
bG5zOmlwdGNFeHQ9Imh0dHA6Ly9pcHRjLm9yZy9zdGQvSXB0YzR4bXBFeHQvMjAwOC0wMi0yOS8i
CiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHht
bG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVu
dCMiCiAgICB4bWxuczpwbHVzPSJodHRwOi8vbnMudXNlcGx1cy5vcmcvbGRmL3htcC8xLjAvIgog
ICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6ZGM9Imh0
dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25z
LmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20v
eGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDo5ZWVlYzM5Yy1i
NjAxLTRmMzItYjYwZi01ZGVjYjBmZWFmODEiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6
YmJlM2M5NDktNTRjOC00YWY1LTk3OTEtNjRlYjE2NzYyZDExIgogICB4bXBNTTpPcmlnaW5hbERv
Y3VtZW50SUQ9InhtcC5kaWQ6YzI2MDlkMmMtZGMyYy00N2E3LWExNWQtZDYzNDVjOWEyM2NmIgog
ICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3Rh
bXA9IjE2NzA0OTQwMjYwNDk4MDEiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4yMiIKICAgZGM6Rm9y
bWF0PSJpbWFnZS9wbmciCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9v
bD0iR0lNUCAyLjEwIj4KICAgPGlwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICAgPHJkZjpCYWcv
PgogICA8L2lwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICA8aXB0Y0V4dDpMb2NhdGlvblNob3du
PgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6TG9jYXRpb25TaG93bj4KICAgPGlwdGNFeHQ6
QXJ0d29ya09yT2JqZWN0PgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6QXJ0d29ya09yT2Jq
ZWN0PgogICA8aXB0Y0V4dDpSZWdpc3RyeUlkPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6
UmVnaXN0cnlJZD4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxp
CiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAg
IHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTk0Y2Y3M2MtYzRlMC00ZmNjLWJlYTAtZmUzMmE3
YzVjYzhlIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAg
ICAgc3RFdnQ6d2hlbj0iKzAzOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9y
eT4KICAgPHBsdXM6SW1hZ2VTdXBwbGllcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVzOkltYWdl
U3VwcGxpZXI+CiAgIDxwbHVzOkltYWdlQ3JlYXRvcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVz
OkltYWdlQ3JlYXRvcj4KICAgPHBsdXM6Q29weXJpZ2h0T3duZXI+CiAgICA8cmRmOlNlcS8+CiAg
IDwvcGx1czpDb3B5cmlnaHRPd25lcj4KICAgPHBsdXM6TGljZW5zb3I+CiAgICA8cmRmOlNlcS8+
CiAgIDwvcGx1czpMaWNlbnNvcj4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94
OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAKPD94cGFja2V0IGVuZD0idyI/PqhP3r4AAAAGYktHRABLAEsAS0uhKB4AAAAJcEhZcwAA
DdcAAA3XAUIom3gAAAAHdElNRQfmDAgKBwanOCH1AAAAXElEQVQoz2NgIBLM9fb+j02cBZ/C5K1b
GXFphAEmSjSjGICuGV0hNjEMFyArJNY1TMiKsWkmBBgJhTay7di8wYLPRlz+RjEAm2Z0r+ALA0Z8
TiY5FvDZRErAkgQAHeFHE12H/GAAAAAASUVORK5CYII=
}
image create photo split_horizontal_11x11 -data {
iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TtVUqDhYUcchQnSyKijhqFYpQIdQKrTqYXPohNGlIUlwcBdeCgx+LVQcXZ10dXAVB
@@ -1279,3 +1399,517 @@ image create photo folder_24x24 -data {
LAKAPM8XA7qug+d5mAX4vh9qrdE0zUHXMgiCDz7d6QFxMQfU9aCtgH8EIIRo1xU8OgVYa43rCp7+
IuE4js+zT0Vd12dSymtK6UET3ff93fqP76VXznxN1iafwLQAAAAASUVORK5CYII=
}
image create photo new_20x20 -data {
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TtVoqDlYQcchQHcSCqIijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRaxHhz34929x907QKgWmWa1jQGabpvJeExMZ1bEwCuC6EMXRtAhM8uYlaQE
Wo6ve/j4ehflWa3P/Tm61azFAJ9IPMMM0yZeJ57atA3O+8RhVpBV4nPiUZMuSPzIdcXjN855lwWe
GTZTyTniMLGYb2KliVnB1IgniSOqplO+kPZY5bzFWSuWWf2e/IWhrL68xHWag4hjAYuQIEJBGRso
wkaUVp0UC0naj7XwD7h+iVwKuTbAyDGPEjTIrh/8D353a+Umxr2kUAxof3GcjyEgsAvUKo7zfew4
tRPA/wxc6Q1/qQpMf5JeaWiRI6BnG7i4bmjKHnC5A/Q/GbIpu5KfppDLAe9n9E0ZoPcWCK56vdX3
cfoApKirxA1wcAgM5yl7rcW7O5t7+/dMvb8fS2tyl3d3iOIAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmChUJLAVnNEmdAAABEElEQVQ4y+2TsUoEMRRFz5sd
MwvaiD+xja0g+gnTz/b2NhZ+hY2dfyBMm6+wslCbbSSVIGy9EyZ5NhsYxB3jKmLhhRQhh5v3cl/g
X78ia+3cWjvPYcscSFXPQwhT4B5YAGETW2QWKX3f7wFHwM4YmGuIqspnZl8yzJV8FECM8UJEhmcz
VS299y/GmKWIRFXVoiiu6rq+HQ1FVTWEMA0h7KYLjTGlqkqMsfTe7yfOOXcKPAJPKSjZUPkMOE5v
1rbtZYyxbJrmBlgCccDeAQ9APzY2C+A5baqqOuu67gB4BVpgNWD7ZDZmGIazJiIR0HVlq3eGW6Ws
6/UzP0VErp1zJ1uNzYgOgckwgO9qktvR39YbIoJqCGWh7C4AAAAASUVORK5CYII=
}
image create photo key_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQxcGCX4ijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jAKabpvpZELM5lbE8CsiCCGMMQzLzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14qlN2+C8TxxlJVklPiceMemCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiSOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzAx7iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD9SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AiVZysDNUkngAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAUHMwbmoJmMAAABRklEQVQoz32SPyyDURTFf+fr
V50kVEzWRjSYasPS1aoMJmnzBqZiE5FIjP6EtMNLulmwskksRmKqzhiJiAVJ22spqZbvbPfe807e
+90nWioUCtOSNiT1ASFQBda99w9ESADOuRmgGIbhYrlcfmz1psxsJx6Pz373/lKQy+ViwGaj0Zhr
N3rvrySt1uv17agbBMlkckxStVKpvHQOvfdXwGhkgKR+M7v/z2Bmb1EBYbPZXACyzrnJfzzDkQHA
qPc+BRhAPp9PxWKxV+/9M8Dh9ch4yaVvDXoktpYzteNfTzCzz47DR2Z2/mNAG8CQ4B2zgy4G7UUi
kfgEeiV9/DDABoBBIAN6igxorfE0CIJNgNJNelcoC7oETqyp+S4GkvTrZ0lnwEPpJr2LUUTsLWfu
VqIgPjvnLr45mBnAGkZRxv7SRG0lagtfFWR2IQ04e8UAAAAASUVORK5CYII=
}
image create photo crt_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQxcGCX4ijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jAKabpvpZELM5lbE8CsiCCGMMQzLzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14qlN2+C8TxxlJVklPiceMemCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiSOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzAx7iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD9SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AiVZysDNUkngAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAUHMwbmoJmMAAABRklEQVQoz32SPyyDURTFf+fr
V50kVEzWRjSYasPS1aoMJmnzBqZiE5FIjP6EtMNLulmwskksRmKqzhiJiAVJ22spqZbvbPfe807e
+90nWioUCtOSNiT1ASFQBda99w9ESADOuRmgGIbhYrlcfmz1psxsJx6Pz373/lKQy+ViwGaj0Zhr
N3rvrySt1uv17agbBMlkckxStVKpvHQOvfdXwGhkgKR+M7v/z2Bmb1EBYbPZXACyzrnJfzzDkQHA
qPc+BRhAPp9PxWKxV+/9M8Dh9ch4yaVvDXoktpYzteNfTzCzz47DR2Z2/mNAG8CQ4B2zgy4G7UUi
kfgEeiV9/DDABoBBIAN6igxorfE0CIJNgNJNelcoC7oETqyp+S4GkvTrZ0lnwEPpJr2LUUTsLWfu
VqIgPjvnLr45mBnAGkZRxv7SRG0lagtfFWR2IQ04e8UAAAAASUVORK5CYII=
}
image create photo pem_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQxcGCX4ijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jAKabpvpZELM5lbE8CsiCCGMMQzLzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14qlN2+C8TxxlJVklPiceMemCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiSOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzAx7iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD9SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AiVZysDNUkngAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAUHMwbmoJmMAAABRklEQVQoz32SPyyDURTFf+fr
V50kVEzWRjSYasPS1aoMJmnzBqZiE5FIjP6EtMNLulmwskksRmKqzhiJiAVJ22spqZbvbPfe807e
+90nWioUCtOSNiT1ASFQBda99w9ESADOuRmgGIbhYrlcfmz1psxsJx6Pz373/lKQy+ViwGaj0Zhr
N3rvrySt1uv17agbBMlkckxStVKpvHQOvfdXwGhkgKR+M7v/z2Bmb1EBYbPZXACyzrnJfzzDkQHA
qPc+BRhAPp9PxWKxV+/9M8Dh9ch4yaVvDXoktpYzteNfTzCzz47DR2Z2/mNAG8CQ4B2zgy4G7UUi
kfgEeiV9/DDABoBBIAN6igxorfE0CIJNgNJNelcoC7oETqyp+S4GkvTrZ0lnwEPpJr2LUUTsLWfu
VqIgPjvnLr45mBnAGkZRxv7SRG0lagtfFWR2IQ04e8UAAAAASUVORK5CYII=
}
image create photo csr_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQxcGCX4ijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jAKabpvpZELM5lbE8CsiCCGMMQzLzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14qlN2+C8TxxlJVklPiceMemCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiSOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzAx7iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD9SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AiVZysDNUkngAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAUHMwbmoJmMAAABRklEQVQoz32SPyyDURTFf+fr
V50kVEzWRjSYasPS1aoMJmnzBqZiE5FIjP6EtMNLulmwskksRmKqzhiJiAVJ22spqZbvbPfe807e
+90nWioUCtOSNiT1ASFQBda99w9ESADOuRmgGIbhYrlcfmz1psxsJx6Pz373/lKQy+ViwGaj0Zhr
N3rvrySt1uv17agbBMlkckxStVKpvHQOvfdXwGhkgKR+M7v/z2Bmb1EBYbPZXACyzrnJfzzDkQHA
qPc+BRhAPp9PxWKxV+/9M8Dh9ch4yaVvDXoktpYzteNfTzCzz47DR2Z2/mNAG8CQ4B2zgy4G7UUi
kfgEeiV9/DDABoBBIAN6igxorfE0CIJNgNJNelcoC7oETqyp+S4GkvTrZ0lnwEPpJr2LUUTsLWfu
VqIgPjvnLr45mBnAGkZRxv7SRG0lagtfFWR2IQ04e8UAAAAASUVORK5CYII=
}
image create photo sig_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQxcGCX4ijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jAKabpvpZELM5lbE8CsiCCGMMQzLzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14qlN2+C8TxxlJVklPiceMemCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiSOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzAx7iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD9SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AiVZysDNUkngAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAUHMwbmoJmMAAABRklEQVQoz32SPyyDURTFf+fr
V50kVEzWRjSYasPS1aoMJmnzBqZiE5FIjP6EtMNLulmwskksRmKqzhiJiAVJ22spqZbvbPfe807e
+90nWioUCtOSNiT1ASFQBda99w9ESADOuRmgGIbhYrlcfmz1psxsJx6Pz373/lKQy+ViwGaj0Zhr
N3rvrySt1uv17agbBMlkckxStVKpvHQOvfdXwGhkgKR+M7v/z2Bmb1EBYbPZXACyzrnJfzzDkQHA
qPc+BRhAPp9PxWKxV+/9M8Dh9ch4yaVvDXoktpYzteNfTzCzz47DR2Z2/mNAG8CQ4B2zgy4G7UUi
kfgEeiV9/DDABoBBIAN6igxorfE0CIJNgNJNelcoC7oETqyp+S4GkvTrZ0lnwEPpJr2LUUTsLWfu
VqIgPjvnLr45mBnAGkZRxv7SRG0lagtfFWR2IQ04e8UAAAAASUVORK5CYII=
}
image create photo gpg_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQxcGCX4ijVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jAKabpvpZELM5lbE8CsiCCGMMQzLzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14qlN2+C8TxxlJVklPiceMemCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiSOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzAx7iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD9SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AiVZysDNUkngAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAUHMwbmoJmMAAABRklEQVQoz32SPyyDURTFf+fr
V50kVEzWRjSYasPS1aoMJmnzBqZiE5FIjP6EtMNLulmwskksRmKqzhiJiAVJ22spqZbvbPfe807e
+90nWioUCtOSNiT1ASFQBda99w9ESADOuRmgGIbhYrlcfmz1psxsJx6Pz373/lKQy+ViwGaj0Zhr
N3rvrySt1uv17agbBMlkckxStVKpvHQOvfdXwGhkgKR+M7v/z2Bmb1EBYbPZXACyzrnJfzzDkQHA
qPc+BRhAPp9PxWKxV+/9M8Dh9ch4yaVvDXoktpYzteNfTzCzz47DR2Z2/mNAG8CQ4B2zgy4G7UUi
kfgEeiV9/DDABoBBIAN6igxorfE0CIJNgNJNelcoC7oETqyp+S4GkvTrZ0lnwEPpJr2LUUTsLWfu
VqIgPjvnLr45mBnAGkZRxv7SRG0lagtfFWR2IQ04e8UAAAAASUVORK5CYII=
}
image create photo git_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TS0UqDnYQcchQnSz4hYiTVqEIFUKt0KqDyaUfQpOGJMXFUXAtOPixWHVwcdbVwVUQ
BD9AHJ2cFF2kxP8lhRYxHhz34929x907QKiXmWZ1jACabpvpZELM5lbE8CsiCCOEaYzKzDJmJSkF
3/F1jwBf7+I8y//cn6NbzVsMCIjEM8wwbeJ14slN2+C8TxxlJVklPiceNumCxI9cVzx+41x0WeCZ
UTOTniOOEovFNlbamJVMjXiCOKZqOuULWY9VzluctXKVNe/JXxjJ68tLXKc5gCQWsAgJIhRUsYEy
bMRp1UmxkKb9hI+/3/VL5FLItQFGjnlUoEF2/eB/8LtbqzA+5iVFEkDoxXE+BoHwLtCoOc73seM0
ToDgM3Clt/yVOjD1SXqtpcWOgJ5t4OK6pSl7wOUO0PdkyKbsSkGaQqEAvJ/RN+WA3luga9XrrbmP
0wcgQ12lboCDQ2CoSNlrPu/ubO/t3zPN/n4AtjZywjCqfNkAAAAGYktHRAD/AP8A/6C9p5MAAAAJ
cEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmDAcGATEYpspOAAABMUlEQVQoz42SsUoDQRRFz+yM
G5CQ0sbC2iqNECwWUUTUQgj5AasUi4sfE8hPSEgjwcZCUkRIYWNnpZWlRI1keLvPZgXd7AZv+Zhz
Zu5jDCVJkqThvR+qqjjnOv1+/4OKBMVBt9td896fqeoBcJSm6SiO4/q/BEmSNIA7YBO4AB5VNVol
Mb/hxWJxA+zmo23n3KeIvAAYY8bW2tNiHVsBA1gRuTfGvAKHwJaqRq1W62o6nfo/Fbz3wwIMsGGt
vQTesyxrAg+qGonIYGkHqipU5zwIgjdglldxSwLnXMcYMy6Ac1X9AnaAZ2APmIRh2C5dYhzH9TRN
R6oaAWRZ1lTVubX2KT8yqdVqx71eb1YqKJHcAh44qYKXBPlHWgeugf1VN1cKfl4iIgNjjAvDsF0F
A3wD9EWTx4J8PxsAAAAASUVORK5CYII=
}
image create photo tcl_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAKZXpUWHRSYXcgcHJvZmlsZSB0eXBl
IGV4aWYAAHjarZlnliI5EIT/6xR7BHlzHNn39gZ7/P1SKmig7RiYpqAoZDIiIyNr1Pzv36X+4eFC
jsqHlGOJUfPwxRdbeZP1edT9arTfr+fRr6N5Pq/uX1hOOY7ufMzxuv523twHOIfKu/AwUL4GMu35
i+Kv8fPLQNdETlZkeTOugco1kLPnC3MNUM+2dCw5PW6hzXO8fn/CkGVrvJjbNsp1fPnsE9EbgXmc
tdMZp3m1zp4FOPmzylW+sLxql7nwvA8u79dbTAjIR3HSD6tS71C5vTOfnH8BxcVzXnHiOZjxfvzw
vAkfB1/tED/M7Pp95qfz/Y1BT0GWv7VGVmvNs7vqIyGN16bu0ZE3XNgIuds/izwTf4H3aT8Lz6xg
bwfywXyNZzfFWGBZxpthqllm7mM3nSV6O23iaG23bp/LLtliu9MKnLw8zbLJFTfAy7oOvI6z9r4W
s+cte7puMhMPw5XWMJg58Nu/8/x0oLUktsbofI8V67JCQpYhyMkrVwGIWTcehR3g2/P1Ibg6EAw7
zJkNVt3OEC2Yi1vCI7eBdlwYOJ5cM2lcAxAi5g4sxjgQ0NG4YKLRydpkDHHM4FMZKFvnbQMCE4Id
rNJ65yLgkDHMzW+S2dfaYM9pNAsggosuAU1xFaw8wgZ/ks9wqAYXfAghhhRyKKFGF30MMcYURfxq
csmnkGJKKaeSanbZZ9Qxp5xVLrkWWxziGEosqeRSSq1MWhm58uvKBbU221zzLbTYUsuttNqhT/c9
9NhTz6qXXocdbqATI4408iijTjOh0vQzzDjTzLPMuqDacsuvsOJKK6+y6h01ow6s754/R83cULMb
Kbkw3VHjpyndhjAiJ0EwAzHrDYgnQQBCW8FMZ+O9VQKdYKaLJSuCZZVBwBlGEANBP40Ny9yxe0Pu
CTfl/R/hZm/IKYHubyCnBLpPkHuP2weojbpVz6mNkKShBFU70o8LZq42VylqPzy2oXTqgiXYlbZm
m4EPkl6hLscavOSMnOnZ2LhYQ+F16BDbyD3LN2OOVJ1yrralC/syPhhWnQFiyUS29UnO7rcUuJDK
TJm9Te+KTmukxgwzE46ZU1CT712XkYuezL/C7CyqkuOptFLlm9bcAtrhHcIJVnuWGfocZxr0v6rb
m9872jWFRX1V1cdwoY3Weqyz5tCLSDNbymZks0IdZa3sWaBfq8wVk6wxjbaPCH7KRrar4OXeL6/s
t7HfEOaYkoA+kkqy9ZlgBkzLvRJfN2SI29iEZI+u1hmcs4PB4/K5ZeTNz2LHFBGA1MW37EyxPrJS
ktAN2yIcXbiDkW0NOVVV5rDMGYOFuLF24anJ8BlumBUHCThjtAdTqXkcfaAGQI9O1UurZ0odK6or
BmFGqW3o2TrfpyJLtqZndt9GYcWeSRYpGneEYiKco+bUY7JrD61Sb6TDmUds1u8eVYAWm7koTw0s
dPXAeseKW7vY3kLLZmHVbpmz1jSg18YMbBY7mtYp6AmD06qdcOjW9W1bO2MGr2yLfPEWxAhydyYS
QCFNH0hB0n32HJ2yYBGwbz67kfXylRQKqZWMruHafCpWPg1fanGtGogYNhyTid8+RWXfk/YZjiVn
BA8xoC+IPOChdq5vSJxA8hEgP8JDfQtIaukmDD3lST4hyLGQWra0kEikYV3TKuyLcECfpufLTj/h
nfqQeO5z4n22T/VrxEstnC1IMEt+y5egjFSh+1ZAfV8odVgqiPPSk4g4rjzXEceN35ZHrS+BRDBU
atNBOpFHJ18dgdT6SGQpSMNPBNKqHwoi9cmmLmOTArXBwtabtoxYvHDaKlYiW9dutpC3jiNqskLT
dz6FZbeQVQZL9Ic2Y8tCnL5MEAjR0+Q0+hkFXtS0ETimJrJKuo63dDWzcs6NybBzNcBE6gR3ZC25
Re3Vg18NYuRgHDX6YFvRsAco3iERY+7Dcj7fimM0iAVxVp8Gupo7WFpfcD3WsjgRmslKRzBou1q5
U9736KskuG5/vVxrPLlKUq4dcXgp110kiHItqaHnS7G2vaJ9k2UjJVJDzVAE1eNh8FgL++xyfp6R
ro0o4Xke+S1BahmoCBXfNgM2qtXmVyWdhxmQg2YLoqFzkAOxw8n5Fa3UHxHb7Oc6hdJchbK7UyiD
gloYu+Vj9muLIeYJu+Qraoy8Sjk0QgdS37yKXH4YWr0fG15W6t+Aohi9lgytnamN/t1r0WRslfUr
2TRi66Mn7FgeUVXXix7QHmdDA4k/DPoyNd7Vn2OnHkA8JUQwfGe5xlcYOsFQPYPoL7UJdD5HUKD4
myhd+Ll3We0KPDoyqueW0bJlNFQk9DDtKt/abRVlVlTUxEO0EiltwiccnnINs9evWRGJ2H+vbCvB
6aYdYv/MtoHrqMfWjiKbN4vqiULq5I5C9iaGCkWZJYp0KNmBoZJinPU8O66Loors3NL76xVZRJPw
qL8RH9eoa3KpvgCasbS7+P/iUel7AER1dggeA5DKNxGsoWwnqZroRYwkP1fXfJWI6qd9s+pPc/c7
m9MqfkhcF8VbwUHPX8I9RSv1tOEUSVF6Fk3iBtzUbhTyDqEkqwRxUq+tm1LCu9x32SUbkB4uGZRz
07ulLQoipNA4j1ZTutAjg4f9AED1M859U6agmvoy1IdrH1Mtv6mpnS8m4q0XMtQd+LI9CY0mHZTY
1G1YxtrT4lmDKF3TVEkRtnXZgTbNXnKukE3oGYxzUJzSmdI8FvCK6wnqPaRxhbyM8jixRutbaEGd
QbSt7Rm9hhB0+WgIUl7obboXw07Bs/yjSfZ+4c5oNQJteG/U/sMcrFz/5Yr2WNlU119VNnpcc20K
1Xqtbe2htqknXdQ3XfT6hkh8KXSaHqpe12vp43/san/IMfUVyb7jGPkJ/odjapMsXiSjwfZ+R7/m
qKMoPSZmz/qlRcS5qK+tS8R03a2LfnUu/iF86vcAf0eAqurSfWUqfsO3uujl9gmtj8GVRzs1vbcW
K0Ere1mJKv2s7NXH1BdFulDpfFGhFKK+Bbcgtfudm0vkOvWdPIsOg0yz1KotN5JzuzXct7WC+Dq4
oMRJVhYxoSM2ekWxptAR1Sy3gpKxEJll0Ei2iLXwvU46d/o+uf9V+mQNatJXNife1rZmTh8fBOrU
9+0Mevdp21FsLNBaYeTNgBF6kvsF2XQ9TEVq5eZJk/sOsn7cCIOQHix+bnU1dTp2AId9qCXWYjyO
H5eDkcKyJcjRafcVDSh7pqVn9Yx0xaWRRh5S4m1SNtKRol5JjzmvZikcujWMyqHBX4L/s4FWrFdd
goyOVh7kpF7YuddLqN1Rici+Z6M5MKr2PkhxbBY2x5eWwymCrRJNjBXekm0Ov+T2FTkVB/hTShCF
1AzQDWSF0qRoyoiwjyXEOElSjKkWR7/zidg8jyQoegP+RCbLf4HJvbku/ZiSmzot+x6nkf8lsIOA
0t439DTIfZ7Z85VdWe4mfu8h//C41D2sVBmncSk9pZuZSc9m5jjS47r1vFz3rZCrbYeiqPXVWZc0
SRga6fXmdsz3bkf90P4w/yjqfy5hPRN2uRFYAAABhGlDQ1BJQ0MgcHJvZmlsZQAAeJx9kT1Iw0Ac
xV9TpVUqDnYQcchQnSyILeKoVShChVArtOpgcv2EJg1Jiouj4Fpw8GOx6uDirKuDqyAIfoA4Ojkp
ukiJ/0sKLWI8OO7Hu3uPu3eA0Kwy1eyZBFTNMtLJhJjNrYqBV4QQRB/iiMnM1OckKQXP8XUPH1/v
ojzL+9yfYyBfMBngE4lnmW5YxBvE05uWznmfOMzKcp74nHjCoAsSP3JdcfmNc8lhgWeGjUx6njhM
LJa6WOliVjZU4jhxJK9qlC9kXc5z3uKsVuusfU/+wlBBW1nmOs1RJLGIJUgQoaCOCqqwEKVVI8VE
mvYTHv4Rxy+RSyFXBYwcC6hBhez4wf/gd7dmMTblJoUSQO+LbX+MAYFdoNWw7e9j226dAP5n4Err
+GtNYOaT9EZHixwBg9vAxXVHU/aAyx1g+EmXDdmR/DSFYhF4P6NvygFDt0D/mttbex+nD0CGukrd
AAeHwHiJstc93h3s7u3fM+3+fgC4vXLDfzo5HwAAD4tpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAA
ADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4
OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDQuNC4w
LUV4aXYyIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8y
Mi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHht
bG5zOmlwdGNFeHQ9Imh0dHA6Ly9pcHRjLm9yZy9zdGQvSXB0YzR4bXBFeHQvMjAwOC0wMi0yOS8i
CiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHht
bG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVu
dCMiCiAgICB4bWxuczpwbHVzPSJodHRwOi8vbnMudXNlcGx1cy5vcmcvbGRmL3htcC8xLjAvIgog
ICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6ZGM9Imh0
dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25z
LmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20v
eGFwLzEuMC8iCiAgIHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDpjOGIxNzg0YS1m
NmFhLTRjMmUtYWQ3ZC1hM2RkNmQ5NTUzMjgiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6
YzZmNGE5NGItNGVmNS00NTY3LWE4NjctN2Y4MjljNzMxYWMyIgogICB4bXBNTTpPcmlnaW5hbERv
Y3VtZW50SUQ9InhtcC5kaWQ6YzEyYzVlYzYtNTgyNC00NzYyLTlkZWUtYTVkM2I4YjA2YjlmIgog
ICBHSU1QOkFQST0iMi4wIgogICBHSU1QOlBsYXRmb3JtPSJMaW51eCIKICAgR0lNUDpUaW1lU3Rh
bXA9IjE2NzA0OTM1MzA0NDk3NTMiCiAgIEdJTVA6VmVyc2lvbj0iMi4xMC4yMiIKICAgZGM6Rm9y
bWF0PSJpbWFnZS9wbmciCiAgIHRpZmY6T3JpZW50YXRpb249IjEiCiAgIHhtcDpDcmVhdG9yVG9v
bD0iR0lNUCAyLjEwIj4KICAgPGlwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICAgPHJkZjpCYWcv
PgogICA8L2lwdGNFeHQ6TG9jYXRpb25DcmVhdGVkPgogICA8aXB0Y0V4dDpMb2NhdGlvblNob3du
PgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6TG9jYXRpb25TaG93bj4KICAgPGlwdGNFeHQ6
QXJ0d29ya09yT2JqZWN0PgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6QXJ0d29ya09yT2Jq
ZWN0PgogICA8aXB0Y0V4dDpSZWdpc3RyeUlkPgogICAgPHJkZjpCYWcvPgogICA8L2lwdGNFeHQ6
UmVnaXN0cnlJZD4KICAgPHhtcE1NOkhpc3Rvcnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxp
CiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAg
IHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZjhkYTk4MzMtNzMyMi00NTIzLTllODctODMyMjJk
YjM3NjAxIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAg
ICAgc3RFdnQ6d2hlbj0iKzAzOjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9y
eT4KICAgPHBsdXM6SW1hZ2VTdXBwbGllcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVzOkltYWdl
U3VwcGxpZXI+CiAgIDxwbHVzOkltYWdlQ3JlYXRvcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVz
OkltYWdlQ3JlYXRvcj4KICAgPHBsdXM6Q29weXJpZ2h0T3duZXI+CiAgICA8cmRmOlNlcS8+CiAg
IDwvcGx1czpDb3B5cmlnaHRPd25lcj4KICAgPHBsdXM6TGljZW5zb3I+CiAgICA8cmRmOlNlcS8+
CiAgIDwvcGx1czpMaWNlbnNvcj4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94
OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAKPD94cGFja2V0IGVuZD0idyI/PhM/IgkAAAAGYktHRABLAEsAS0uhKB4AAAAJcEhZcwAA
AFgAAABYAXjaS2IAAAAHdElNRQfmDAgJOjLuIiOnAAAA8ElEQVQoz43RIUtDcRTG4d/734WxYhGx
zDCQgVmLa0ZhKAgLgkVmMSgIdi1+CVH8BCJjiMGiTYvNNNErBhGsgwm797XpHPdePO3wngcO54iM
arVcGkzEu4iN7kltfjSLxodXN59mBor3hdZsV8bzMNos7/TKaSjtITWMp4D7QhD1o21wHfwIlDHX
uWBl63kamDP6ECyCh8HJeS5wGprIk8CnoQ7honM2+5YPglNQRVAFvlJxkHXBHyCrIdERLADv/epL
rxjID4l4NQqI9ZvDpWEWiH5XSi9DEq6wj7qntTv+U812fAxW0cyfP2BuQS4C363sTMdBnn7dAAAA
AElFTkSuQmCC
}
image create photo pl_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAsAAAAMCAYAAAC0qUeeAAAACXBIWXMAAAZ1AAAGdQGEn07tAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAVtJREFUKJFtkD1I1WEchZ/z669x
iW41ZGGhuATB7Q4tQUuTixARgk1tQUFXoaCPqcWEmhRtaGwMXBqcIug2ObhJKRQ19EVkw0WN6H99
39NQ3bzSGQ8Pz4EjgNnx+lFI1Ym5VysAM1drw0j3wYOG0WsPXjYBNN048Uj4PNATimM5cpvEKnAA
ALHc/+X4ybH5+RQoLwBVoGLnURLPOiCAqX/qW7kCEJHY7PTmHFBjR0KammvUh8JS6rTizE7wt5x9
W8r3onXQLxBLfyX/YUvgO3j3rmZzLY2cOvLEpAJogYaw3yPtAdYQk8DpgMfarphp1C4AU8AicAg5
pLiV7ZtlpX2pezb7ncRzy3ux7mJ9K0t9CLNUbPbs74Ldmz9ivVXossIXjV/feLj8Ndut6C02iq6L
ctFv8psc1fVIG4fDqvx5aUA/twY6sEGzidu27lyfXvwBnP0n4Wk7lZ9/ATwYhnr9pKV2AAAAAElF
TkSuQmCC
}
image create photo image_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAABAAAAAMCAYAAABr5z2BAAAFSHpUWHRSYXcgcHJvZmlsZSB0eXBl
IGV4aWYAAHjarVdZku06CvzXKnoJBoSQlqMxonfQy+/UYN86p6Yb8Z5dx0KDAWUCcrn+v/8O9x9c
lDQ4rxZDCuHC5ZNPnCHEa195Peny63k61y28jLurngnGkKCV3Y3hrL/H6XrRRBmSflAUjyIqrxPJ
H/3xTdExJNMjhtCOonQUCe8JOgry3tYVUrSPWyh9t+3eYtw/Nx/jxsR28973BvSawo4wdyG58GTh
7YDMHzvJmGA8L4lYSCKQBb0sXm5PAMhXOF0fvHLvrDzSGys3J++kSNgrHAZewQxP++U46dfguwXx
B8tSj8Sv44EfEy8gL4xHi26MvneXfQCk4Wzq3uKSsLAAclmvBdyGn0K2dSfc0SF6KyhvAKHgrpSI
QcsgT40yDeqrrVThoufOhpa5sqyxKMaJq1wOPPl502CTJE0iOKygVzDKjy+07KZlrlKE4UZYyQRl
tOnnf+f+VtEYk3CiCWbdWMEvnkEINyZz84lVIITGHUe6AL7v92vyKmBQF8wRG8xX2SqK0omtGUey
iBYsVLQ718jaUQCIYFvhDAkYuAKJUqDLmI0IOEbwk6EosnguoIBUucFL9iIB5CBjYBvvGK21rLyH
UbNAhEoQAzVJMrjyKGyIH/MRMZRV1KtqUNOoSXOQ4IOGECzM4pdNzJtaMLNoyXKU6KPGEC1GF1PM
iZOgOGoKyVJMKeUMoxmaM97OWJBz4SLFFy2hWIkllVwRPtVXraFaja6mmhs3aagTLTRrsaWWO3WE
Uvdde+jWY089D4TakOGHjjBsxJFGflgjt2n9dP89a3SzxoupudAe1vCq2a2CZjnRyRkYY09g3CYD
CGienF2RvGc3qZucXYmRFcrwUic5jSZjYNB3Yh30cPeHuRfenPf/iDe+mXOTun+DOTep+4a5z7x9
wVrLqw6LWwzNNJygXoL0w4IeM8c8D7W/bt2PC0bwU+AS6wCgNWwLvUoP9XWx+0FL5tuznvJvPrm3
AVheIo5AJY+/i3poU1CjNDy4aW1OaItWWzyLLnW38HVLw9d2K6xb4TzWP7fuqwnEyK2ojltPlUfa
zoK8WebD3rUb+BronvOZ4xx6CNv5kSq1+MlKw7FwxCKPQbftaGec73VTVGqSKyw7OJVwXuQ93lDq
8sGLwSOS6IwjuRxmb2pkS0OvWgcf4ofvEmvYDteqyLetqvuKxP4O7K/BNS5LCpcggGxbQCW/wUrU
Mj5rlhuZEhJj75ISh61Ze6RardHZUGOKaciBY2TkFgrMUuxK7VxrPPtglVJ/S4iRQ3hCP5y4cxJp
K6mGo6GHA2zxCaf6ATzO1Ey7h2HRkynYqFxVjkcNOU6IgL3F0YLvF8vNH/azxa6xxbyJt4piGF9j
1/1lMBsdHSkrUOKTJt6nktaEs7Sqjdnuo4iljnq5ZLaIqrZhbx0f9hb1TjSfmh1CMspgd3bCIiEE
VQ9y1y+tdFTQI7ZdGVxeGbLBQztQdVcHNkM5Jj1qodH8JDohgc+vQHsSB8cVECBudjK2l3q7U+jk
2oRL8i1q+Dko3HsVLHoIQ8ktt98zYqSdMJmfct3oXuYt6C4j+JociOw+UK83XsVb12rX2N2IgKnH
ci9I0F6O7YZ/eYasmHQLOrtR5nsr31a6XtPHehl2FlpwwCF8rCv0xJAePmunnEq7nfUUy000TsEN
XU+O8IbuCR/jyP3M9Mfpv/PZ/e70m889PAXysj/V031bzXctzX92+rxfeznihwh2v4YwPyFMPx3A
7qfC8wRmP5n4nTuH/k9u4NMguf8DDNefEsqt9ZUAAAGEaUNDUElDQyBwcm9maWxlAAB4nH2RPUjD
QBzFX1OlVSoOdhBxyFCdLIgt4qhVKEKFUCu06mBy/YQmDUmKi6PgWnDwY7Hq4OKsq4OrIAh+gDg6
OSm6SIn/SwotYjw47se7e4+7d4DQrDLV7JkEVM0y0smEmM2tioFXhBBEH+KIyczU5yQpBc/xdQ8f
X++iPMv73J9jIF8wGeATiWeZbljEG8TTm5bOeZ84zMpynviceMKgCxI/cl1x+Y1zyWGBZ4aNTHqe
OEwslrpY6WJWNlTiOHEkr2qUL2RdznPe4qxW66x9T/7CUEFbWeY6zVEksYglSBChoI4KqrAQpVUj
xUSa9hMe/hHHL5FLIVcFjBwLqEGF7PjB/+B3t2YxNuUmhRJA74ttf4wBgV2g1bDt72Pbbp0A/mfg
Suv4a01g5pP0RkeLHAGD28DFdUdT9oDLHWD4SZcN2ZH8NIViEXg/o2/KAUO3QP+a21t7H6cPQIa6
St0AB4fAeImy1z3eHezu7d8z7f5+ALi9csN/OjkfAAAPi2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAA
AAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4K
PHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40
LjAtRXhpdjIiPgogPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAy
LzIyLXJkZi1zeW50YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAg
eG1sbnM6aXB0Y0V4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5
LyIKICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAg
eG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2
ZW50IyIKICAgIHhtbG5zOnBsdXM9Imh0dHA6Ly9ucy51c2VwbHVzLm9yZy9sZGYveG1wLzEuMC8i
CiAgICB4bWxuczpHSU1QPSJodHRwOi8vd3d3LmdpbXAub3JnL3htcC8iCiAgICB4bWxuczpkYz0i
aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8v
bnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNv
bS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjM0OGY0ZTU3
LTc1ODUtNDVkYS1iY2UxLWZkMjM5MTEzZGU2NyIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlp
ZDpjNWY2MTVjMi0wOTgyLTQ2MTktODhmNC0zZGY4ZmRhYWU4NDMiCiAgIHhtcE1NOk9yaWdpbmFs
RG9jdW1lbnRJRD0ieG1wLmRpZDoxMTQ5N2E0MC00NGI0LTRiMTAtOTQyZi02ZjY5ODMwYTc5MDEi
CiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09IkxpbnV4IgogICBHSU1QOlRpbWVT
dGFtcD0iMTY3MDQ5NTQ0NjA2ODk0NiIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjIyIgogICBkYzpG
b3JtYXQ9ImltYWdlL3BuZyIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JU
b29sPSJHSU1QIDIuMTAiPgogICA8aXB0Y0V4dDpMb2NhdGlvbkNyZWF0ZWQ+CiAgICA8cmRmOkJh
Zy8+CiAgIDwvaXB0Y0V4dDpMb2NhdGlvbkNyZWF0ZWQ+CiAgIDxpcHRjRXh0OkxvY2F0aW9uU2hv
d24+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4dDpMb2NhdGlvblNob3duPgogICA8aXB0Y0V4
dDpBcnR3b3JrT3JPYmplY3Q+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4dDpBcnR3b3JrT3JP
YmplY3Q+CiAgIDxpcHRjRXh0OlJlZ2lzdHJ5SWQ+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4
dDpSZWdpc3RyeUlkPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6
bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAg
ICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjNWNiMzNjNy0xMTVlLTRhNGYtOTAwNi0xZjAx
YWY4ZmIzODQiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgog
ICAgICBzdEV2dDp3aGVuPSIrMDM6MDAiLz4KICAgIDwvcmRmOlNlcT4KICAgPC94bXBNTTpIaXN0
b3J5PgogICA8cGx1czpJbWFnZVN1cHBsaWVyPgogICAgPHJkZjpTZXEvPgogICA8L3BsdXM6SW1h
Z2VTdXBwbGllcj4KICAgPHBsdXM6SW1hZ2VDcmVhdG9yPgogICAgPHJkZjpTZXEvPgogICA8L3Bs
dXM6SW1hZ2VDcmVhdG9yPgogICA8cGx1czpDb3B5cmlnaHRPd25lcj4KICAgIDxyZGY6U2VxLz4K
ICAgPC9wbHVzOkNvcHlyaWdodE93bmVyPgogICA8cGx1czpMaWNlbnNvcj4KICAgIDxyZGY6U2Vx
Lz4KICAgPC9wbHVzOkxpY2Vuc29yPgogIDwvcmRmOkRlc2NyaXB0aW9uPgogPC9yZGY6UkRGPgo8
L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+1HpXCQAAAAZiS0dEAEsASwBLS6EoHgAAAAlwSFlz
AAAN1wAADdcBQiibeAAAAAd0SU1FB+YMCAoeLgmNIBcAAAGJSURBVCjPjZI/SCNxEIW/3UhkIX8Q
I2qsRA0bQUFEUqkgqIhkIVdpZeDKa9JYCyIopgiIhSJaKGhnl0IRooWikSCIKKSRA0FCzN4u5FY2
XvhdFe8kifjK4c3HzJuBL2p7elrUqjcAxONxEQgEajYahoHL5cLY2aEuwOPxoGlaTUMikSCTyXCZ
z+N0zotSaRXYBeakd0BFNzfr2LafXO4Qn28K237i+PiUaDSKLA9wfT0CpN+bqwCKMkQsFsO8u6VB
StI3XCKfl/B6N9jcbEeIWyAkVa3wb980pvnI2a9XvMLi4jcst3cSiZxj2204HPuUyzUyqMjp9CHL
Chm/n66JCfRmg3DPIPf3iwSDM6RSB1jWp4AWHA4FxS5yUiyS/mnycHXE0tICuq6TSlWHLP9/X9O8
Qohnupub0FYW0X70YxhpQqFQ3f/4MIEQo4yN7bHb+o2XrVkaGzt4e5M+fbAPAF3XAY1c7g8wjmVB
ONyL2+2uD/ieTEprk5Mim82iqiqqqlaZCoVCXcBfmFeL22lAPa8AAAAASUVORK5CYII=
}
image create photo lua_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAjbAAAI2wHNrPlDAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARdJREFUKJGNkC1IQ3EUxX/nbfoY
ikkxaxQMRi2CzcG2uGFasy3owkCQV7SsuCI2i7iP+KaLVouCcSCI0aAgTFAn2zX8/dqeiCeee3+c
c6/4j6rNXWQFREUDgyDwmFuYpR8bYcK7IZl8BaAWdoBxoOOARiOG+ZuYNoDpD/wJOCRhW7yohFEA
KsJM1JtVIPsjy4BTYBLwSdgymUwHwKN+kh9aBtk+uXSKbGoJ1OVZO58jD1iPHNnn3oEysAcgT6vl
A8TB5iOAVKQWCjQFtgqIx94M0I6D3lzlAY0B2wO+qesqyc4jCVHdcX1x64AeZX6JGOpYJgj6DlhL
nyEr/QEd077c+0K/7XAFjyKwCIyCrjA7IJc6ct9yegcG+1TkMUCBoAAAAABJRU5ErkJggg==
}
image create photo gz_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAABLcGxfAAAACXBIWXMAAAcPAAAHDwFcQ5C1AAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASpJREFUKJGFjb9Kw0AAxr+73F0S
wU6tUMWAOigIBcVNJ7ciTgo+gIuzq66CvoEPoXQWBHERih0EUbu0UGiCrdVaY5qaJncuRjEZ+o2/
7x/ZO912lFJ5/IiADgURxcjU7pBQTlKPDQI/zzUBRlnMed/1LptlB3Mrs+A6BwCEMsSzDDts6EXY
3zqAYOJ3qVy5gSOaKK5vwtBNAEAQBjg5P8ySo9KOopT8u65WHOgmh7WQhab9eVIq0GQYAGYWc+i9
9kESFqUENBnutj1cnT3C/wxwe1FLjaUKrUYPuakMCqsW7Pp7qsCSQCmF+n0bTq0LGcnRDwBQWLOw
sbsErmujC8Jg8Nwv+G4ALtJ7zK69HQudTcZgLGNojWpn+br0ND49P/Hw0vxoxV4wCO1vTFFpmeaA
16IAAAAASUVORK5CYII=
}
image create photo tgz_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAABLcGxfAAAACXBIWXMAAAcPAAAHDwFcQ5C1AAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAASpJREFUKJGFjb9Kw0AAxr+73F0S
wU6tUMWAOigIBcVNJ7ciTgo+gIuzq66CvoEPoXQWBHERih0EUbu0UGiCrdVaY5qaJncuRjEZ+o2/
7x/ZO912lFJ5/IiADgURxcjU7pBQTlKPDQI/zzUBRlnMed/1LptlB3Mrs+A6BwCEMsSzDDts6EXY
3zqAYOJ3qVy5gSOaKK5vwtBNAEAQBjg5P8ySo9KOopT8u65WHOgmh7WQhab9eVIq0GQYAGYWc+i9
9kESFqUENBnutj1cnT3C/wxwe1FLjaUKrUYPuakMCqsW7Pp7qsCSQCmF+n0bTq0LGcnRDwBQWLOw
sbsErmujC8Jg8Nwv+G4ALtJ7zK69HQudTcZgLGNojWpn+br0ND49P/Hw0vxoxV4wCO1vTFFpmeaA
16IAAAAASUVORK5CYII=
}
image create photo zip_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAMCAYAAAC5tzfZAAAACXBIWXMAAAeJAAAHiQH5c1i9AAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAUVJREFUKJGNkTtLA0EUhc9MZrNL
IokBFZUY340IgqSw10K0srGy08LaRvAf2NpYpUmrhZ2N/oCAYCUILhJjDJE8NjGJyc7M7thodJMV
PeX5+Obey5DZ0+2cIu4EfoSCpMz9sz38EjJysql6Sw1UhCzbZs+WZicn2x4B5IWptkRq7RBzsXgX
lCuv2vlFWtvYOUAiMaN/9aaVx+7V8SBJprfU1PAoCEhXctoc9dscWMRAZPH7MQWFbKkIFo7qKHHL
s54SEpzYoBTo8KqHhaM6qN+hMt+AMCsQZhWqI/t4vyRdvF8/IrQ+DxrRYd8U/pZc7kC1BMR9GTL3
Brcl/jHpM06TQ0nHl/lKgZiB0Oo0jJW4HwYFlOdzic6gOhJOsQnxVAcdCPYoSrHaXemIhYPjnnph
KN64fFgiBqsHlscyzWyte5hs8cIHuFR/UISQs+8AAAAASUVORK5CYII=
}
image create photo xz_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAABLcGxfAAAACXBIWXMAAAcPAAAHDwFcQ5C1AAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAShJREFUKJGFkDtLA0EUhb+Z3Vl3
jFpZGCsJiI0gRqtAOonYSvJPBP+Aoo29IBZ2giA2WimIVkqQgAgptFBxUfEVk2g2+7IxgWSLnPLc
8+KK1GbeiaIoyT8E0jOFtSC1UaILI6Gsm7Xmb9I2LCxptnhlVevH8sKB2RT0KQC80Och9N9M5Up2
C6vYptVOKl6e8awfmZtfxLY1AA2/SWFveVhk73YiqVRHtXt0jhjoR2WmEGa7mdDzkN1iACubJnBe
EUJ08FIpZLc4uHeorW8Tfn7zs7UfC4sZ/OtbzIkxdD6HVyrHDGaMIcI9LeJdlcEPejcA6EKOoY0l
hLZ7G0RCE75/EX5UEDr+EDFzuLJmJPRoe5DbNIKDk3RYqQ4amekbY3L8pXXz6o2nPwWnYSj7tbJx
AAAAAElFTkSuQmCC
}
image create photo iso_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAwAAAALCAYAAABLcGxfAAAACXBIWXMAAAWIAAAFiAG/L38eAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAVJJREFUKJGFjz1IQgEUhc99vvd8
JgolDf2OQkhb0RD249LaKESDOEUQtQRtNbQVTkE05JJLDUGQRJPQUCQVrSJIv5IZmFK8/9v0XmJC
d7qccz7uPcTMQfw/DSJiABCJqN7sGJnYhMXWhizSGECkmvbd55exCeAUAKg5rGcm5yVRSAPwtFzg
p6q6Orh4ueUCfBjrY5uLRFDa/cSAmS/VRkRHUA07oYikAIAmhd7qkaUj2etXfffbcVkt9xMg9gSU
BRdgm4edD797Z666w9E1AJZlxDtxm0oCgF8Rh1zAZjacXbIaPgABAIZHq/kd3bRYdwHTxAW8mAOA
jtfzqH6NfUmSdZSy007RSkPL/5ZOTym6zAVZFAbalTYs+33loDAqOAIlcupjRZvVTbv8J2zyx3G+
mtzJlh+o1Txbj3SFQ8HlgCKMg0io1o2bvdzLburkuQgAP0z8hJue1kBeAAAAAElFTkSuQmCC
}
image create photo pdf_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAKYAAACmAE200ffAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAMpJREFUGJWNz69OgnEYxfHv+RVF
xsBAdHODzcbLrARfLgADjWggMgKXYHDzArgAA4F7IKAm/wTsNgMj6eZGYHAIBoWX4fvEs8/OngNb
53o0dFzpbucAIZGYImiaDqM5+CQl5glYpMQu4dD8FzuunoIOCZ74IuokHtzA9WofewBfL1B4BD9j
ZkhHsHrVb+t5GZb3wB1GBL0D33h1BeETnNdPY+US6xa7rfHbQ2JF7SxH9iAjx1EP3MAaaTy53jXs
z0C1QB/o+GYfBFgDj+E74z7GkTEAAAAASUVORK5CYII=
}
image create photo bz2_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAACXBIWXMAAAdDAAAHQwF4FVqrAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAARhJREFUGJV9jrFKw1AYRk9ublI0
oYPSYnEREXEQ6eIiFhFB3MVBcPEpiqN06OAiLrq6+Aa+gIuDUEShhYK6iZbWlDQVE5t7HcSEFuo3
nv/wfb8xf3H6qjUF0ihLikNhi2tGIoMoKmRMk4ww/5iwgt6lbN7D3BJ6eua3AY00w5Cr3X0c204a
GvUaTXPA2voOuXw6apSe7rSwrKG56PYG9dHB3thCuNmEi1ERwCquQviFEQ2GuBgVVadNcFxGeR79
syrE8Xh50Gwgcnkm9g5Qvo9qvY+XDa35fqjRq5RRrTc0arwMYG9ukz05Ry4s/v8zrovuemjfR/c/
MRw3OUn/sV61nMnZVJ4i1qz0Kkc5sVx8CdvdZ9pdAH4AuSFg6ttQQTAAAAAASUVORK5CYII=
}
image create photo csv_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAMCAYAAABbayygAAAACXBIWXMAAAvPAAALzwFI68pfAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAPJJREFUGJWFkaFLA3EcxT/ve8cs
M6uIiOl2GBZsVqOyf8B+ghyr2z+xoqdgMNoMqzaTaSaR28BiEFYHC+rm72sTxRt76YUPj/d4KnO/
BXYA578UAoe7lxrHOBvphfYqIMq27xv0R5kfGapMAiA90wPQDTX6tgj6gQvdA+j51OsWkwCEOaPf
vhaxFma8z42JRUaTwDWBzGISvrghkCG2Z9DzmHZkNA1AcJcWOpGYLqrwp+PKhFcijoF1oC5ny6EB
fJjE1OGgzH3wuUpC4ArYFIwR5w5PjUIDhrm3li0f5t4ydzrLQHc6MeKtzP2R6gsB5OLlG1VzU07m
mn0VAAAAAElFTkSuQmCC
}
image create photo exe_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAA8AAAAMCAYAAAC9QufkAAAACXBIWXMAAAMnAAADJwEZpzWLAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAaxJREFUKJFtkEFIlHEQxX/z3083
IoONdQ3qYrcFdQ0hhTrU2k3XCjS6dZBiO3SRorotJJQSXQtMOiUKxrYmQgZiHjRJ3FoxPVgUgkSt
UatY0H7/6dB+CO33TjPDezNvnlCCguTbTqUQOSMQVSiIMm7V3opMTH/BB+IV+fb4MWC+nKIXu/v3
78PleaY+sw6Q0pTJLeeadsWJ+F2UG/+t/nMnuef0h9rKV//MsYlSQIgAC87uAc6W25LJj0eCCVQ9
l2GEMICqDhuA720n64AwMInyElgDcB15qlYv+LxbNEWTdgBuH78W+hyqGXWN0wxUIsx2vxm6+aJr
5QfCYR/xVDqW/hoAqDl/PaNi2oGDQDUQyx6qj9z/OT62EA7MblcELLADLAetPokWzL2ZwdW8kxh4
V4u1jWUZw7OgymBf9lcUfi+CbijsFbjqFu3jXsARazt9bGlSRpaAWKlt8RID5kJXpj8BGIFzCt+A
98BmSfz6BPOtPktRlRGvdtTY5Nilppw36Hjw9qgRewAY8NHaCldHvUZ8CABsPYp3qUqPoA2qFBGy
ogxXXZ566HH+Asc0nIyxyMyyAAAAAElFTkSuQmCC
}
image create photo txt_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAAkAAAAMCAYAAACwXJejAAAACXBIWXMAAALEAAACxAFbkZ0LAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXVJREFUGJVjZICCT2f+i9x98XjO
43fPXorziUrKyihFSJkwfmNgYGBgPLz62uYXH998EOMX1unbMmvRxoUT+ytrJic7atkUfPz2+QIH
Kxsf04sPr16HptjF3nt+/0CYhZ/s0ul7+3SktbQvPri6LzTFLvbHrx9vWRgYGBhubn4s/Z75R70I
M7fq339/mBgYGBgYFFQZbLfd5nv89CkDCwMDA8PG68cUnr158E5OSN7mz78/nDB3Pvvw9Iu1qjlE
kZ2a0ftHomLvlQRkH375/5MVpujxa7kPDAz/IIoOXj7+//7bpxy3RO4x/vz5mx2m6P371xz2+rYQ
RU7q5rxX3z/5pSkiK/b9/0+4ogdvXzExMDBAFK0+s+vJlfvX/8lIyVz4/fcXN0zRy5evvia6hUEU
eZk4aGtJyD9TlVX1/P3vDxvcpKf3X8JNKp/fcZKFlf3//z8/5v9nYYI7nImB7WWBbxwD45aFJ05/
//3rBgMO8P3ndy0A+c+fqfnp2TAAAAAASUVORK5CYII=
}
image create photo j2_16x12 -data {
iVBORw0KGgoAAAANSUhEUgAAAA0AAAAMCAYAAAC5tzfZAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAA
GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAjxJREFUKJGNzT9oE1EcwPHfu3u5
yzWXyyUx1/xpKtZWaytJkVbQoUMpiqP/gtJSJ8FNxEEoWpUKgghKUSGTYNHBwalrDDgIIk1oG/oH
o1IoTZu2SS7/XnLv7p6To+B3/sAXMcbgfzp663ZfOTZ42VEuxVBw+sEUVf2AzXblLzCB91iK22+L
gs924JAlumKG3xe3eezwrK6ksO12D1UHBm5SRZH/deGMNgjlyq6yuvxwd+Z+EjHGQHv+IkG08Jjp
ks5L29sLrVBo1EZIVrOL082e3qeBdGrWUN2/Owwjt5FM7nMAAFytRsCiiPFYtpziECJEwc1mB/X7
plua1rk7fu5O+ezoI75edwEAYAAAqVhYcdBWtR7uHtZSn++KP9d/EEKa+XyeeufefAknX4/lcjkD
rl8FAAB8ZGJiqDpy5plnaWkWgl2MRKMnq7HBK4zj+jstu1E7FPC2To3c8L98ddG7+O1Jfn7+K3br
+mbF6ezX4/F7hqZ1NUzzmilJBdxulyxBjFNFjZZGTk8xhELRra0MAAC3vLBQxhU9e/zjhylcq9vq
+tocE8SiJYlryLLe8qRRYoj/hBv11XQ63QIA4PomJxVbwOqv8QuXqCzL9UhkGDAf5A1TxqTRjQxK
waYDtkPwRhMJCQAAcy6XQBVVAwTH2sGQ25vNaAwYtjCvkcjhE5Ysd1Cwe/gmifh0nQMAwBvJ5H54
5nEG7+28M9SARyoW37c7A72MxzFpr/Dd1sUKRxpZbJg7joMDAwDgDzlS9ta5m7mUAAAAAElFTkSu
QmCC
}

View File

@@ -15,9 +15,12 @@ dict set lexers TCL commands [info commands]
#--------------------------------------------------
# Go lang
dict set lexers GO commentSymbol {//}
dict set lexers GO commentMultilineSymbolBegin {/*}
dict set lexers GO commentMultilineSymbolEnd {*/}
dict set lexers GO procFindString {func.*?PROCNAME}
dict set lexers GO procRegexpCommand {regexp -nocase -all -- {\s*?func\s*?(\(\w+\s*?\**?\w+\)|)\s*?(\w+)\((.*?)\)\s+?([a-zA-Z0-9\{\}\[\]\(\)-_.]*?|)\s*?\{} $line match linkName procName params returns}
dict set lexers GO varRegexpCommand {regexp -nocase -all -line -- {^\s*?var\s+([a-zA-Z0-9\-_$]+)\s+(.+?)(\s*$)} $line match varName varType lineEnd}
#--------------------------------------------------
# SHELL (Bash)
dict set lexers SH commentSymbol {#}
@@ -30,13 +33,17 @@ dict set lexers SH procRegexpCommand {regexp -nocase -all -- {^\s*?(function |)\
dict set lexers PY commentSymbol {#}
dict set lexers PY procFindString {(def )\s*?PROCNAME}
dict set lexers PY procRegexpCommand {regexp -nocase -all -- {^\s*?(def)\s*?(.*?)\((.*?)\):} $line match keyWord procName params}
dict set lexers PY varRegexpCommand {regexp -nocase -all -line -- {^\s*?(\w+)\s*=\s*(.+)($)} $line match varName varValue lineEnd}
#--------------------------------------------------
# Ruby
dict set lexers RB commentSymbol {#}
dict set lexers RB commentMultilineSymbolBegin {=begin}
dict set lexers RB commentMultilineSymbolEnd {end=}
dict set lexers RB tabSize 2
dict set lexers RB procFindString {(def )\s*?PROCNAME}
dict set lexers RB procRegexpCommand {regexp -nocase -all -- {^\s*?(def)\s([a-zA-Z0-9\-_:]+?)($|\(.+?\))} $line match keyWord procName params}
dict set lexers RB procFindString {(def |class )\s*?PROCNAME}
dict set lexers RB procRegexpCommand {regexp -nocase -all -- {^\s*?(def|class)\s([a-zA-Z0-9\-_:\?]+?)($|\s|\(.+?\))} $line match keyWord procName params}
dict set lexers RB varRegexpCommand {regexp -nocase -all -line -- {^\s*?(\w+)\s*=\s*(.+)($)} $line match varName varValue lineEnd}
#--------------------------------------------------
# YAML (ansible)
@@ -52,8 +59,50 @@ dict set lexers YML varRegexpCommandMultiline {regexp -all -line -- {^(\s*)(set_
# MD (markdown)
dict set lexers MD tabSize 2
dict set lexers MD procFindString {(#+?)\s*?PROCNAME}
dict set lexers MD procRegexpCommand {regexp -nocase -all -- {^\s*?(#+?)\s(.+?)$} $line match keyWord procName}
dict set lexers MD procRegexpCommand {regexp -nocase -all -- {^(#+?)\s(.+?)$} $line match keyWord procName}
# dict set lexers YML varRegexpCommandMultiline {regexp -all -line -- {^(\s*)(set_fact|vars):$} $line match indent keyWord}
#--------------------------------------------------
# Perl
dict set lexers PL commentSymbol {#}
dict set lexers PL variableSymbol {$}
dict set lexers PL tabSize 4
dict set lexers PL procFindString {(sub )\s*?PROCNAME}
dict set lexers PL procRegexpCommand {regexp -nocase -all -- {^\s*?(sub)\s([a-zA-Z0-9\-_:]+?)($|\(.+?\))} $line match keyWord procName params}
dict set lexers PL varRegexpCommand {regexp -nocase -all -- {^(\s*?)\$([a-zA-Z0-9\-_$]+)\s+=\s+(.+?)(\s*;$)} $line match indent varName varValue lineEnd}
#--------------------------------------------------
# INI
dict set lexers INI commentSymbol {#}
dict set lexers INI tabSize 4
dict set lexers INI procFindString {(\[)PROCNAME(\])}
# dict set lexers INI procRegexpCommand {regexp -nocase -all -- {^\s*?(\[)([a-zA-Z0-9\-_:\s]+?)(\])$} $line match keyWord procName}
dict set lexers INI procRegexpCommand {regexp -nocase -all -- {^\s*?(\[)(.+?)(\])$} $line match keyWord procName}
# -------------------------------------------------
# HTML
dict set lexers HTML commentSymbol {<!--}
dict set lexers HTML commentMultilineSymbolBegin {<!--}
dict set lexers HTML commentMultilineSymbolEnd {-->}
dict set lexers HTML tabSize 4
dict set lexers HTML procFindString {<h[0-9]>(<.+>|)PROCNAME(</.+>|)</h[0-9]>}
dict set lexers HTML procRegexpCommand {regexp -nocase -all -- {<h[0-9]>(<.+>|)(.+?)(</.+>|)</h[0-9]>} $line match v1 procName v2}
# -------------------------------------------------
# HTM
dict set lexers HTM commentSymbol {<!--}
dict set lexers HTM commentMultilineSymbolBegin {<!--}
dict set lexers HTM commentMultilineSymbolEnd {-->}
dict set lexers HTM tabSize 4
dict set lexers HTM procFindString {<h[0-9]>(<.+>|)PROCNAME(</.+>|)</h[0-9]>}
dict set lexers HTM procRegexpCommand {regexp -nocase -all -- {<h[0-9]>(<.+>|)(.+?)(</.+>|)</h[0-9]>} $line match v1 procName v2}
#--------------------------------------------------
# LUA
dict set lexers LUA commentSymbol {--}
dict set lexers LUA procFindString {function\s*?PROCNAME}
dict set lexers LUA procRegexpCommand {regexp -nocase -all -- {^(local|)\s*?(function)\s([a-zA-Z0-9\-_:]+?)\s+\((.+?)\)} $line match v1 keyWord procName params}
dict set lexers LUA varRegexpCommand {regexp -nocase -all -- {^(\s*?)([a-zA-Z0-9\-_\.]+)\s+=\s+(.+?)(\s*$|--)} $line match indent varName varValue lineEnd}
# -------------------------------------------------
dict set lexers ALL varDirectory {variables vars group_vars host_vars defaults}

View File

@@ -118,6 +118,8 @@ proc GetViewMenu {m} {
-variable cfgVariables(procedureHelper) -onvalue true -offvalue false
# -command "ViewHelper procedureHelper"
$m add checkbutton -label [::msgcat::mc "Multiline comments"] \
-variable cfgVariables(multilineComments) -onvalue true -offvalue false
}
proc GetHelpMenu {m} {

View File

@@ -32,6 +32,7 @@
::msgcat::mcset ru "Comments" "Коментарии"
::msgcat::mcset ru "Comment selected" "Закоментировать"
::msgcat::mcset ru "Uncomment selected" "Раскоментировать"
::msgcat::mcset ru "Clone repository" "Клонировать репозиторий"
::msgcat::mcset ru "Column" "Столбец"
::msgcat::mcset ru "Commit" "Коммита"
::msgcat::mcset ru "Commit description" "Описание коммита"
@@ -103,6 +104,7 @@
::msgcat::mcset ru "Image dir" "Каталог изображений"
::msgcat::mcset ru "Indent foreground" "Подсветка отступа"
::msgcat::mcset ru "Indent background" "Подсветка отступа"
::msgcat::mcset ru "Init repository" "Создать репозиторий"
::msgcat::mcset ru "Insert" "Вставка"
::msgcat::mcset ru "In" "В"
::msgcat::mcset ru "Insert image" "Вставить изображение"
@@ -122,6 +124,7 @@
::msgcat::mcset ru "Matches" "Совпадений"
::msgcat::mcset ru "Modules" "Модули"
::msgcat::mcset ru "Modifying the Registry..." "Внесение изменений в реестр"
::msgcat::mcset ru "Multiline comments" "Многострочные комментарии"
::msgcat::mcset ru "Must be one file select!" "Вы должны выбрать только один файл"
::msgcat::mcset ru "Must be one or two file select!" "Вы должны выбрать один или два файла"
::msgcat::mcset ru "Network" "Сеть"

View File

@@ -187,16 +187,16 @@ proc YScrollCommand {txt canv} {
$canv yview"
}
proc ResetModifiedFlag {w} {
global modified nbEditor
proc ResetModifiedFlag {w nbEditor} {
global modified
$w.frmText.t edit modified false
set modified($w) "false"
set lbl [string trimleft [$nbEditor tab $w -text] "* "]
# puts "ResetModifiedFlag: $lbl"
$nbEditor tab $w -text $lbl
}
proc SetModifiedFlag {w} {
global modified nbEditor
proc SetModifiedFlag {w nbEditor} {
global modified
#$w.frmText.t edit modified false
set modified($w) "true"
set lbl [$nbEditor tab $w -text]
@@ -229,12 +229,27 @@ proc ImageBase64Encode {} {
}
}
proc FindImage {ext} {
set imageType {
PNG
JPG
JPEG
WEBP
GIF
TIFF
JP2
ICO
XPM
SVG
}
foreach img [image names] {
if [regexp -nocase -all -- "^($ext)(_)" $img match v1 v2] {
if [regexp -nocase -all -- "^($ext)(_16x12)" $img match v1 v2] {
# puts "\nFindinig images: $img \n"
return $img
}
}
if {[lsearch -exact -nocase $imageType $ext] != -1} {
return image_16x12
}
}
namespace eval Help {

View File

@@ -141,6 +141,10 @@ proc ReadFilesFromDirectory {directory root {type ""}} {
while {[gets $f line] >= 0} {
if [regexp -nocase -all -- {^\s*inventory\s*=\s*(\.\/|)(.+?)$} $line match v1 fileName] {
# puts "Inventory file is a: $line"
if ![file exists [file join $root $directory $fileName]] {
ShowMessage "Error in ansible.cfg" "Inventory File '[file join $root $directory $fileName]' does not exists"
continue
}
if {[lsearch $project($root) [file join $root $directory $fileName]] eq "-1"} {
lappend project($root) [file join $root $directory $fileName]
set variables([file join $root $directory $fileName]) \

View File

@@ -31,6 +31,8 @@ namespace eval Tree {
set findImg [::FindImage gitlab]
} elseif {[string match {*bitbucket*} [string tolower $text]]} {
set findImg [::FindImage bitbucket]
} elseif {[string match {\.git*} [string tolower $text]]} {
set findImg [::FindImage git]
}
if {$fileExt ne "" || $findImg ne ""} {
set image $findImg
@@ -47,6 +49,8 @@ namespace eval Tree {
set image [::FindImage redhat]
} elseif {[string match {*gitlab*} [string tolower [file tail $item]]]} {
set image [::FindImage gitlab]
} elseif {[string match {.git} [string tolower [file tail $item]]]} {
set image [::FindImage git]
} else {
set image pixel
}
@@ -78,7 +82,7 @@ namespace eval Tree {
set key [lindex [split $id "::"] 0]
if {$values eq "" || $key eq ""} {return}
puts "$key $tree $values"
# puts "$key $tree $values"
switch $key {
directory {
FileOper::ReadFolder $values
@@ -100,14 +104,14 @@ namespace eval Tree {
set key [lindex [split $id "::"] 0]
if {$values eq "" || $key eq ""} {return}
puts "$key $tree $values"
# puts "$key $tree $values"
switch -regexp $key {
directory {
FileOper::ReadFolder $values
# $tree item $id -open false
}
file {
set v [FileOper::Edit $values]
set v [FileOper::Edit $values $nbEditor]
if {$v eq false} {
$tree delete $id
}
@@ -115,7 +119,7 @@ namespace eval Tree {
}
I[0-9]*? {
destroy .findVariables
FileOper::Edit [lindex $values 2]
FileOper::Edit [lindex $values 2] $nbEditor
}
default {
set parentItem [$tree parent $id]

View File

@@ -8,4 +8,4 @@ Type=Application
StartupNotify=true
MimeType=text/plain;
Categories=Development;TextEditor;
Icon=projman-48
Icon=projman

View File

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,108 +0,0 @@
Name: projman
Version: 0.4.5
Release: rh1
Summary: Tcl/Tk Project Manager
License: GPL
Group: Development/Tcl
Url: https://bitbucket.org/svk28/projman
BuildArch: noarch
Source: %name-%version-%release.tar.gz
Requires: tcl, tk, bwidget, tcl-img
%description
This programm is Integrated Development Environment for Tcl/Tk language programming. Include - project manager, text and source editor with syntax highlightning, archive (tar.gz) and PRM builder and more.
%description -l ru_RU.UTF8
Интегрированная среда для программирования на Tcl/Tk. Включает в себя - менеджер проектов, полнофункциональный редактор, систему навигации по файлам и структуре файлов и многое другое.
%prep
%setup -n %name
%build
%install
mkdir -p $RPM_BUILD_ROOT{%_bindir,%_datadir/%name/{img,msgs,/lib/highlight}}
install -p -m755 projman.tcl $RPM_BUILD_ROOT%_bindir/%name
install -p -m644 *.tcl $RPM_BUILD_ROOT%_datadir/%name/
install -p -m644 lib/highlight/*.tcl $RPM_BUILD_ROOT%_datadir/%name/highlight/
install -p -m644 *.conf $RPM_BUILD_ROOT%_datadir/%name/
install -p -m644 img/*.* $RPM_BUILD_ROOT%_datadir/%name/img/
install -p -m644 msgs/*.* $RPM_BUILD_ROOT%_datadir/%name/msgs/
# Menu support
#mkdir -p $RPM_BUILD_ROOT/usr/lib/menu
#cat > $RPM_BUILD_ROOT%_libdir/menu/%name << EOF
#?package(%name): needs=x11 icon="projman.png" section="Applications/Development/Development environments" title=ProjMan longtitle="Tcl/Tk Project Manager" command=projman
#EOF
#mdk icons
#install -d $RPM_BUILD_ROOT{%_iconsdir,%_liconsdir,%_miconsdir}
#install -p -m644 img/icons/%name.png $RPM_BUILD_ROOT%_iconsdir/
#install -p -m644 img/icons/large/%name.png $RPM_BUILD_ROOT%_liconsdir/
#install -p -m644 img/icons/mini/%name.png $RPM_BUILD_ROOT%_miconsdir/
%post
%update_menus
%postun
%clean_menus
%files
%doc INSTALL CHANGELOG TODO COPYING README THANKS
%doc hlp/ru/*
%_bindir/%name
%_datadir/%name
#%_libdir/menu/%name
#%_iconsdir/%name.png
#%_liconsdir/%name.png
#%_miconsdir/%name.png
%changelog
* Fri Feb 16 2018 Sergey Kalinin <banzaj@altlinux.ru> 0.4.5
- Added saving main window geometry into projman.conf file when close programm
- Fixed AutoComplite precedure for TCL/TK-projects
- Added colored icon for main window
- Fixed "Close all" procedure if opened files from projects and file browser
- Fixed parsing some procedure name like ::proc::name or proc_na::me(aa) and parameters {{} {} {}}
- Added opening last active project when project run
- Fixed Windows OS running without installation
- Added gray theme
- Fixed work with file from directory (FileBrowser function).
- Auto indent added for () [] braces
- File Browser added. Now we will edited any file without project
- Tcl, Perl, PHP highlight comment procedure fixed
- Help file Text.html utf-8 encoding
- Change hotkeys "Control+," "Control+." "Control+/" (commect selected, uncoment selected, select all)
- Add new function Comments/Uncomment selected text
- Added binding mouse button: click on notebook tab highlight opened file name in tree
- Change "Paste from Clipboard" function
- Change popup editor menu (undo, redo, copy, paste, cut functions)
- Change Logo and About dialog
- Russian help files was conerting into utf-8 encode
- Change help file load procedure
- Fixed paste text highlight
- Fixed setting edited flag when paste the text from buffer
- Remove ctags support
- Added gitk (gui for git) support
- Changes color setting dialog into "Setting"
- Actualizing information into "About" dialog
- Corrected color settings for all widgets
- Change default color scheme
- Remove ctag, change autocomplitt procedure
* Wed Feb 13 2008 Sergey Kalinin <banzaj@altlinux.ru> 0.3.8-alt1
- Added text encoding support from koi8-r,cpp1251,cp866 to UTF-8
* Tue Feb 20 2007 Sergey Kalinin <banzaj@altlinux.ru> 0.3.7-alt4
- Fixed setiings dialog
- Fixed saved settings parameter
* Wed Oct 18 2006 Sergey Kalinin <banzaj@altlinux.ru> 0.3.7-alt3
- Remove SuperText widget now use native TEXT

View File

@@ -9,8 +9,8 @@ exec wish "$0" -- "$@"
# Home page: https://nuk-svk.ru
######################################################
# Version: 2.0.0
# Release: alpha
# Build: 25112022110647
# Release: alpha16
# Build: 22082024151054
######################################################
# определим текущую версию, релиз и т.д.
@@ -34,12 +34,6 @@ while {[gets $f line] >=0} {
}
close $f
if { $::argc > 0 } {
foreach arg $::argv {
lappend opened $arg
}
puts $opened
}
package require msgcat
package require inifile
@@ -53,6 +47,15 @@ package require fileutil::magic::filetype
set dir(root) [pwd]
set dir(doc) [file join $dir(root) doc]
# ДОбавляем в список файлы (каталоги) из командной строки
if { $::argc > 0 } {
foreach arg $::argv {
lappend opened $arg
}
puts $opened
}
# Устанавливаем рабочий каталог, если его нет то создаём.
# Согласно спецификации XDG проверяем наличие переменных и каталогов
if [info exists env(XDG_CONFIG_HOME)] {
@@ -111,11 +114,10 @@ source [file join $dir(lib) gui.tcl]
# Open the PATH if command line argument has been setting
if [info exists opened] {
# puts ">$opened"
foreach path $opened {
# Приводим путь к полному виду
if {[file pathtype $path] ne "absolute"} {
puts "\n\t[::msgcat::mc "Specify the absolute path to the directory or file"]: $path\n"
exit
set path [file normalize $path]
}
if [file isdirectory $path] {
# set activeProject $path
@@ -125,7 +127,8 @@ if [info exists opened] {
FileOper::ReadFolder $path
ReadFilesFromDirectory $path $path
} elseif [file exists $path] {
ResetModifiedFlag [FileOper::Edit $path]
# ResetModifiedFlag [FileOper::Edit $path]
FileOper::Edit $path
}
}
} else {

42
redhat/build-rpm.sh Executable file
View File

@@ -0,0 +1,42 @@
#!/bin/bash
RPM_BUILD_DIR=${HOME}/rpmbuild
mkdir -p ${RPM_BUILD_DIR}/{SOURCES,RPMS,SRPMS,SPECS,RPMS/noarch}
cd ../
VERSION=$(grep "Version" projman.tcl | grep -oE '\b[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\b')
RELEASE=$(grep "# Release" projman.tcl | grep -oE '[0-9A-Za-z]+$')
BUILD_DATE=$(date +%d%m%Y%H%M%S)
TXT="# Build: ${BUILD_DATE}"
sed -i "/# Build:.*/c$TXT" projman.tcl
cp projman.tcl projman
sed -i "s+^set\ dir(lib)+set\ dir(lib)\ /usr/share/projman/lib ;#+g" projman
sed -i "s+\[pwd\]+/usr/share/projman+g" projman
CUR_DIR=$(pwd)
cd ../
tar --exclude='.git' --exclude='debian' --exclude='redhat' --exclude='projman.tcl' -czf ${RPM_BUILD_DIR}/SOURCES/projman-${VERSION}-${RELEASE}.tar.gz projman
cd ${CUR_DIR}
cp redhat/projman.spec ${RPM_BUILD_DIR}/SPECS/projman.spec
sed -i "s/.*Version:.*/Version:\t${VERSION}/" ${RPM_BUILD_DIR}/SPECS/projman.spec
sed -i "s/.*Release:.*/Release:\t${RELEASE}/" ${RPM_BUILD_DIR}/SPECS/projman.spec
rpmbuild -ba "${RPM_BUILD_DIR}/SPECS/projman.spec"
# cp ${RPM_BUILD_DIR}/RPMS/noarch/projman-${VERSION}-${RELEASE}.noarch.rpm /files/
# cp ${RPM_BUILD_DIR}/SRPMS/projman-${VERSION}-${RELEASE}.src.rpm /files/
rm -v projman
rm -r -v ${RPM_BUILD_DIR}/SPECS/projman.spec
rm -r -v ${RPM_BUILD_DIR}/SOURCES/projman-${VERSION}-${RELEASE}.tar.gz
rm -r -v ${RPM_BUILD_DIR}/BUILD/projman

55
redhat/projman.spec Normal file
View File

@@ -0,0 +1,55 @@
Name: projman
Version: 2.0.0
Release: rh1
Summary: Tcl/Tk Project Manager
License: GPL
Group: Development/Tcl
Url: https://nuk-svk.ru
BuildArch: noarch
Source: %name-%version-%release.tar.gz
Requires: tcl, tk, tklib, tcllib
%description
This a editor for programming in TCL/Tk (and other language). It includes a file manager, a source editor with syntax highlighting and code navigation, a context-sensitive help system, Git support, and much more.
%description -l ru_RU.UTF8
Интегрированная среда для программирования на Tcl/Tk. Включает в себя - менеджер проектов, полнофункциональный редактор, систему навигации по файлам и структуре файлов и многое другое.
%prep
%setup -n %name
%build
%install
mkdir -p $RPM_BUILD_ROOT%_bindir
mkdir -p $RPM_BUILD_ROOT%_datadir/%name/lib/msgs
mkdir -p $RPM_BUILD_ROOT%_datadir/%name/theme
mkdir -p $RPM_BUILD_ROOT%{_datarootdir}/applications
install -p -m755 projman $RPM_BUILD_ROOT%_bindir/%name
install -p -m755 tkregexp.tcl $RPM_BUILD_ROOT%_bindir/tkregexp
# install -p -m644 *.tcl $RPM_BUILD_ROOT%_datadir/%name/
install -p -m644 lib/*.tcl $RPM_BUILD_ROOT%_datadir/%name/lib/
install -p -m644 lib/msgs/*.* $RPM_BUILD_ROOT%_datadir/%name/lib/msgs/
install -p -m644 theme/*.tcl $RPM_BUILD_ROOT%_datadir/%name/theme
install -p -m644 projman.desktop $RPM_BUILD_ROOT%{_datarootdir}/applications
%post
%update_menus
%postun
%clean_menus
%files
%doc INSTALL CHANGELOG TODO LICENSE README.md
%_bindir/%name
%_bindir/tkregexp
%_datarootdir/applications/%name.desktop
%_datadir/%name
%changelog
* Mon Nov 28 2022 Sergey Kalinin <svk@nuk-svk.ru> 2.0.0
- Initial release