Fix dropdown menu duplicates and reorder items

- Fix CSS breakpoints to sync header tabs with dropdown menu visibility
- Add missing apps (docs, sheet, slides, social) to hide/show logic
- Remove incorrect paper breakpoint (not in header tabs)
- Reorder dropdown: dynamic items first (header tab apps), then static items
- Move People after dynamic items (after social)
- Remove duplicate Social entry from dropdown menu
- All 26 suite app folders have menu entries (no orphans)
This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2026-01-09 21:19:43 -03:00
parent ba74a9a6e5
commit 497d42258e
50 changed files with 470 additions and 177 deletions

View file

@ -219,9 +219,9 @@ match x {
```
gb/
├── botapp/ # Desktop app (Tauri)
├── botserver/ # Main server (Axum API)
├── botserver/ # Main server (Axum API) - port 8088
├── botlib/ # Shared library
├── botui/ # Web UI
├── botui/ # Web UI server - port 3000
├── botbook/ # Documentation
├── bottest/ # Integration tests
└── PROMPT.md # THIS FILE
@ -229,6 +229,51 @@ gb/
---
## 🖥️ UI Architecture (botui + botserver)
### Two Servers During Development
| Server | Port | Purpose |
|--------|------|---------|
| **botui** | 3000 | Serves UI files + proxies API to botserver |
| **botserver** | 8088 | Backend API + embedded UI fallback |
### How It Works
```
Browser → localhost:3000 → botui (serves HTML/CSS/JS)
→ /api/* proxied to botserver:8088
→ /suite/* served from botui/ui/suite/
```
### Adding New Suite Apps
When adding a new app (e.g., `video`, `learn`):
1. Create folder: `botui/ui/suite/<appname>/`
2. Add to `SUITE_DIRS` in `botui/src/ui_server/mod.rs`:
```rust
const SUITE_DIRS: &[&str] = &[
"chat", "mail", "calendar", ...,
"video", // ← add new app here
"learn",
];
```
3. Rebuild botui: `cargo build -p botui`
4. Add menu entry in `botui/ui/suite/index.html`
### Hot Reload
- **UI files (HTML/CSS/JS)**: Edit & refresh browser (no restart)
- **botui Rust code**: Rebuild + restart botui
- **botserver Rust code**: Rebuild + restart botserver
### Production (Single Binary)
When `botui/ui/suite/` folder not found, botserver uses **embedded UI** compiled into binary via `rust-embed`.
---
## 🚀 OFFLINE ERROR FIXING WORKFLOW
### Step 1: Analyze Error List

@ -1 +1 @@
Subproject commit a8444f0d2400f60d966341c59a7a3df4577c69d2
Subproject commit 1b0a5cbec7f4a0e8576757f36d04a89c80f9406a

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIDEwVAlMJVNEO6Tq5YhFCHErtYnJnOXnV4CMEzfw4TbNoAoGCCqGSM49
AwEHoUQDQgAEjqzVL6nD2ty59fy75/NkGPvyYWFdcKBwvytPHSMeFK6rzN0KQ0sQ
WusB/ejQtfbwoLI32007+N1sZZ6WCd6K1w==
-----END EC PRIVATE KEY-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBsTCCAVagAwIBAgIUCCAJMWsnAtGqvpXvr+aEp4jjdXwwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEeMBwGA1UEAwwVZHJpdmUuYm90
c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjqzVL6nD2ty5
9fy75/NkGPvyYWFdcKBwvytPHSMeFK6rzN0KQ0sQWusB/ejQtfbwoLI32007+N1s
ZZ6WCd6K16M1MDMwMQYDVR0RBCowKIIJbG9jYWxob3N0hwR/AAABghVkcml2ZS5i
b3RzZXJ2ZXIubG9jYWwwCgYIKoZIzj0EAwIDSQAwRgIhAPaAQkiauh2NgOmfqgtx
Ivltu8S+rtbAzatuNdllZctHAiEAxe9LvBAGQoNy41aktHjHfAVBrVSZwUoHZ8L3
qw4drHo=
-----END CERTIFICATE-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBqzCCAVKgAwIBAgIUEBmttmYkjeLlfU1QeXDBy8+HmP0wCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owPzELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEcMBoGA1UEAwwTYXBpLmJvdHNl
cnZlci5sb2NhbDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD9E4Onao5JJ7aAV
/FxABbiG37H3Vtiet33+WkGmNTFQOjz9pz6PTIscgVl7rNGkCniyuNyUKAe3zyY6
iu3GWcCjMzAxMC8GA1UdEQQoMCaCCWxvY2FsaG9zdIcEfwAAAYITYXBpLmJvdHNl
cnZlci5sb2NhbDAKBggqhkjOPQQDAgNHADBEAiAI2SJcABgzkJoRIdYs5uAeaQeS
BKWX/jADXkputmR2awIgLhtL02FP9vNwin7b2J/XAzh2I6nKREKdyjzqbuST0Bo=
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgi0umDCzes8MaDAgk
uAeFc2yw3BxEfR9l9fyiQL2UW0ChRANCAAQ/RODp2qOSSe2gFfxcQAW4ht+x91bY
nrd9/lpBpjUxUDo8/ac+j0yLHIFZe6zRpAp4srjclCgHt88mOortxlnA
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBjTCCATSgAwIBAgIUXyYxQ+Moq8JTVZ4gYqK5L3FYOxswCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owPDELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEZMBcGA1UEAwwQYm90c2VydmVy
LWNsaWVudDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOWhAQBCpd78n0hvghc2
ehapOCGRAXzJpVlEpPc/OwNC30xHTx+gf6KxRYUKKvlUlMY73v+dYozX5yw/eaA9
cF6jGDAWMBQGA1UdEQQNMAuCCWJvdHNlcnZlcjAKBggqhkjOPQQDAgNHADBEAiAg
8QSmZuz8vJ+elGJED/iTm8grdgdyME+0/hoK8WCvMQIgYh4Vj8fjX8uRmckTmFhU
FB225+EI69nGeH9TtDoU+N4=
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBzk4BnAMub4NhGdP
M+uzhg1oikPjeeCq4NQxBWAYD32hRANCAATloQEAQqXe/J9Ib4IXNnoWqTghkQF8
yaVZRKT3PzsDQt9MR08foH+isUWFCir5VJTGO97/nWKM1+csP3mgPXBe
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgD7oHpHyAUlaAO0Hv
CZX/x2MHG0HyuoX3I0499CkBsHmhRANCAAR/3WIWYa3YwYRK82sxar2EYKeHHNjN
zviJou6c2HqFVTmg/eO+DureDytk5ZQM44ZrgMZ3Ct0LsK8ghZyqP7Mp
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBsDCCAVagAwIBAgIUFK8kzVdER15ZiUQs8Liot83qUFgwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEeMBwGA1UEAwwVY2FjaGUuYm90
c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEYFnVn8tKA4iL
2nCj5PTIXnrgbghrGgY3x0+hS3LcTXgz/4s53bpwrUcobEjs7nXS1VDqERdtJ4c4
EMo2VOf46qM1MDMwMQYDVR0RBCowKIIJbG9jYWxob3N0hwR/AAABghVjYWNoZS5i
b3RzZXJ2ZXIubG9jYWwwCgYIKoZIzj0EAwIDSAAwRQIhAIoEvORMPLOcbeQl5917
3tbdnllRqoSlpU3+tfcioOpiAiAkHs2dH1Q+JF30KHB7AMv3Ec+WPBqkxCOJlg1y
9lSXdw==
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg65zp+LXs7+Zx8qcj
xIQnHoxTy5sdfqiGAgRPBlSbdGOhRANCAARgWdWfy0oDiIvacKPk9MheeuBuCGsa
BjfHT6FLctxNeDP/izndunCtRyhsSOzuddLVUOoRF20nhzgQyjZU5/jq
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBvDCCAWOgAwIBAgIUFZX7qbWa8Ls+Y744yNHGVp4OKjowCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEeMBwGA1UEAwwVY2FkZHkuYm90
c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZAPbdPWp646Q
tMh1BTYT6Wr42nOVMvUuj3HSQQsHZB1sHcNBTI5yrvgrToDy4PDzbB/E5RMDR6Xp
AW4irwwSz6NCMEAwPgYDVR0RBDcwNYIJbG9jYWxob3N0hwR/AAABghEqLmJvdHNl
cnZlci5sb2NhbIIPYm90c2VydmVyLmxvY2FsMAoGCCqGSM49BAMCA0cAMEQCIFz2
NqlzwiAK0kVdF2L4nzSdyqCA0+TGWIAorE0hZjUVAiA+NStt3fYi6CIF6oqPytCC
dcL6O4n63CAoe94tQ4u40Q==
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9yvPZCAxxQM5d3Qv
6+5f3wn1bnXeQjknLohiyUFhOyehRANCAARkA9t09anrjpC0yHUFNhPpavjac5Uy
9S6PcdJBCwdkHWwdw0FMjnKu+CtOgPLg8PNsH8TlEwNHpekBbiKvDBLP
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBzjCCAXSgAwIBAgIUQObXWjZXgUSHtdznx29wAsH7ztYwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owRTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEiMCAGA1UEAwwZZGlyZWN0b3J5
LmJvdHNlcnZlci5sb2NhbDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABA/8o5Ww
wUD14DJQ2Qh0XmFaHkao8TFhagwWP8YwmnkuvY1svj5sMA81N/2Dwp7o1jWnGxzX
vJU0OSq3/WissUijTzBNMEsGA1UdEQREMEKCCWxvY2FsaG9zdIcEfwAAAYIZZGly
ZWN0b3J5LmJvdHNlcnZlci5sb2NhbIIUYXV0aC5ib3RzZXJ2ZXIubG9jYWwwCgYI
KoZIzj0EAwIDSAAwRQIgQjFLaGNS4L63Zp3F7baFYKSj3Np65Bj6wWnuPLcnYzkC
IQCRE/kH+sGGCYE4jsiy+Jx7V4nRd3OFM1FDjS74gM8Wdw==
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9n8fVbqgVqjIUNAs
iRWePi0Jnxw2CqgSMe/E4KWFLNWhRANCAAQP/KOVsMFA9eAyUNkIdF5hWh5GqPEx
YWoMFj/GMJp5Lr2NbL4+bDAPNTf9g8Ke6NY1pxsc17yVNDkqt/1orLFI
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBsTCCAVagAwIBAgIUCCAJMWsnAtGqvpXvr+aEp4jjdXwwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEeMBwGA1UEAwwVZHJpdmUuYm90
c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjqzVL6nD2ty5
9fy75/NkGPvyYWFdcKBwvytPHSMeFK6rzN0KQ0sQWusB/ejQtfbwoLI32007+N1s
ZZ6WCd6K16M1MDMwMQYDVR0RBCowKIIJbG9jYWxob3N0hwR/AAABghVkcml2ZS5i
b3RzZXJ2ZXIubG9jYWwwCgYIKoZIzj0EAwIDSQAwRgIhAPaAQkiauh2NgOmfqgtx
Ivltu8S+rtbAzatuNdllZctHAiEAxe9LvBAGQoNy41aktHjHfAVBrVSZwUoHZ8L3
qw4drHo=
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMTBUCUwlU0Q7pOrl
iEUIcSu1icmc5edXgIwTN/DhNs2hRANCAASOrNUvqcPa3Ln1/Lvn82QY+/JhYV1w
oHC/K08dIx4UrqvM3QpDSxBa6wH96NC19vCgsjfbTTv43WxlnpYJ3orX
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIB3DCCAYKgAwIBAgIUdw5C0UYct0rB8XKZP4xDRn7FZiUwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEeMBwGA1UEAwwVZW1haWwuYm90
c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEax144GBiUfcy
n+EgGEnHVjt66io6XES+rSrcS6cQApLnEkKFTWH3301VSkQbt1LXvnPS6/N46B0i
zOC6QblEeqNhMF8wXQYDVR0RBFYwVIIJbG9jYWxob3N0hwR/AAABghVlbWFpbC5i
b3RzZXJ2ZXIubG9jYWyCFHNtdHAuYm90c2VydmVyLmxvY2FsghRpbWFwLmJvdHNl
cnZlci5sb2NhbDAKBggqhkjOPQQDAgNIADBFAiEA4QqYxhMQHuMhr/CBrUUXYZFG
VsB7iYgnQSWBfhRO0rsCIEo89kYQnVE7MQTeDBf5a79Ia8HTNFATEooBWLE3wH4X
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgSNCzU/xWsjYwwk8H
3LSYh0bYI1+MqY6RLDyUdcsA/sOhRANCAARrHXjgYGJR9zKf4SAYScdWO3rqKjpc
RL6tKtxLpxACkucSQoVNYfffTVVKRBu3Ute+c9Lr83joHSLM4LpBuUR6
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBuDCCAV6gAwIBAgIUFoH3c6yvJ54C2mjxqRr93x+5AdMwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owRTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEiMCAGA1UEAwwZZW1iZWRkaW5n
LmJvdHNlcnZlci5sb2NhbDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFgtv49n
RP65s3q9f7CIp9g0m2fydY8ef1kLvqJOBu5a+nRezEydGzA74VmdC8kZymD1a57O
B14Ur32DdPOWdVGjOTA3MDUGA1UdEQQuMCyCCWxvY2FsaG9zdIcEfwAAAYIZZW1i
ZWRkaW5nLmJvdHNlcnZlci5sb2NhbDAKBggqhkjOPQQDAgNIADBFAiBnUMziwiAI
3EtkemJFOFukSgdqXYlCBJEkTMPQmJMX3AIhAPCTy9a1y6BGPh5iYvYxG0yG+saA
WftANldcwV/gpobL
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgkgOSgeoYGrcr5qEy
kdfBdwzW3bTToSjKnUX89GzchwShRANCAARYLb+PZ0T+ubN6vX+wiKfYNJtn8nWP
Hn9ZC76iTgbuWvp0XsxMnRswO+FZnQvJGcpg9WuezgdeFK99g3TzlnVR
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBrDCCAVKgAwIBAgIULLeNNHmCgIy6gdtOj7g3BsqHbLIwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owPzELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEcMBoGA1UEAwwTbGxtLmJvdHNl
cnZlci5sb2NhbDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABPwMZlbuU1+rschc
rRzqqI6Y+wZOKxC4cyie6fYfCzwk2eYPmZ69sO8ecqDJhKuQBskcXXizJtEcuOcP
MKWYZ4mjMzAxMC8GA1UdEQQoMCaCCWxvY2FsaG9zdIcEfwAAAYITbGxtLmJvdHNl
cnZlci5sb2NhbDAKBggqhkjOPQQDAgNIADBFAiAvc2/SqQUxGmIW8BRrI9cKsZyv
skRjHuYyzgV7MlwQZAIhAJrW4lM8QukmbX1q8QjDZ4AcZgXTWfNTgA4OQN81mRIA
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgywgP2Z+36UFU0tCX
mjLAcWjwHsS9VQStesTISqv96LOhRANCAAT8DGZW7lNfq7HIXK0c6qiOmPsGTisQ
uHMonun2Hws8JNnmD5mevbDvHnKgyYSrkAbJHF14sybRHLjnDzClmGeJ
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBwzCCAWqgAwIBAgIUOFSwzEf9g4EjNN87Rm9CVHMQy0cwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQDELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEdMBsGA1UEAwwUbWVldC5ib3Rz
ZXJ2ZXIubG9jYWwwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQa0cd7blTJKeIy
qoMzofkhELiJObh/7mLRA449sF2JkfN1ntdlaJME+w4QWol7jJrN3djovp9VSF1n
lenyO5Zso0owSDBGBgNVHREEPzA9gglsb2NhbGhvc3SHBH8AAAGCFG1lZXQuYm90
c2VydmVyLmxvY2FsghR0dXJuLmJvdHNlcnZlci5sb2NhbDAKBggqhkjOPQQDAgNH
ADBEAiBQ2Tj1aEUsJPKn8nB8fMoPypGFjqQsrHVMGd1jugRKvgIgPwommm56FBRE
fykGU8Ti60kv3bE/T8n96bys/Ck27QQ=
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgGV4Njkk6msSROX4j
xECKbepHax+ITYjKbPgU7GYja9yhRANCAAQa0cd7blTJKeIyqoMzofkhELiJObh/
7mLRA449sF2JkfN1ntdlaJME+w4QWol7jJrN3djovp9VSF1nlenyO5Zs
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBszCCAVigAwIBAgIUedQtLNXwJmy0Aq0iGF6RRhWLjrEwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQjELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEfMB0GA1UEAwwWdGFibGVzLmJv
dHNlcnZlci5sb2NhbDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJPQ9iKqvlcs
uuU5VuwUFhclUlZgp8B0RT6TZ43ULuIvbIZ7uwGC3SP7+RPeehqnQSvRMCUh6LUr
iUrIqVjZYtmjNjA0MDIGA1UdEQQrMCmCCWxvY2FsaG9zdIcEfwAAAYIWdGFibGVz
LmJvdHNlcnZlci5sb2NhbDAKBggqhkjOPQQDAgNJADBGAiEA+ICfkJLs90c+BwRu
2FGT2bZ4Av5aITNlZe32W6g4x1ACIQCtXTHMniLCKTm+jP6YUVy8jKjlAW7TzQEW
yBjhieiKqw==
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgGRyl9LxjpKa/AXsN
8Utr/4r31nYClRXAYcIRtHvY7/ChRANCAAST0PYiqr5XLLrlOVbsFBYXJVJWYKfA
dEU+k2eN1C7iL2yGe7sBgt0j+/kT3noap0Er0TAlIei1K4lKyKlY2WLZ
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBsTCCAVagAwIBAgIUD1I5LIe/58xRDeIzDydogQ7O48AwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owQTELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEeMBwGA1UEAwwVdmF1bHQuYm90
c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAErBEIYdeJsrFR
QcrB5ZbwQh07DHxY5l6CWSG4nPMlLw1glVmelg/KWRC0x0qT2w1c8ZuhrDgXPoaI
3gYm6YuDA6M1MDMwMQYDVR0RBCowKIIJbG9jYWxob3N0hwR/AAABghV2YXVsdC5i
b3RzZXJ2ZXIubG9jYWwwCgYIKoZIzj0EAwIDSQAwRgIhAOKl0AoVfexLk7W8ojg9
8bgJpkD/S++dMp5iwO7EEmNTAiEA8gj1QkB200y+MPIcbfWo5os/rOUdgsi6ajiB
2sPKuZI=
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgYty4Dxz6uuA6oTfA
3pPG62ZCcZSHH6x24TmU845C4cChRANCAASsEQhh14mysVFBysHllvBCHTsMfFjm
XoJZIbic8yUvDWCVWZ6WD8pZELTHSpPbDVzxm6GsOBc+hojeBibpi4MD
-----END PRIVATE KEY-----

View file

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBpDCCAUqgAwIBAgIUb/JxqKPVbZIOJUOHrRQG9+XGb2wwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTM2MDEwNzE0MzIyN1owODELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90U2VydmVy
IENBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEf91iFmGt2MGESvNrMWq9hGCn
hxzYzc74iaLunNh6hVU5oP3jvg7q3g8rZOWUDOOGa4DGdwrdC7CvIIWcqj+zKaMy
MDAwHQYDVR0OBBYEFCjdDuxP8W2kfvArjBjB3DTasjOOMA8GA1UdEwEB/wQFMAMB
Af8wCgYIKoZIzj0EAwIDSAAwRQIgGZ8DZBa3S4d1R9i4H/cgxsJ5Chc4WjspO2cR
K2ZYhJICIQCovdi36+WpK8rPYWfnOpViddt7kjGmET06G1jNCaY8eA==
-----END CERTIFICATE-----

View file

@ -0,0 +1,12 @@
-----BEGIN CERTIFICATE-----
MIIBtTCCAVygAwIBAgIUYc6xkfJ9hKLTOJWmQK2qGZnX4kQwCgYIKoZIzj0EAwIw
ODELMAkGA1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEVMBMGA1UEAwwMQm90
U2VydmVyIENBMB4XDTI2MDEwOTE0MzIyN1oXDTI3MDEwOTE0MzIyN1owRDELMAkG
A1UEBgwCQlIxEjAQBgNVBAoMCUJvdFNlcnZlcjEhMB8GA1UEAwwYdmVjdG9yZGIu
Ym90c2VydmVyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEGjzEoKX3
bMMVTik6tgG9Cc2Sh+vg7zYPxCgx3PS5/g7UBR9Z5XXWC6kDfdLgxOfFL/3Wvr45
gwCxPt//UGNQ2qM4MDYwNAYDVR0RBC0wK4IJbG9jYWxob3N0hwR/AAABghh2ZWN0
b3JkYi5ib3RzZXJ2ZXIubG9jYWwwCgYIKoZIzj0EAwIDRwAwRAIgG8QM6qzq5ZaX
51BXjWTQMZfL/yurnMMmNyPx2DfpZkoCIFZN0jJm3dxwZsTIJDI4FU2T4FC/YGee
bu9ZO2/ERaFK
-----END CERTIFICATE-----

View file

@ -0,0 +1,5 @@
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgOYg1iMeJt9WlQ0VN
zIHneW1OO2pTEpbaOZNAhkPUECmhRANCAAQaPMSgpfdswxVOKTq2Ab0JzZKH6+Dv
Ng/EKDHc9Ln+DtQFH1nlddYLqQN90uDE58Uv/da+vjmDALE+3/9QY1Da
-----END PRIVATE KEY-----

View file

@ -0,0 +1,16 @@
storage "file" {
path = "/home/rodriguez/src/gb/botserver-stack/data/vault/vault"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = false
tls_cert_file = "/home/rodriguez/src/gb/botserver-stack/conf/system/certificates/vault/server.crt"
tls_key_file = "/home/rodriguez/src/gb/botserver-stack/conf/system/certificates/vault/server.key"
tls_client_ca_file = "/home/rodriguez/src/gb/botserver-stack/conf/system/certificates/ca/ca.crt"
}
api_addr = "https://localhost:8200"
cluster_addr = "https://localhost:8201"
ui = true
disable_mlock = true

2
botui

@ -1 +1 @@
Subproject commit cb33a75d39f2cf53de952622f72e8e6ef4ea0690
Subproject commit 80c91f63046dd5d11e2874bb355ec2d967a70b55

View file

@ -1,20 +0,0 @@
{
"base_url": "http://localhost:8300",
"default_org": {
"id": "353226116074307598",
"name": "default",
"domain": "default.localhost"
},
"default_user": {
"id": "admin",
"username": "admin",
"email": "admin@localhost",
"password": "",
"first_name": "Admin",
"last_name": "User"
},
"admin_token": "XzjmsXoVy7mDKK8gyWtJNp3w3enVW3EKGPdfLbz0nX9vMsDpg27UtAROOcKMXsoc0fDwv98",
"project_id": "",
"client_id": "353226118456737806",
"client_secret": "5uH0r2elIQ3xji4N4aTOARZjEDDUWC0cfIybGaFkvhwlA6gvygMHOdmodVg4K6PJ"
}

View file

@ -1,153 +0,0 @@
#!/bin/bash
set -euo pipefail
LOCALES_DIR="${1:-locales}"
BASE_LOCALE="${2:-en}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
if [ ! -d "$LOCALES_DIR" ]; then
echo -e "${RED}Error: Locales directory not found: $LOCALES_DIR${NC}"
exit 1
fi
if [ ! -d "$LOCALES_DIR/$BASE_LOCALE" ]; then
echo -e "${RED}Error: Base locale not found: $LOCALES_DIR/$BASE_LOCALE${NC}"
exit 1
fi
extract_keys() {
local file="$1"
grep -E '^[a-z][a-z0-9-]*\s*=' "$file" 2>/dev/null | cut -d'=' -f1 | tr -d ' ' | sort -u
}
count_keys() {
local dir="$1"
local count=0
for file in "$dir"/*.ftl; do
if [ -f "$file" ]; then
local file_count
file_count=$(extract_keys "$file" | wc -l)
count=$((count + file_count))
fi
done
echo "$count"
}
echo "========================================"
echo " General Bots i18n Coverage Report"
echo "========================================"
echo ""
base_count=$(count_keys "$LOCALES_DIR/$BASE_LOCALE")
echo -e "Base locale: ${GREEN}$BASE_LOCALE${NC} ($base_count keys)"
echo ""
declare -A all_base_keys
for file in "$LOCALES_DIR/$BASE_LOCALE"/*.ftl; do
if [ -f "$file" ]; then
filename=$(basename "$file")
while IFS= read -r key; do
all_base_keys["$filename:$key"]=1
done < <(extract_keys "$file")
fi
done
total_missing=0
total_extra=0
for locale_dir in "$LOCALES_DIR"/*/; do
locale=$(basename "$locale_dir")
if [ "$locale" = "$BASE_LOCALE" ]; then
continue
fi
locale_count=$(count_keys "$locale_dir")
if [ "$base_count" -gt 0 ]; then
coverage=$((locale_count * 100 / base_count))
else
coverage=0
fi
if [ "$coverage" -ge 90 ]; then
color=$GREEN
elif [ "$coverage" -ge 50 ]; then
color=$YELLOW
else
color=$RED
fi
echo -e "Locale: ${color}$locale${NC} - $locale_count/$base_count keys (${coverage}%)"
missing_keys=()
extra_keys=()
for file in "$LOCALES_DIR/$BASE_LOCALE"/*.ftl; do
if [ -f "$file" ]; then
filename=$(basename "$file")
target_file="$locale_dir/$filename"
if [ ! -f "$target_file" ]; then
while IFS= read -r key; do
missing_keys+=("$filename: $key")
done < <(extract_keys "$file")
else
while IFS= read -r key; do
if ! grep -q "^$key\s*=" "$target_file" 2>/dev/null; then
missing_keys+=("$filename: $key")
fi
done < <(extract_keys "$file")
while IFS= read -r key; do
if ! grep -q "^$key\s*=" "$file" 2>/dev/null; then
extra_keys+=("$filename: $key")
fi
done < <(extract_keys "$target_file")
fi
fi
done
if [ ${#missing_keys[@]} -gt 0 ]; then
echo -e " ${RED}Missing keys (${#missing_keys[@]}):${NC}"
for key in "${missing_keys[@]:0:10}"; do
echo " - $key"
done
if [ ${#missing_keys[@]} -gt 10 ]; then
echo " ... and $((${#missing_keys[@]} - 10)) more"
fi
total_missing=$((total_missing + ${#missing_keys[@]}))
fi
if [ ${#extra_keys[@]} -gt 0 ]; then
echo -e " ${YELLOW}Extra keys (${#extra_keys[@]}):${NC}"
for key in "${extra_keys[@]:0:5}"; do
echo " - $key"
done
if [ ${#extra_keys[@]} -gt 5 ]; then
echo " ... and $((${#extra_keys[@]} - 5)) more"
fi
total_extra=$((total_extra + ${#extra_keys[@]}))
fi
echo ""
done
echo "========================================"
echo " Summary"
echo "========================================"
echo "Base keys: $base_count"
echo -e "Total missing: ${RED}$total_missing${NC}"
echo -e "Total extra: ${YELLOW}$total_extra${NC}"
if [ "$total_missing" -eq 0 ] && [ "$total_extra" -eq 0 ]; then
echo -e "${GREEN}All translations are complete!${NC}"
exit 0
else
exit 1
fi