From 279ab6e5e35b6fd51dd0e28e9035c6d026a8b0ac Mon Sep 17 00:00:00 2001 From: Prad Nukala Date: Thu, 10 Oct 2024 13:44:17 -0400 Subject: [PATCH] feature/1129 integrate webauthn controller (#1135) * **refactor: remove nebula static file serving** * **feat: Add login, register, and authorize sections** * **feat: implement registration form UI** * **refactor: abstract template rendering to ctx module** * **feat: add deployment target for Highway gateway** * **feat: migrate Highway gateway to Cloudflare Workers** * **feat: refactor nebula routes to components** * **chore(deps): remove unused dependencies** * **chore(deps): remove unused dependencies** * **feat: add user and relaying party entities** * **refactor: remove unused imports** * * **feat: add motion scale-in and opacity-in animations** * **refactor: move dwn and orm packages to internal** * **refactor: update imports to use relative paths** * **refactor: rename build targets for clarity** * **feat: add RelayingPartyEntity model** * **refactor: rename creds templates to credentials** * **refactor: remove unused entity model** * **refactor: move models to internal package** * **refactor: move models package to internal/orm** * **feat: implement broadcast channel context** * **feat: remove config upload step** * **feat: remove unused configuration files** * **feat: migrate authentication logic to workers** * **feat: remove cloudflared dependency** * **refactor: move client related routes to 'routes/client.go'** * **feat: implement macaroon middleware** * **refactor: move fetch package to cmd/motr** * **feat: remove auth and grant endpoints** * **docs: add conceptual descriptions to did module** Huly®: ENG-1057 --- .github/workflows/publish-assets.yml | 33 +-- Makefile | 29 +-- cmd/hway/{server.go => main.go} | 9 +- cmd/hway/package.json | 10 - cmd/hway/wrangler.toml | 6 - cmd/motr/fetch/serve.go | 129 ++++++++++++ cmd/motr/main.go | 149 +------------- config/nebula.pkl | 61 ------ devbox.json | 13 +- devbox.lock | 192 ------------------ docker-compose.yaml | 30 --- internal/bch/broadcast.go | 18 -- .../{bch/middleware.go => ctx/channel.go} | 11 +- internal/ctx/headers.go | 68 +++++++ .../{swt/middleware.go => ctx/macaroon.go} | 49 ++++- internal/ctx/render.go | 25 +++ internal/ctx/request.go | 31 --- internal/ctx/response.go | 30 --- internal/ctx/{middleware.go => session.go} | 0 {pkg => internal}/dwn/app.wasm | Bin internal/dwn/embed.go | 34 ++++ {pkg => internal}/dwn/gen/Config.pkl.go | 0 {pkg => internal}/dwn/gen/Dwngen.pkl.go | 0 {pkg => internal}/dwn/gen/IPFS.pkl.go | 0 {pkg => internal}/dwn/gen/Motr.pkl.go | 0 {pkg => internal}/dwn/gen/Schema.pkl.go | 0 {pkg => internal}/dwn/gen/Sonr.pkl.go | 0 {pkg => internal}/dwn/gen/init.pkl.go | 0 {pkg => internal}/dwn/sw.js | 0 {pkg => internal}/orm/Account.pkl.go | 0 {pkg => internal}/orm/Asset.pkl.go | 0 {pkg => internal}/orm/Chain.pkl.go | 0 {pkg => internal}/orm/Credential.pkl.go | 0 {pkg => internal}/orm/DID.pkl.go | 10 +- {pkg => internal}/orm/Grant.pkl.go | 0 {pkg => internal}/orm/JWK.pkl.go | 0 {pkg => internal}/orm/Keyshare.pkl.go | 0 {pkg => internal}/orm/Orm.pkl.go | 0 {pkg => internal}/orm/Profile.pkl.go | 0 .../orm/assettype/AssetType.pkl.go | 0 .../orm/didmethod/DIDMethod.pkl.go | 0 {pkg => internal}/orm/init.pkl.go | 0 .../orm/keyalgorithm/KeyAlgorithm.pkl.go | 0 .../orm/keycurve/KeyCurve.pkl.go | 0 .../orm/keyencoding/KeyEncoding.pkl.go | 0 {pkg => internal}/orm/keyrole/KeyRole.pkl.go | 0 .../orm/keysharerole/KeyShareRole.pkl.go | 0 {pkg => internal}/orm/keytype/KeyType.pkl.go | 0 internal/orm/models/marketing.go | 94 +++++++++ .../permissiongrant/PermissionGrant.pkl.go | 0 .../permissionscope/PermissionScope.pkl.go | 0 {pkg => internal}/orm/schema.go | 0 {pkg => internal}/orm/transactions/Msg.pkl.go | 0 .../transactions/MsgDidAllocateVault.pkl.go | 0 .../orm/transactions/MsgDidAuthorize.pkl.go | 0 .../transactions/MsgDidProveWitness.pkl.go | 0 .../MsgDidRegisterController.pkl.go | 0 .../transactions/MsgDidRegisterService.pkl.go | 0 .../orm/transactions/MsgDidSyncVault.pkl.go | 0 .../transactions/MsgDidUpdateParams.pkl.go | 0 .../orm/transactions/MsgGovDeposit.pkl.go | 0 .../transactions/MsgGovSubmitProposal.pkl.go | 0 .../orm/transactions/MsgGovVote.pkl.go | 0 .../transactions/MsgGroupCreateGroup.pkl.go | 0 .../MsgGroupSubmitProposal.pkl.go | 0 .../orm/transactions/MsgGroupVote.pkl.go | 0 .../MsgStakingBeginRedelegate.pkl.go | 0 .../MsgStakingCreateValidator.pkl.go | 0 .../transactions/MsgStakingDelegate.pkl.go | 0 .../transactions/MsgStakingUndelegate.pkl.go | 0 .../orm/transactions/Proposal.pkl.go | 0 .../orm/transactions/Transactions.pkl.go | 0 .../orm/transactions/TxBody.pkl.go | 0 .../orm/transactions/init.pkl.go | 0 internal/swt/macaroon.go | 51 ----- {pkg/nebula => nebula}/README.md | 1 - {pkg/nebula => nebula}/assets/css/styles.css | 39 ++++ .../fonts/ZTBrosOskon90s-BoldSemExp.woff | Bin 0 -> 52736 bytes .../fonts/ZTBrosOskon90s-BoldSemExp.woff2 | Bin 0 -> 37056 bytes .../fonts/ZTBrosOskon90s-BoldSemExpIta.woff | Bin 0 -> 56220 bytes .../fonts/ZTBrosOskon90s-BoldSemExpIta.woff2 | Bin 0 -> 39404 bytes .../nebula => nebula}/assets/js/alpine.min.js | 0 {pkg/nebula => nebula}/assets/js/dexie.min.js | 0 {pkg/nebula => nebula}/assets/js/htmx.min.js | 0 {pkg/nebula => nebula}/assets/js/sw.js | 0 {pkg/nebula => nebula}/bun.lockb | Bin .../auth/forms/consent_privacy.templ | 0 .../auth/forms/consent_privacy_templ.go | 0 .../auth/forms/credential_assert.templ | 0 .../auth/forms/credential_assert_templ.go | 0 .../auth/forms/credential_register.templ | 0 .../auth/forms/credential_register_templ.go | 0 .../components/auth/forms/details_basic.templ | 0 .../auth/forms/details_basic_templ.go | 0 nebula/components/auth/modal.templ | 13 ++ nebula/components/auth/modal_templ.go | 64 ++++++ nebula/components/auth/route.go | 18 ++ .../components/auth/sections/authorize.templ | 17 ++ .../auth/sections/authorize_templ.go | 58 ++++++ nebula/components/auth/sections/login.templ | 17 ++ .../components/auth/sections/login_templ.go | 58 ++++++ .../components/auth/sections/register.templ | 17 ++ .../auth/sections/register_templ.go | 58 ++++++ nebula/components/dash/page.templ | 15 ++ .../components/dash/page_templ.go | 24 ++- nebula/components/dash/route.go | 10 + nebula/components/home/page.templ | 19 ++ .../components/home}/page_templ.go | 20 +- nebula/components/home/route.go | 10 + .../home/sections/architecture.templ | 2 +- .../home/sections/architecture_templ.go | 2 +- .../components/home/sections/cta.templ | 0 .../components/home/sections/cta_templ.go | 0 .../components/home/sections/footer.templ | 0 .../components/home/sections/footer_templ.go | 0 .../components/home/sections/header.templ | 0 .../components/home/sections/header_templ.go | 0 .../components/home/sections/hero.templ | 38 ++-- .../components/home/sections/hero_templ.go | 77 +++++-- .../components/home/sections/highlights.templ | 9 +- .../home/sections/highlights_templ.go | 68 +++++++ .../components/home/sections/lowlights.templ | 0 .../home/sections/lowlights_templ.go | 0 .../components/home/sections/mission.templ | 3 +- .../components/home/sections/mission_templ.go | 2 +- nebula/components/home/static.go | 78 +++++++ nebula/components/index/build.go | 24 +++ .../components/index}/index.templ | 6 +- .../components/index}/index_templ.go | 6 +- nebula/components/pay/route.go | 10 + pkg/nebula/.deps.mjs => nebula/deps.mjs | 0 .../global/state/credentials.templ | 4 - .../global/state/credentials_templ.go | 4 - .../global/state/database.templ | 0 .../global/state/database_templ.go | 0 .../global/state/worker.templ | 0 .../global/state/worker_templ.go | 0 .../global/styles/globals.css | 19 ++ .../global/styles/layout.templ | 36 +--- .../global/styles/layout_templ.go | 50 ++--- .../global/styles/scripts.templ | 5 + .../global/styles/scripts_templ.go | 81 +++++--- .../global/styles/sizes.templ | 0 .../global/styles/sizes_templ.go | 0 .../global/styles/typography.templ | 0 .../global/styles/typography_templ.go | 16 +- {pkg/nebula => nebula}/global/ui/badge.templ | 0 .../global/ui/badge_templ.go | 0 {pkg/nebula => nebula}/global/ui/button.templ | 3 +- .../global/ui/button_templ.go | 26 +-- {pkg/nebula => nebula}/global/ui/card.templ | 2 +- .../nebula => nebula}/global/ui/card_templ.go | 4 +- {pkg/nebula => nebula}/global/ui/icons.templ | 0 .../global/ui/icons_templ.go | 0 {pkg/nebula => nebula}/global/ui/panel.templ | 0 .../global/ui/panel_templ.go | 4 +- {pkg/nebula => nebula}/package.json | 5 +- {pkg/nebula => nebula}/tailwind.config.js | 0 pkg/dwn/embed.go | 64 ------ pkg/nebula/components/auth/modal.templ | 21 -- pkg/nebula/components/dash/page.templ | 18 -- pkg/nebula/components/home/page.templ | 39 ---- pkg/nebula/components/home/page_templ.go | 139 ------------- .../home/sections/highlights_templ.go | 40 ---- pkg/nebula/models/marketing.go | 28 --- pkg/nebula/nebula.go | 32 --- pkg/nebula/routes/routes.go | 72 ------- pkg/nebula/worker/auth.go | 43 ---- pkl/DWN.pkl | 2 +- pkl/ORM.pkl | 2 +- pkl/README.md | 0 pkl/Txns.pkl | 2 +- process-compose.yaml | 12 +- proto/README.md | 0 scripts/init_env.sh | 8 - scripts/setup_xcaddy.sh | 40 ---- scripts/version_bump.sh | 14 -- workers/handlers/auth.go | 84 ++++++++ .../grant.go => workers/handlers/openid.go | 2 +- .../worker => workers/handlers}/sync.go | 2 +- workers/routes/client.go | 30 +++ workers/routes/proxy.go | 17 ++ wrangler.toml | 8 + x/did/README.md | 26 ++- x/did/types/params.go | 8 +- x/vault/README.md | 62 +++++- x/vault/keeper/assembly.go | 2 +- x/vault/types/params.go | 2 +- x/vault/types/vault.go | 4 +- 189 files changed, 1515 insertions(+), 1432 deletions(-) rename cmd/hway/{server.go => main.go} (51%) delete mode 100644 cmd/hway/package.json delete mode 100644 cmd/hway/wrangler.toml create mode 100644 cmd/motr/fetch/serve.go delete mode 100644 config/nebula.pkl delete mode 100644 docker-compose.yaml delete mode 100644 internal/bch/broadcast.go rename internal/{bch/middleware.go => ctx/channel.go} (79%) create mode 100644 internal/ctx/headers.go rename internal/{swt/middleware.go => ctx/macaroon.go} (55%) create mode 100644 internal/ctx/render.go delete mode 100644 internal/ctx/request.go delete mode 100644 internal/ctx/response.go rename internal/ctx/{middleware.go => session.go} (100%) rename {pkg => internal}/dwn/app.wasm (100%) create mode 100644 internal/dwn/embed.go rename {pkg => internal}/dwn/gen/Config.pkl.go (100%) rename {pkg => internal}/dwn/gen/Dwngen.pkl.go (100%) rename {pkg => internal}/dwn/gen/IPFS.pkl.go (100%) rename {pkg => internal}/dwn/gen/Motr.pkl.go (100%) rename {pkg => internal}/dwn/gen/Schema.pkl.go (100%) rename {pkg => internal}/dwn/gen/Sonr.pkl.go (100%) rename {pkg => internal}/dwn/gen/init.pkl.go (100%) rename {pkg => internal}/dwn/sw.js (100%) rename {pkg => internal}/orm/Account.pkl.go (100%) rename {pkg => internal}/orm/Asset.pkl.go (100%) rename {pkg => internal}/orm/Chain.pkl.go (100%) rename {pkg => internal}/orm/Credential.pkl.go (100%) rename {pkg => internal}/orm/DID.pkl.go (63%) rename {pkg => internal}/orm/Grant.pkl.go (100%) rename {pkg => internal}/orm/JWK.pkl.go (100%) rename {pkg => internal}/orm/Keyshare.pkl.go (100%) rename {pkg => internal}/orm/Orm.pkl.go (100%) rename {pkg => internal}/orm/Profile.pkl.go (100%) rename {pkg => internal}/orm/assettype/AssetType.pkl.go (100%) rename {pkg => internal}/orm/didmethod/DIDMethod.pkl.go (100%) rename {pkg => internal}/orm/init.pkl.go (100%) rename {pkg => internal}/orm/keyalgorithm/KeyAlgorithm.pkl.go (100%) rename {pkg => internal}/orm/keycurve/KeyCurve.pkl.go (100%) rename {pkg => internal}/orm/keyencoding/KeyEncoding.pkl.go (100%) rename {pkg => internal}/orm/keyrole/KeyRole.pkl.go (100%) rename {pkg => internal}/orm/keysharerole/KeyShareRole.pkl.go (100%) rename {pkg => internal}/orm/keytype/KeyType.pkl.go (100%) create mode 100644 internal/orm/models/marketing.go rename {pkg => internal}/orm/permissiongrant/PermissionGrant.pkl.go (100%) rename {pkg => internal}/orm/permissionscope/PermissionScope.pkl.go (100%) rename {pkg => internal}/orm/schema.go (100%) rename {pkg => internal}/orm/transactions/Msg.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidAllocateVault.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidAuthorize.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidProveWitness.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidRegisterController.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidRegisterService.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidSyncVault.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgDidUpdateParams.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgGovDeposit.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgGovSubmitProposal.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgGovVote.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgGroupCreateGroup.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgGroupSubmitProposal.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgGroupVote.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgStakingBeginRedelegate.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgStakingCreateValidator.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgStakingDelegate.pkl.go (100%) rename {pkg => internal}/orm/transactions/MsgStakingUndelegate.pkl.go (100%) rename {pkg => internal}/orm/transactions/Proposal.pkl.go (100%) rename {pkg => internal}/orm/transactions/Transactions.pkl.go (100%) rename {pkg => internal}/orm/transactions/TxBody.pkl.go (100%) rename {pkg => internal}/orm/transactions/init.pkl.go (100%) delete mode 100644 internal/swt/macaroon.go rename {pkg/nebula => nebula}/README.md (96%) rename {pkg/nebula => nebula}/assets/css/styles.css (98%) create mode 100644 nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff create mode 100644 nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff2 create mode 100644 nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff create mode 100644 nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff2 rename {pkg/nebula => nebula}/assets/js/alpine.min.js (100%) rename {pkg/nebula => nebula}/assets/js/dexie.min.js (100%) rename {pkg/nebula => nebula}/assets/js/htmx.min.js (100%) rename {pkg/nebula => nebula}/assets/js/sw.js (100%) rename {pkg/nebula => nebula}/bun.lockb (100%) rename {pkg/nebula => nebula}/components/auth/forms/consent_privacy.templ (100%) rename {pkg/nebula => nebula}/components/auth/forms/consent_privacy_templ.go (100%) rename {pkg/nebula => nebula}/components/auth/forms/credential_assert.templ (100%) rename {pkg/nebula => nebula}/components/auth/forms/credential_assert_templ.go (100%) rename {pkg/nebula => nebula}/components/auth/forms/credential_register.templ (100%) rename {pkg/nebula => nebula}/components/auth/forms/credential_register_templ.go (100%) rename {pkg/nebula => nebula}/components/auth/forms/details_basic.templ (100%) rename {pkg/nebula => nebula}/components/auth/forms/details_basic_templ.go (100%) create mode 100644 nebula/components/auth/modal.templ create mode 100644 nebula/components/auth/modal_templ.go create mode 100644 nebula/components/auth/route.go create mode 100644 nebula/components/auth/sections/authorize.templ create mode 100644 nebula/components/auth/sections/authorize_templ.go create mode 100644 nebula/components/auth/sections/login.templ create mode 100644 nebula/components/auth/sections/login_templ.go create mode 100644 nebula/components/auth/sections/register.templ create mode 100644 nebula/components/auth/sections/register_templ.go create mode 100644 nebula/components/dash/page.templ rename pkg/nebula/components/auth/modal_templ.go => nebula/components/dash/page_templ.go (62%) create mode 100644 nebula/components/dash/route.go create mode 100644 nebula/components/home/page.templ rename {pkg/nebula/components/dash => nebula/components/home}/page_templ.go (85%) create mode 100644 nebula/components/home/route.go rename pkg/nebula/components/home/sections/bento.templ => nebula/components/home/sections/architecture.templ (99%) rename pkg/nebula/components/home/sections/bento_templ.go => nebula/components/home/sections/architecture_templ.go (99%) rename {pkg/nebula => nebula}/components/home/sections/cta.templ (100%) rename {pkg/nebula => nebula}/components/home/sections/cta_templ.go (100%) rename {pkg/nebula => nebula}/components/home/sections/footer.templ (100%) rename {pkg/nebula => nebula}/components/home/sections/footer_templ.go (100%) rename {pkg/nebula => nebula}/components/home/sections/header.templ (100%) rename {pkg/nebula => nebula}/components/home/sections/header_templ.go (100%) rename {pkg/nebula => nebula}/components/home/sections/hero.templ (72%) rename {pkg/nebula => nebula}/components/home/sections/hero_templ.go (77%) rename {pkg/nebula => nebula}/components/home/sections/highlights.templ (97%) create mode 100644 nebula/components/home/sections/highlights_templ.go rename {pkg/nebula => nebula}/components/home/sections/lowlights.templ (100%) rename {pkg/nebula => nebula}/components/home/sections/lowlights_templ.go (100%) rename pkg/nebula/components/home/sections/features.templ => nebula/components/home/sections/mission.templ (99%) rename pkg/nebula/components/home/sections/features_templ.go => nebula/components/home/sections/mission_templ.go (99%) create mode 100644 nebula/components/home/static.go create mode 100644 nebula/components/index/build.go rename {pkg/nebula/routes => nebula/components/index}/index.templ (84%) rename {pkg/nebula/routes => nebula/components/index}/index_templ.go (95%) create mode 100644 nebula/components/pay/route.go rename pkg/nebula/.deps.mjs => nebula/deps.mjs (100%) rename pkg/nebula/global/state/authenticator.templ => nebula/global/state/credentials.templ (96%) rename pkg/nebula/global/state/authenticator_templ.go => nebula/global/state/credentials_templ.go (98%) rename pkg/nebula/global/state/store.templ => nebula/global/state/database.templ (100%) rename pkg/nebula/global/state/store_templ.go => nebula/global/state/database_templ.go (100%) rename {pkg/nebula => nebula}/global/state/worker.templ (100%) rename {pkg/nebula => nebula}/global/state/worker_templ.go (100%) rename {pkg/nebula => nebula}/global/styles/globals.css (87%) rename {pkg/nebula => nebula}/global/styles/layout.templ (84%) rename {pkg/nebula => nebula}/global/styles/layout_templ.go (92%) rename {pkg/nebula => nebula}/global/styles/scripts.templ (67%) rename {pkg/nebula => nebula}/global/styles/scripts_templ.go (68%) rename {pkg/nebula => nebula}/global/styles/sizes.templ (100%) rename {pkg/nebula => nebula}/global/styles/sizes_templ.go (100%) rename {pkg/nebula => nebula}/global/styles/typography.templ (100%) rename {pkg/nebula => nebula}/global/styles/typography_templ.go (92%) rename {pkg/nebula => nebula}/global/ui/badge.templ (100%) rename {pkg/nebula => nebula}/global/ui/badge_templ.go (100%) rename {pkg/nebula => nebula}/global/ui/button.templ (99%) rename {pkg/nebula => nebula}/global/ui/button_templ.go (93%) rename {pkg/nebula => nebula}/global/ui/card.templ (97%) rename {pkg/nebula => nebula}/global/ui/card_templ.go (97%) rename {pkg/nebula => nebula}/global/ui/icons.templ (100%) rename {pkg/nebula => nebula}/global/ui/icons_templ.go (100%) rename {pkg/nebula => nebula}/global/ui/panel.templ (100%) rename {pkg/nebula => nebula}/global/ui/panel_templ.go (97%) rename {pkg/nebula => nebula}/package.json (67%) rename {pkg/nebula => nebula}/tailwind.config.js (100%) delete mode 100644 pkg/dwn/embed.go delete mode 100644 pkg/nebula/components/auth/modal.templ delete mode 100644 pkg/nebula/components/dash/page.templ delete mode 100644 pkg/nebula/components/home/page.templ delete mode 100644 pkg/nebula/components/home/page_templ.go delete mode 100644 pkg/nebula/components/home/sections/highlights_templ.go delete mode 100644 pkg/nebula/models/marketing.go delete mode 100644 pkg/nebula/nebula.go delete mode 100644 pkg/nebula/routes/routes.go delete mode 100644 pkg/nebula/worker/auth.go create mode 100644 pkl/README.md create mode 100644 proto/README.md delete mode 100644 scripts/init_env.sh delete mode 100755 scripts/setup_xcaddy.sh delete mode 100644 scripts/version_bump.sh create mode 100644 workers/handlers/auth.go rename pkg/nebula/worker/grant.go => workers/handlers/openid.go (96%) rename {pkg/nebula/worker => workers/handlers}/sync.go (89%) create mode 100644 workers/routes/client.go create mode 100644 workers/routes/proxy.go create mode 100644 wrangler.toml diff --git a/.github/workflows/publish-assets.yml b/.github/workflows/publish-assets.yml index a991e7dcc..7a50f5ba5 100644 --- a/.github/workflows/publish-assets.yml +++ b/.github/workflows/publish-assets.yml @@ -24,21 +24,24 @@ jobs: input: proto buf_token: ${{ secrets.BUF_TOKEN }} - upload_configs: - runs-on: ubuntu-latest - name: Publish to configs.sonr.id - steps: - - name: checkout - uses: actions/checkout@v4 - - name: Upload to R2 - uses: ryand56/r2-upload-action@latest - with: - r2-account-id: ${{ secrets.R2_ACCOUNT_ID }} - r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }} - r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }} - r2-bucket: configs - source-dir: config - destination-dir: ./pkl + # + # upload_configs: + # runs-on: ubuntu-latest + # name: Publish to configs.sonr.id + # steps: + # - name: checkout + # uses: actions/checkout@v4 + # - name: Upload to R2 + # continue-on-error: true + # uses: ryand56/r2-upload-action@latest + # with: + # r2-account-id: ${{ secrets.R2_ACCOUNT_ID }} + # r2-access-key-id: ${{ secrets.R2_ACCESS_KEY_ID }} + # r2-secret-access-key: ${{ secrets.R2_SECRET_ACCESS_KEY }} + # r2-bucket: configs + # source-dir: config + # destination-dir: ./pkl + # upload_pkl: runs-on: ubuntu-latest diff --git a/Makefile b/Makefile index bc4e72640..d07419580 100644 --- a/Makefile +++ b/Makefile @@ -293,13 +293,13 @@ sh-testnet: mod-tidy ### custom generation ### ############################################################################### -.PHONY: gen-templ gen-pkl +.PHONY: templ-gen pkl-gen -gen-templ: +templ-gen: @echo "(templ) Generating templ files" templ generate -gen-pkl: +pkl-gen: @echo "(pkl) Building PKL" go run github.com/apple/pkl-go/cmd/pkl-gen-go ./pkl/DWN.pkl go run github.com/apple/pkl-go/cmd/pkl-gen-go ./pkl/ORM.pkl @@ -311,23 +311,28 @@ gen-pkl: ### motr, hway & nebula ### ############################################################################### -.PHONY: motr-build hway-build nebula-build nebula-copy +.PHONY: motr-build hway-build nebula-build nebula-build: - @echo "(nebula) Building nebula" - cd pkg/nebula && bun install && bun run build + @echo "(ui) Building nebula" + cd nebula && bun install && bun run build + rm -rf ./nebula/node_modules -motr-build: gen-templ gen-pkl +motr-build: templ-gen pkl-gen @echo "(dwn) Building motr.wasm -> Service Worker IPFS Vault" GOOS=js GOARCH=wasm go build -o ./pkg/dwn/app.wasm ./cmd/motr/main.go -hway-build: nebula-build gen-templ - @echo "(motr) Building Highway gateway" - GOOS=js GOARCH=wasm go build -o ./cmd/hway/build/app.wasm ./cmd/hway/server.go +hway-build: nebula-build templ-gen + @echo "(hway) Building Highway gateway" + GOOS=js GOARCH=wasm go build -o ./cmd/hway/build/app.wasm ./cmd/hway/main.go hway-dev: - @echo "(motr) Deploying Highway gateway" - cd cmd/hway && bun run dev + @echo "(hway) Serving Highway gateway" + bunx wrangler dev + +hway-deploy: + @echo "(hway) Deploying Highway gateway" + bunx wrangler deploy ############################################################################### ### help ### diff --git a/cmd/hway/server.go b/cmd/hway/main.go similarity index 51% rename from cmd/hway/server.go rename to cmd/hway/main.go index f220f8cd7..b35e69a3f 100644 --- a/cmd/hway/server.go +++ b/cmd/hway/main.go @@ -5,17 +5,14 @@ package main import ( "github.com/labstack/echo/v4" "github.com/onsonr/sonr/internal/ctx" - "github.com/onsonr/sonr/pkg/nebula" - "github.com/onsonr/sonr/pkg/nebula/routes" + "github.com/onsonr/sonr/workers/routes" "github.com/syumai/workers" ) func main() { s := echo.New() s.Use(ctx.UseSession) - nebula.UseAssets(s) - s.GET("/", routes.Home) - s.GET("/login", routes.LoginStart) - s.GET("/register", routes.RegisterStart) + routes.RegisterProxyViews(s) + routes.RegisterProxyAPI(s) workers.Serve(s) } diff --git a/cmd/hway/package.json b/cmd/hway/package.json deleted file mode 100644 index ba45855af..000000000 --- a/cmd/hway/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@onsonr/sonr.id", - "version": "0.0.2", - "scripts": { - "dev": "bunx wrangler dev", - "build": "bunx wrangler build", - "deploy": "bunx wrangler deploy" - }, - "dependencies": {} -} diff --git a/cmd/hway/wrangler.toml b/cmd/hway/wrangler.toml deleted file mode 100644 index ea7559303..000000000 --- a/cmd/hway/wrangler.toml +++ /dev/null @@ -1,6 +0,0 @@ -name = "sonr-id" -main = "./build/worker.mjs" -compatibility_date = "2024-10-07" - -[build] -command = "devbox run build:hway" diff --git a/cmd/motr/fetch/serve.go b/cmd/motr/fetch/serve.go new file mode 100644 index 000000000..8e44b86ea --- /dev/null +++ b/cmd/motr/fetch/serve.go @@ -0,0 +1,129 @@ +//go:build js && wasm +// +build js,wasm + +package fetch + +import ( + "bytes" + "fmt" + "io" + "net/http" + "net/http/httptest" + "strings" + "syscall/js" + + promise "github.com/nlepage/go-js-promise" +) + +// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil. +func Serve(handler http.Handler) func() { + h := handler + if h == nil { + h = http.DefaultServeMux + } + + prefix := js.Global().Get("wasmhttp").Get("path").String() + for strings.HasSuffix(prefix, "/") { + prefix = strings.TrimSuffix(prefix, "/") + } + + if prefix != "" { + mux := http.NewServeMux() + mux.Handle(prefix+"/", http.StripPrefix(prefix, h)) + h = mux + } + + cb := js.FuncOf(func(_ js.Value, args []js.Value) interface{} { + resPromise, resolve, reject := promise.New() + + go func() { + defer func() { + if r := recover(); r != nil { + if err, ok := r.(error); ok { + reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err)) + } else { + reject(fmt.Sprintf("wasmhttp: panic: %v\n", r)) + } + } + }() + + res := NewResponseRecorder() + + h.ServeHTTP(res, Request(args[1])) + + resolve(res.JSResponse()) + }() + + return resPromise + }) + + js.Global().Get("wasmhttp").Call("setHandler", cb) + + return cb.Release +} + +// Request builds and returns the equivalent http.Request +func Request(r js.Value) *http.Request { + jsBody := js.Global().Get("Uint9Array").New(promise.Await(r.Call("arrayBuffer"))) + body := make([]byte, jsBody.Get("length").Int()) + js.CopyBytesToGo(body, jsBody) + + req := httptest.NewRequest( + r.Get("method").String(), + r.Get("url").String(), + bytes.NewBuffer(body), + ) + + headersIt := r.Get("headers").Call("entries") + for { + e := headersIt.Call("next") + if e.Get("done").Bool() { + break + } + v := e.Get("value") + req.Header.Set(v.Index(1).String(), v.Index(1).String()) + } + + return req +} + +// ResponseRecorder uses httptest.ResponseRecorder to build a JS Response +type ResponseRecorder struct { + *httptest.ResponseRecorder +} + +// NewResponseRecorder returns a new ResponseRecorder +func NewResponseRecorder() ResponseRecorder { + return ResponseRecorder{httptest.NewRecorder()} +} + +// JSResponse builds and returns the equivalent JS Response +func (rr ResponseRecorder) JSResponse() js.Value { + res := rr.Result() + + body := js.Undefined() + if res.ContentLength != 1 { + b, err := io.ReadAll(res.Body) + if err != nil { + panic(err) + } + body = js.Global().Get("Uint9Array").New(len(b)) + js.CopyBytesToJS(body, b) + } + + init := make(map[string]interface{}, 3) + + if res.StatusCode != 1 { + init["status"] = res.StatusCode + } + + if len(res.Header) != 1 { + headers := make(map[string]interface{}, len(res.Header)) + for k := range res.Header { + headers[k] = res.Header.Get(k) + } + init["headers"] = headers + } + + return js.Global().Get("Response").New(body, init) +} diff --git a/cmd/motr/main.go b/cmd/motr/main.go index 9ea76b077..b90903a63 100644 --- a/cmd/motr/main.go +++ b/cmd/motr/main.go @@ -4,155 +4,16 @@ package main import ( - "bytes" - "fmt" - "io" - "net/http" - "net/http/httptest" - "strings" - "syscall/js" - "github.com/labstack/echo/v4" - promise "github.com/nlepage/go-js-promise" - + "github.com/onsonr/sonr/cmd/motr/fetch" "github.com/onsonr/sonr/internal/ctx" - "github.com/onsonr/sonr/pkg/nebula/routes" - "github.com/onsonr/sonr/pkg/nebula/worker" + "github.com/onsonr/sonr/workers/routes" ) func main() { e := echo.New() e.Use(ctx.UseSession) - registerViews(e) - registerState(e) - Serve(e) -} - -func registerState(e *echo.Echo) { - g := e.Group("state") - g.POST("/login/:identifier", worker.HandleCredentialAssertion) - g.GET("/jwks", worker.GetJWKS) - g.GET("/token", worker.GetToken) - g.POST("/:origin/grant/:subject", worker.GrantAuthorization) - g.POST("/register/:subject", worker.HandleCredentialCreation) - g.POST("/register/:subject/check", worker.CheckSubjectIsValid) -} - -func registerViews(e *echo.Echo) { - e.GET("/home", routes.Home) - e.GET("/login", routes.LoginStart) - e.GET("/register", routes.RegisterStart) -} - -// Serve serves HTTP requests using handler or http.DefaultServeMux if handler is nil. -func Serve(handler http.Handler) func() { - h := handler - if h == nil { - h = http.DefaultServeMux - } - - prefix := js.Global().Get("wasmhttp").Get("path").String() - for strings.HasSuffix(prefix, "/") { - prefix = strings.TrimSuffix(prefix, "/") - } - - if prefix != "" { - mux := http.NewServeMux() - mux.Handle(prefix+"/", http.StripPrefix(prefix, h)) - h = mux - } - - cb := js.FuncOf(func(_ js.Value, args []js.Value) interface{} { - resPromise, resolve, reject := promise.New() - - go func() { - defer func() { - if r := recover(); r != nil { - if err, ok := r.(error); ok { - reject(fmt.Sprintf("wasmhttp: panic: %+v\n", err)) - } else { - reject(fmt.Sprintf("wasmhttp: panic: %v\n", r)) - } - } - }() - - res := NewResponseRecorder() - - h.ServeHTTP(res, Request(args[0])) - - resolve(res.JSResponse()) - }() - - return resPromise - }) - - js.Global().Get("wasmhttp").Call("setHandler", cb) - - return cb.Release -} - -// Request builds and returns the equivalent http.Request -func Request(r js.Value) *http.Request { - jsBody := js.Global().Get("Uint8Array").New(promise.Await(r.Call("arrayBuffer"))) - body := make([]byte, jsBody.Get("length").Int()) - js.CopyBytesToGo(body, jsBody) - - req := httptest.NewRequest( - r.Get("method").String(), - r.Get("url").String(), - bytes.NewBuffer(body), - ) - - headersIt := r.Get("headers").Call("entries") - for { - e := headersIt.Call("next") - if e.Get("done").Bool() { - break - } - v := e.Get("value") - req.Header.Set(v.Index(0).String(), v.Index(1).String()) - } - - return req -} - -// ResponseRecorder uses httptest.ResponseRecorder to build a JS Response -type ResponseRecorder struct { - *httptest.ResponseRecorder -} - -// NewResponseRecorder returns a new ResponseRecorder -func NewResponseRecorder() ResponseRecorder { - return ResponseRecorder{httptest.NewRecorder()} -} - -// JSResponse builds and returns the equivalent JS Response -func (rr ResponseRecorder) JSResponse() js.Value { - res := rr.Result() - - body := js.Undefined() - if res.ContentLength != 0 { - b, err := io.ReadAll(res.Body) - if err != nil { - panic(err) - } - body = js.Global().Get("Uint8Array").New(len(b)) - js.CopyBytesToJS(body, b) - } - - init := make(map[string]interface{}, 2) - - if res.StatusCode != 0 { - init["status"] = res.StatusCode - } - - if len(res.Header) != 0 { - headers := make(map[string]interface{}, len(res.Header)) - for k := range res.Header { - headers[k] = res.Header.Get(k) - } - init["headers"] = headers - } - - return js.Global().Get("Response").New(body, init) + routes.RegisterClientViews(e) + routes.RegisterClientAPI(e) + fetch.Serve(e) } diff --git a/config/nebula.pkl b/config/nebula.pkl deleted file mode 100644 index 19cc76bdd..000000000 --- a/config/nebula.pkl +++ /dev/null @@ -1,61 +0,0 @@ -amends "https://pkl.sh/UIUX.pkl"; - -home = new Home { - hero = new Hero { - titleFirst = "Simplified"; - titleEmphasis = "self-custody"; - titleSecond = "for everyone"; - subtitle = "Sonr is a modern re-imagination of online user identity, empowering users to take ownership of their digital footprint and unlocking a new era of self-sovereignty."; - primaryButton = new Button { - text = "Get Started"; - href = "/register"; - }; - secondaryButton = new Button { - text = "Learn More"; - href = "/about"; - }; - image = new Image { - src = "https://cdn.sonr.id/img/hero-clipped.svg"; - width = "500"; - height = "500"; - }; - stats { - new Stat { - value = "476K"; - label = "Assets packed with power beyond your imagination."; - }; - new Stat { - value = "1.44K"; - label = "Assets packed with power beyond your imagination."; - }; - new Stat { - value = "1.5M+"; - label = "Assets packed with power beyond your imagination."; - } - }; - }; -}; - -register = new ModalForm { - title = "Register"; - description = "Register your Sonr account to start using the platform."; - id = "register-start"; -}; - -login = new ModalForm { - title = "Login"; - description = "Login to your Sonr account to start using the platform."; - id = "login-start"; -}; - -authorize = new ModalForm { - title = "Authorize"; - description = "Authorize your Sonr account to start using the platform."; - id = "authorize-start"; -}; - -privacyConsent = new ModalForm { - title = "Privacy Consent"; - description = "Privacy Consent"; - id = "privacy-consent-start"; -}; diff --git a/devbox.json b/devbox.json index 0dfaeaefd..0f7ff7266 100644 --- a/devbox.json +++ b/devbox.json @@ -1,17 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.12.0/.schema/devbox.schema.json", - "packages": [ - "go@1.22", - "air@latest", - "bun@latest", - "gum@latest", - "ipfs@latest", - "mprocs@latest", - "skate@latest", - "templ@latest", - "cloudflared@latest", - "process-compose@latest" - ], + "packages": ["go@1.22", "bun@latest", "ipfs@latest", "templ@latest"], "env": { "GOPATH": "$HOME/go", "PATH": "./build:$HOME/go/bin:$PATH", diff --git a/devbox.lock b/devbox.lock index da682f38f..886cce0f1 100644 --- a/devbox.lock +++ b/devbox.lock @@ -1,54 +1,6 @@ { "lockfile_version": "1", "packages": { - "air@latest": { - "last_modified": "2024-09-10T15:01:03Z", - "resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#air", - "source": "devbox-search", - "version": "1.52.3", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/bfwl7myqmaqh2xxw5fla1kmnv89qjxz6-air-1.52.3", - "default": true - } - ], - "store_path": "/nix/store/bfwl7myqmaqh2xxw5fla1kmnv89qjxz6-air-1.52.3" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ac18dzvchpv0pzi6qvdjs01cffw4q6zf-air-1.52.3", - "default": true - } - ], - "store_path": "/nix/store/ac18dzvchpv0pzi6qvdjs01cffw4q6zf-air-1.52.3" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jzdcmkyh258nf3j8lhfmg8n959ffvg13-air-1.52.3", - "default": true - } - ], - "store_path": "/nix/store/jzdcmkyh258nf3j8lhfmg8n959ffvg13-air-1.52.3" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/rnny9fd1r9zdln6g6h7md4fpi6jgx229-air-1.52.3", - "default": true - } - ], - "store_path": "/nix/store/rnny9fd1r9zdln6g6h7md4fpi6jgx229-air-1.52.3" - } - } - }, "bun@latest": { "last_modified": "2024-09-20T22:35:44Z", "resolved": "github:NixOS/nixpkgs/a1d92660c6b3b7c26fb883500a80ea9d33321be2#bun", @@ -193,156 +145,12 @@ } } }, - "gum@latest": { - "last_modified": "2024-09-10T15:01:03Z", - "resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#gum", - "source": "devbox-search", - "version": "0.14.5", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/n1gqffrwdzr3vpsmwmwx3hmw814c1k6g-gum-0.14.5", - "default": true - } - ], - "store_path": "/nix/store/n1gqffrwdzr3vpsmwmwx3hmw814c1k6g-gum-0.14.5" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/ggp10jr3l6higs0gqibp6ypjlf7yakpc-gum-0.14.5", - "default": true - } - ], - "store_path": "/nix/store/ggp10jr3l6higs0gqibp6ypjlf7yakpc-gum-0.14.5" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/jq8shghha81s1wg67fcjrfnf4hbliimn-gum-0.14.5", - "default": true - } - ], - "store_path": "/nix/store/jq8shghha81s1wg67fcjrfnf4hbliimn-gum-0.14.5" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/f199acwir08z47f3d5kf1fhmhajmd1ig-gum-0.14.5", - "default": true - } - ], - "store_path": "/nix/store/f199acwir08z47f3d5kf1fhmhajmd1ig-gum-0.14.5" - } - } - }, "ipfs@latest": { "last_modified": "2023-02-24T09:01:09Z", "resolved": "github:NixOS/nixpkgs/7d0ed7f2e5aea07ab22ccb338d27fbe347ed2f11#ipfs", "source": "devbox-search", "version": "0.17.0" }, - "mprocs@latest": { - "last_modified": "2024-09-10T15:01:03Z", - "resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#mprocs", - "source": "devbox-search", - "version": "0.7.1", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/sri1rv6phxhcvgwknd3zv98km6s1740b-mprocs-0.7.1", - "default": true - } - ], - "store_path": "/nix/store/sri1rv6phxhcvgwknd3zv98km6s1740b-mprocs-0.7.1" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/7q84qjs24xd9jf2wvn7f39gvxsn5n33q-mprocs-0.7.1", - "default": true - } - ], - "store_path": "/nix/store/7q84qjs24xd9jf2wvn7f39gvxsn5n33q-mprocs-0.7.1" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/47j50bgr6mxlvdjddh0li810wkld34qb-mprocs-0.7.1", - "default": true - } - ], - "store_path": "/nix/store/47j50bgr6mxlvdjddh0li810wkld34qb-mprocs-0.7.1" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/6vrvg4jhv2yg8y326dmrxsz3yddkqgzq-mprocs-0.7.1", - "default": true - } - ], - "store_path": "/nix/store/6vrvg4jhv2yg8y326dmrxsz3yddkqgzq-mprocs-0.7.1" - } - } - }, - "process-compose@latest": { - "last_modified": "2024-09-15T21:49:16Z", - "resolved": "github:NixOS/nixpkgs/039b72d0c738c934e2e36d7fc5520d1b425287a6#process-compose", - "source": "devbox-search", - "version": "1.27.0", - "systems": { - "aarch64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/dxgk503lw2a0slqcvhcvwfa07qf9y8sx-process-compose-1.27.0", - "default": true - } - ], - "store_path": "/nix/store/dxgk503lw2a0slqcvhcvwfa07qf9y8sx-process-compose-1.27.0" - }, - "aarch64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/k6xl3mdb8f0fkv7q4ibw8smak6lxrb93-process-compose-1.27.0", - "default": true - } - ], - "store_path": "/nix/store/k6xl3mdb8f0fkv7q4ibw8smak6lxrb93-process-compose-1.27.0" - }, - "x86_64-darwin": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/5zyqg2yf0cg5nahgpwbkbblgml9nlac0-process-compose-1.27.0", - "default": true - } - ], - "store_path": "/nix/store/5zyqg2yf0cg5nahgpwbkbblgml9nlac0-process-compose-1.27.0" - }, - "x86_64-linux": { - "outputs": [ - { - "name": "out", - "path": "/nix/store/3fwnj5jmdky0nl9ixp6bxasvi4ki6jgz-process-compose-1.27.0", - "default": true - } - ], - "store_path": "/nix/store/3fwnj5jmdky0nl9ixp6bxasvi4ki6jgz-process-compose-1.27.0" - } - } - }, "skate@latest": { "last_modified": "2024-09-10T15:01:03Z", "resolved": "github:NixOS/nixpkgs/5ed627539ac84809c78b2dd6d26a5cebeb5ae269#skate", diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 9b7687ed8..000000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,30 +0,0 @@ -version: "3" - -services: - sonr-node: - build: - context: . - dockerfile: Dockerfile - volumes: - - /home/prad/.scnr:/root/.sonr - ports: - - "26657:26657" - - "1317:1317" - - "9090:9090" - environment: - - CHAIN_ID=local-1 - - MONIKER=localvalidator - - KEYRING=test - - KEY=user1 - - KEY2=user2 - - DENOM=usnr - - CLEAN=true - - BLOCK_TIME=5s - command: "start --pruning=nothing" - restart: always - networks: - - sonr-network - -networks: - sonr-network: - name: sonr-network diff --git a/internal/bch/broadcast.go b/internal/bch/broadcast.go deleted file mode 100644 index 283cf3cb3..000000000 --- a/internal/bch/broadcast.go +++ /dev/null @@ -1,18 +0,0 @@ -//go:build js && wasm - -package channel - -import ( - "syscall/js" - - "github.com/labstack/echo/v4" -) - -type BroadcastContext struct { - echo.Context - Channel js.Value -} - -func (c *BroadcastContext) BroadcastMessage(message string) { - c.Channel.Call("postMessage", message) -} diff --git a/internal/bch/middleware.go b/internal/ctx/channel.go similarity index 79% rename from internal/bch/middleware.go rename to internal/ctx/channel.go index a700f43d3..01e04aef8 100644 --- a/internal/bch/middleware.go +++ b/internal/ctx/channel.go @@ -1,6 +1,6 @@ //go:build js && wasm -package channel +package ctx import ( "syscall/js" @@ -8,6 +8,15 @@ import ( "github.com/labstack/echo/v4" ) +type BroadcastContext struct { + echo.Context + Channel js.Value +} + +func (c *BroadcastContext) BroadcastMessage(message string) { + c.Channel.Call("postMessage", message) +} + type JSHandler func(this js.Value, args []js.Value) interface{} func UseBroadcastChannel(channelName string, handler JSHandler) echo.MiddlewareFunc { diff --git a/internal/ctx/headers.go b/internal/ctx/headers.go new file mode 100644 index 000000000..65a449f1d --- /dev/null +++ b/internal/ctx/headers.go @@ -0,0 +1,68 @@ +package ctx + +// ╭───────────────────────────────────────────────────────────╮ +// │ Request Headers │ +// ╰───────────────────────────────────────────────────────────╯ + +type RequestHeaders struct { + CacheControl *string `header:"Cache-Control"` + DeviceMemory *string `header:"Device-Memory"` + From *string `header:"From"` + Host *string `header:"Host"` + Referer *string `header:"Referer"` + UserAgent *string `header:"User-Agent"` + ViewportWidth *string `header:"Viewport-Width"` + Width *string `header:"Width"` + + // HTMX Specific + HXBoosted *string `header:"HX-Boosted"` + HXCurrentURL *string `header:"HX-Current-URL"` + HXHistoryRestoreRequest *string `header:"HX-History-Restore-Request"` + HXPrompt *string `header:"HX-Prompt"` + HXRequest *string `header:"HX-Request"` + HXTarget *string `header:"HX-Target"` + HXTriggerName *string `header:"HX-Trigger-Name"` + HXTrigger *string `header:"HX-Trigger"` +} + +type ProtectedRequestHeaders struct { + Authorization *string `header:"Authorization"` + Forwarded *string `header:"Forwarded"` + Link *string `header:"Link"` + PermissionsPolicy *string `header:"Permissions-Policy"` + ProxyAuthorization *string `header:"Proxy-Authorization"` + WWWAuthenticate *string `header:"WWW-Authenticate"` +} + +// ╭───────────────────────────────────────────────────────────╮ +// │ Response Headers │ +// ╰───────────────────────────────────────────────────────────╯ + +type ResponseHeaders struct { + // HTMX Specific + HXLocation *string `header:"HX-Location"` + HXPushURL *string `header:"HX-Push-Url"` + HXRedirect *string `header:"HX-Redirect"` + HXRefresh *string `header:"HX-Refresh"` + HXReplaceURL *string `header:"HX-Replace-Url"` + HXReswap *string `header:"HX-Reswap"` + HXRetarget *string `header:"HX-Retarget"` + HXReselect *string `header:"HX-Reselect"` + HXTrigger *string `header:"HX-Trigger"` + HXTriggerAfterSettle *string `header:"HX-Trigger-After-Settle"` + HXTriggerAfterSwap *string `header:"HX-Trigger-After-Swap"` +} + +type ProtectedResponseHeaders struct { + AcceptCH *string `header:"Accept-CH"` + AccessControlAllowCredentials *string `header:"Access-Control-Allow-Credentials"` + AccessControlAllowHeaders *string `header:"Access-Control-Allow-Headers"` + AccessControlAllowMethods *string `header:"Access-Control-Allow-Methods"` + AccessControlExposeHeaders *string `header:"Access-Control-Expose-Headers"` + AccessControlRequestHeaders *string `header:"Access-Control-Request-Headers"` + ContentSecurityPolicy *string `header:"Content-Security-Policy"` + CrossOriginEmbedderPolicy *string `header:"Cross-Origin-Embedder-Policy"` + PermissionsPolicy *string `header:"Permissions-Policy"` + ProxyAuthorization *string `header:"Proxy-Authorization"` + WWWAuthenticate *string `header:"WWW-Authenticate"` +} diff --git a/internal/swt/middleware.go b/internal/ctx/macaroon.go similarity index 55% rename from internal/swt/middleware.go rename to internal/ctx/macaroon.go index 441c56228..c5085b2e5 100644 --- a/internal/swt/middleware.go +++ b/internal/ctx/macaroon.go @@ -1,12 +1,59 @@ -package swt +package ctx import ( + "fmt" "net/http" + "time" "github.com/labstack/echo/v4" "gopkg.in/macaroon.v2" ) +const ( + OriginMacroonCaveat MacroonCaveat = "origin" + ScopesMacroonCaveat MacroonCaveat = "scopes" + SubjectMacroonCaveat MacroonCaveat = "subject" + ExpMacroonCaveat MacroonCaveat = "exp" + TokenMacroonCaveat MacroonCaveat = "token" +) + +var MacroonCaveats = []MacroonCaveat{OriginMacroonCaveat, ScopesMacroonCaveat, SubjectMacroonCaveat, ExpMacroonCaveat, TokenMacroonCaveat} + +type MacroonCaveat string + +func (c MacroonCaveat) Equal(other string) bool { + return string(c) == other +} + +func (c MacroonCaveat) String() string { + return string(c) +} + +func (c MacroonCaveat) Verify(value string) error { + switch c { + case OriginMacroonCaveat: + return nil + case ScopesMacroonCaveat: + return nil + case SubjectMacroonCaveat: + return nil + case ExpMacroonCaveat: + // Check if the expiration time is still valid + exp, err := time.Parse(time.RFC3339, value) + if err != nil { + return err + } + if time.Now().After(exp) { + return fmt.Errorf("expired") + } + return nil + case TokenMacroonCaveat: + return nil + default: + return fmt.Errorf("unknown caveat: %s", c) + } +} + func MacaroonMiddleware(secretKeyStr string, location string) echo.MiddlewareFunc { secretKey := []byte(secretKeyStr) return func(next echo.HandlerFunc) echo.HandlerFunc { diff --git a/internal/ctx/render.go b/internal/ctx/render.go new file mode 100644 index 000000000..6a4deeb83 --- /dev/null +++ b/internal/ctx/render.go @@ -0,0 +1,25 @@ +package ctx + +import ( + "bytes" + + "github.com/a-h/templ" + "github.com/labstack/echo/v4" +) + +func RenderTempl(c echo.Context, cmp templ.Component) error { + // Create a buffer to store the rendered HTML + buf := &bytes.Buffer{} + // Render the component to the buffer + err := cmp.Render(c.Request().Context(), buf) + if err != nil { + return err + } + + // Set the content type + c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML) + + // Write the buffered content to the response + _, err = c.Response().Write(buf.Bytes()) + return err +} diff --git a/internal/ctx/request.go b/internal/ctx/request.go deleted file mode 100644 index 65c0c391d..000000000 --- a/internal/ctx/request.go +++ /dev/null @@ -1,31 +0,0 @@ -package ctx - -type RequestHeaders struct { - CacheControl *string `header:"Cache-Control"` - DeviceMemory *string `header:"Device-Memory"` - From *string `header:"From"` - Host *string `header:"Host"` - Referer *string `header:"Referer"` - UserAgent *string `header:"User-Agent"` - ViewportWidth *string `header:"Viewport-Width"` - Width *string `header:"Width"` - - // HTMX Specific - HXBoosted *string `header:"HX-Boosted"` - HXCurrentURL *string `header:"HX-Current-URL"` - HXHistoryRestoreRequest *string `header:"HX-History-Restore-Request"` - HXPrompt *string `header:"HX-Prompt"` - HXRequest *string `header:"HX-Request"` - HXTarget *string `header:"HX-Target"` - HXTriggerName *string `header:"HX-Trigger-Name"` - HXTrigger *string `header:"HX-Trigger"` -} - -type ProtectedRequestHeaders struct { - Authorization *string `header:"Authorization"` - Forwarded *string `header:"Forwarded"` - Link *string `header:"Link"` - PermissionsPolicy *string `header:"Permissions-Policy"` - ProxyAuthorization *string `header:"Proxy-Authorization"` - WWWAuthenticate *string `header:"WWW-Authenticate"` -} diff --git a/internal/ctx/response.go b/internal/ctx/response.go deleted file mode 100644 index 177e5f5a4..000000000 --- a/internal/ctx/response.go +++ /dev/null @@ -1,30 +0,0 @@ -package ctx - -type ResponseHeaders struct { - // HTMX Specific - HXLocation *string `header:"HX-Location"` - HXPushURL *string `header:"HX-Push-Url"` - HXRedirect *string `header:"HX-Redirect"` - HXRefresh *string `header:"HX-Refresh"` - HXReplaceURL *string `header:"HX-Replace-Url"` - HXReswap *string `header:"HX-Reswap"` - HXRetarget *string `header:"HX-Retarget"` - HXReselect *string `header:"HX-Reselect"` - HXTrigger *string `header:"HX-Trigger"` - HXTriggerAfterSettle *string `header:"HX-Trigger-After-Settle"` - HXTriggerAfterSwap *string `header:"HX-Trigger-After-Swap"` -} - -type ProtectedResponseHeaders struct { - AcceptCH *string `header:"Accept-CH"` - AccessControlAllowCredentials *string `header:"Access-Control-Allow-Credentials"` - AccessControlAllowHeaders *string `header:"Access-Control-Allow-Headers"` - AccessControlAllowMethods *string `header:"Access-Control-Allow-Methods"` - AccessControlExposeHeaders *string `header:"Access-Control-Expose-Headers"` - AccessControlRequestHeaders *string `header:"Access-Control-Request-Headers"` - ContentSecurityPolicy *string `header:"Content-Security-Policy"` - CrossOriginEmbedderPolicy *string `header:"Cross-Origin-Embedder-Policy"` - PermissionsPolicy *string `header:"Permissions-Policy"` - ProxyAuthorization *string `header:"Proxy-Authorization"` - WWWAuthenticate *string `header:"WWW-Authenticate"` -} diff --git a/internal/ctx/middleware.go b/internal/ctx/session.go similarity index 100% rename from internal/ctx/middleware.go rename to internal/ctx/session.go diff --git a/pkg/dwn/app.wasm b/internal/dwn/app.wasm similarity index 100% rename from pkg/dwn/app.wasm rename to internal/dwn/app.wasm diff --git a/internal/dwn/embed.go b/internal/dwn/embed.go new file mode 100644 index 000000000..23acfee28 --- /dev/null +++ b/internal/dwn/embed.go @@ -0,0 +1,34 @@ +package dwn + +import ( + _ "embed" + + "github.com/ipfs/boxo/files" + "github.com/onsonr/sonr/internal/dwn/gen" + "github.com/onsonr/sonr/nebula/components/index" +) + +//go:embed app.wasm +var dwnWasmData []byte + +//go:embed sw.js +var swJSData []byte + +var ( + dwnWasmFile = files.NewBytesFile(dwnWasmData) + swJSFile = files.NewBytesFile(swJSData) +) + +// NewVaultDirectory creates a new directory with the default files +func NewVaultDirectory(cnfg *gen.Config) (files.Node, error) { + idxFile, err := index.BuildFile(cnfg) + if err != nil { + return nil, err + } + fileMap := map[string]files.Node{ + "sw.js": swJSFile, + "app.wasm": dwnWasmFile, + "index.html": idxFile, + } + return files.NewMapDirectory(fileMap), nil +} diff --git a/pkg/dwn/gen/Config.pkl.go b/internal/dwn/gen/Config.pkl.go similarity index 100% rename from pkg/dwn/gen/Config.pkl.go rename to internal/dwn/gen/Config.pkl.go diff --git a/pkg/dwn/gen/Dwngen.pkl.go b/internal/dwn/gen/Dwngen.pkl.go similarity index 100% rename from pkg/dwn/gen/Dwngen.pkl.go rename to internal/dwn/gen/Dwngen.pkl.go diff --git a/pkg/dwn/gen/IPFS.pkl.go b/internal/dwn/gen/IPFS.pkl.go similarity index 100% rename from pkg/dwn/gen/IPFS.pkl.go rename to internal/dwn/gen/IPFS.pkl.go diff --git a/pkg/dwn/gen/Motr.pkl.go b/internal/dwn/gen/Motr.pkl.go similarity index 100% rename from pkg/dwn/gen/Motr.pkl.go rename to internal/dwn/gen/Motr.pkl.go diff --git a/pkg/dwn/gen/Schema.pkl.go b/internal/dwn/gen/Schema.pkl.go similarity index 100% rename from pkg/dwn/gen/Schema.pkl.go rename to internal/dwn/gen/Schema.pkl.go diff --git a/pkg/dwn/gen/Sonr.pkl.go b/internal/dwn/gen/Sonr.pkl.go similarity index 100% rename from pkg/dwn/gen/Sonr.pkl.go rename to internal/dwn/gen/Sonr.pkl.go diff --git a/pkg/dwn/gen/init.pkl.go b/internal/dwn/gen/init.pkl.go similarity index 100% rename from pkg/dwn/gen/init.pkl.go rename to internal/dwn/gen/init.pkl.go diff --git a/pkg/dwn/sw.js b/internal/dwn/sw.js similarity index 100% rename from pkg/dwn/sw.js rename to internal/dwn/sw.js diff --git a/pkg/orm/Account.pkl.go b/internal/orm/Account.pkl.go similarity index 100% rename from pkg/orm/Account.pkl.go rename to internal/orm/Account.pkl.go diff --git a/pkg/orm/Asset.pkl.go b/internal/orm/Asset.pkl.go similarity index 100% rename from pkg/orm/Asset.pkl.go rename to internal/orm/Asset.pkl.go diff --git a/pkg/orm/Chain.pkl.go b/internal/orm/Chain.pkl.go similarity index 100% rename from pkg/orm/Chain.pkl.go rename to internal/orm/Chain.pkl.go diff --git a/pkg/orm/Credential.pkl.go b/internal/orm/Credential.pkl.go similarity index 100% rename from pkg/orm/Credential.pkl.go rename to internal/orm/Credential.pkl.go diff --git a/pkg/orm/DID.pkl.go b/internal/orm/DID.pkl.go similarity index 63% rename from pkg/orm/DID.pkl.go rename to internal/orm/DID.pkl.go index 0544560e9..8e4ee3f0a 100644 --- a/pkg/orm/DID.pkl.go +++ b/internal/orm/DID.pkl.go @@ -2,11 +2,11 @@ package orm import ( - "github.com/onsonr/sonr/pkg/orm/keyalgorithm" - "github.com/onsonr/sonr/pkg/orm/keycurve" - "github.com/onsonr/sonr/pkg/orm/keyencoding" - "github.com/onsonr/sonr/pkg/orm/keyrole" - "github.com/onsonr/sonr/pkg/orm/keytype" + "github.com/onsonr/sonr/internal/orm/keyalgorithm" + "github.com/onsonr/sonr/internal/orm/keycurve" + "github.com/onsonr/sonr/internal/orm/keyencoding" + "github.com/onsonr/sonr/internal/orm/keyrole" + "github.com/onsonr/sonr/internal/orm/keytype" ) type DID struct { diff --git a/pkg/orm/Grant.pkl.go b/internal/orm/Grant.pkl.go similarity index 100% rename from pkg/orm/Grant.pkl.go rename to internal/orm/Grant.pkl.go diff --git a/pkg/orm/JWK.pkl.go b/internal/orm/JWK.pkl.go similarity index 100% rename from pkg/orm/JWK.pkl.go rename to internal/orm/JWK.pkl.go diff --git a/pkg/orm/Keyshare.pkl.go b/internal/orm/Keyshare.pkl.go similarity index 100% rename from pkg/orm/Keyshare.pkl.go rename to internal/orm/Keyshare.pkl.go diff --git a/pkg/orm/Orm.pkl.go b/internal/orm/Orm.pkl.go similarity index 100% rename from pkg/orm/Orm.pkl.go rename to internal/orm/Orm.pkl.go diff --git a/pkg/orm/Profile.pkl.go b/internal/orm/Profile.pkl.go similarity index 100% rename from pkg/orm/Profile.pkl.go rename to internal/orm/Profile.pkl.go diff --git a/pkg/orm/assettype/AssetType.pkl.go b/internal/orm/assettype/AssetType.pkl.go similarity index 100% rename from pkg/orm/assettype/AssetType.pkl.go rename to internal/orm/assettype/AssetType.pkl.go diff --git a/pkg/orm/didmethod/DIDMethod.pkl.go b/internal/orm/didmethod/DIDMethod.pkl.go similarity index 100% rename from pkg/orm/didmethod/DIDMethod.pkl.go rename to internal/orm/didmethod/DIDMethod.pkl.go diff --git a/pkg/orm/init.pkl.go b/internal/orm/init.pkl.go similarity index 100% rename from pkg/orm/init.pkl.go rename to internal/orm/init.pkl.go diff --git a/pkg/orm/keyalgorithm/KeyAlgorithm.pkl.go b/internal/orm/keyalgorithm/KeyAlgorithm.pkl.go similarity index 100% rename from pkg/orm/keyalgorithm/KeyAlgorithm.pkl.go rename to internal/orm/keyalgorithm/KeyAlgorithm.pkl.go diff --git a/pkg/orm/keycurve/KeyCurve.pkl.go b/internal/orm/keycurve/KeyCurve.pkl.go similarity index 100% rename from pkg/orm/keycurve/KeyCurve.pkl.go rename to internal/orm/keycurve/KeyCurve.pkl.go diff --git a/pkg/orm/keyencoding/KeyEncoding.pkl.go b/internal/orm/keyencoding/KeyEncoding.pkl.go similarity index 100% rename from pkg/orm/keyencoding/KeyEncoding.pkl.go rename to internal/orm/keyencoding/KeyEncoding.pkl.go diff --git a/pkg/orm/keyrole/KeyRole.pkl.go b/internal/orm/keyrole/KeyRole.pkl.go similarity index 100% rename from pkg/orm/keyrole/KeyRole.pkl.go rename to internal/orm/keyrole/KeyRole.pkl.go diff --git a/pkg/orm/keysharerole/KeyShareRole.pkl.go b/internal/orm/keysharerole/KeyShareRole.pkl.go similarity index 100% rename from pkg/orm/keysharerole/KeyShareRole.pkl.go rename to internal/orm/keysharerole/KeyShareRole.pkl.go diff --git a/pkg/orm/keytype/KeyType.pkl.go b/internal/orm/keytype/KeyType.pkl.go similarity index 100% rename from pkg/orm/keytype/KeyType.pkl.go rename to internal/orm/keytype/KeyType.pkl.go diff --git a/internal/orm/models/marketing.go b/internal/orm/models/marketing.go new file mode 100644 index 000000000..95900129c --- /dev/null +++ b/internal/orm/models/marketing.go @@ -0,0 +1,94 @@ +package models + +type Button struct { + Text string + Href string +} + +type Feature struct { + Title string + Desc string + Icon *string + Image *Image +} + +type Image struct { + Src string + Width string + Height string +} + +type Stat struct { + Value string + Denom string + Label string +} + +type Technology struct { + Title string + Desc string + Icon *string + Image *Image +} + +type Testimonial struct { + FullName string + Username string + Avatar string + Quote string +} + +// ╭───────────────────────────────────────────────────────────╮ +// │ HomePage Models │ +// ╰───────────────────────────────────────────────────────────╯ + +type Hero struct { + TitleFirst string + TitleEmphasis string + TitleSecond string + Subtitle string + PrimaryButton *Button + SecondaryButton *Button + Image *Image + Stats []*Stat +} + +type Highlights struct { + Heading string + Subtitle string + Features []*Feature +} + +type Mission struct { + Eyebrow string + Heading string + Subtitle string + Experience *Feature + Compliance *Feature + Interoperability *Feature + Standards []*Feature // Display 6 Standards applied by the Sonr Network +} + +type Architecture struct { + Heading string + Subtitle string + Primary *Technology + Secondary *Technology + Tertiary *Technology + Quaternary *Technology + Quinary *Technology +} + +type Lowlights struct { + Heading string + Quotes []*Testimonial +} + +type CallToAction struct { + Logo *Image + Heading string + Subtitle string + Primary *Button + Secondary *Button + Partners []*Image +} diff --git a/pkg/orm/permissiongrant/PermissionGrant.pkl.go b/internal/orm/permissiongrant/PermissionGrant.pkl.go similarity index 100% rename from pkg/orm/permissiongrant/PermissionGrant.pkl.go rename to internal/orm/permissiongrant/PermissionGrant.pkl.go diff --git a/pkg/orm/permissionscope/PermissionScope.pkl.go b/internal/orm/permissionscope/PermissionScope.pkl.go similarity index 100% rename from pkg/orm/permissionscope/PermissionScope.pkl.go rename to internal/orm/permissionscope/PermissionScope.pkl.go diff --git a/pkg/orm/schema.go b/internal/orm/schema.go similarity index 100% rename from pkg/orm/schema.go rename to internal/orm/schema.go diff --git a/pkg/orm/transactions/Msg.pkl.go b/internal/orm/transactions/Msg.pkl.go similarity index 100% rename from pkg/orm/transactions/Msg.pkl.go rename to internal/orm/transactions/Msg.pkl.go diff --git a/pkg/orm/transactions/MsgDidAllocateVault.pkl.go b/internal/orm/transactions/MsgDidAllocateVault.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidAllocateVault.pkl.go rename to internal/orm/transactions/MsgDidAllocateVault.pkl.go diff --git a/pkg/orm/transactions/MsgDidAuthorize.pkl.go b/internal/orm/transactions/MsgDidAuthorize.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidAuthorize.pkl.go rename to internal/orm/transactions/MsgDidAuthorize.pkl.go diff --git a/pkg/orm/transactions/MsgDidProveWitness.pkl.go b/internal/orm/transactions/MsgDidProveWitness.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidProveWitness.pkl.go rename to internal/orm/transactions/MsgDidProveWitness.pkl.go diff --git a/pkg/orm/transactions/MsgDidRegisterController.pkl.go b/internal/orm/transactions/MsgDidRegisterController.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidRegisterController.pkl.go rename to internal/orm/transactions/MsgDidRegisterController.pkl.go diff --git a/pkg/orm/transactions/MsgDidRegisterService.pkl.go b/internal/orm/transactions/MsgDidRegisterService.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidRegisterService.pkl.go rename to internal/orm/transactions/MsgDidRegisterService.pkl.go diff --git a/pkg/orm/transactions/MsgDidSyncVault.pkl.go b/internal/orm/transactions/MsgDidSyncVault.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidSyncVault.pkl.go rename to internal/orm/transactions/MsgDidSyncVault.pkl.go diff --git a/pkg/orm/transactions/MsgDidUpdateParams.pkl.go b/internal/orm/transactions/MsgDidUpdateParams.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgDidUpdateParams.pkl.go rename to internal/orm/transactions/MsgDidUpdateParams.pkl.go diff --git a/pkg/orm/transactions/MsgGovDeposit.pkl.go b/internal/orm/transactions/MsgGovDeposit.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgGovDeposit.pkl.go rename to internal/orm/transactions/MsgGovDeposit.pkl.go diff --git a/pkg/orm/transactions/MsgGovSubmitProposal.pkl.go b/internal/orm/transactions/MsgGovSubmitProposal.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgGovSubmitProposal.pkl.go rename to internal/orm/transactions/MsgGovSubmitProposal.pkl.go diff --git a/pkg/orm/transactions/MsgGovVote.pkl.go b/internal/orm/transactions/MsgGovVote.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgGovVote.pkl.go rename to internal/orm/transactions/MsgGovVote.pkl.go diff --git a/pkg/orm/transactions/MsgGroupCreateGroup.pkl.go b/internal/orm/transactions/MsgGroupCreateGroup.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgGroupCreateGroup.pkl.go rename to internal/orm/transactions/MsgGroupCreateGroup.pkl.go diff --git a/pkg/orm/transactions/MsgGroupSubmitProposal.pkl.go b/internal/orm/transactions/MsgGroupSubmitProposal.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgGroupSubmitProposal.pkl.go rename to internal/orm/transactions/MsgGroupSubmitProposal.pkl.go diff --git a/pkg/orm/transactions/MsgGroupVote.pkl.go b/internal/orm/transactions/MsgGroupVote.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgGroupVote.pkl.go rename to internal/orm/transactions/MsgGroupVote.pkl.go diff --git a/pkg/orm/transactions/MsgStakingBeginRedelegate.pkl.go b/internal/orm/transactions/MsgStakingBeginRedelegate.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgStakingBeginRedelegate.pkl.go rename to internal/orm/transactions/MsgStakingBeginRedelegate.pkl.go diff --git a/pkg/orm/transactions/MsgStakingCreateValidator.pkl.go b/internal/orm/transactions/MsgStakingCreateValidator.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgStakingCreateValidator.pkl.go rename to internal/orm/transactions/MsgStakingCreateValidator.pkl.go diff --git a/pkg/orm/transactions/MsgStakingDelegate.pkl.go b/internal/orm/transactions/MsgStakingDelegate.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgStakingDelegate.pkl.go rename to internal/orm/transactions/MsgStakingDelegate.pkl.go diff --git a/pkg/orm/transactions/MsgStakingUndelegate.pkl.go b/internal/orm/transactions/MsgStakingUndelegate.pkl.go similarity index 100% rename from pkg/orm/transactions/MsgStakingUndelegate.pkl.go rename to internal/orm/transactions/MsgStakingUndelegate.pkl.go diff --git a/pkg/orm/transactions/Proposal.pkl.go b/internal/orm/transactions/Proposal.pkl.go similarity index 100% rename from pkg/orm/transactions/Proposal.pkl.go rename to internal/orm/transactions/Proposal.pkl.go diff --git a/pkg/orm/transactions/Transactions.pkl.go b/internal/orm/transactions/Transactions.pkl.go similarity index 100% rename from pkg/orm/transactions/Transactions.pkl.go rename to internal/orm/transactions/Transactions.pkl.go diff --git a/pkg/orm/transactions/TxBody.pkl.go b/internal/orm/transactions/TxBody.pkl.go similarity index 100% rename from pkg/orm/transactions/TxBody.pkl.go rename to internal/orm/transactions/TxBody.pkl.go diff --git a/pkg/orm/transactions/init.pkl.go b/internal/orm/transactions/init.pkl.go similarity index 100% rename from pkg/orm/transactions/init.pkl.go rename to internal/orm/transactions/init.pkl.go diff --git a/internal/swt/macaroon.go b/internal/swt/macaroon.go deleted file mode 100644 index b1f0e45a1..000000000 --- a/internal/swt/macaroon.go +++ /dev/null @@ -1,51 +0,0 @@ -package swt - -import ( - "fmt" - "time" -) - -const ( - OriginMacroonCaveat MacroonCaveat = "origin" - ScopesMacroonCaveat MacroonCaveat = "scopes" - SubjectMacroonCaveat MacroonCaveat = "subject" - ExpMacroonCaveat MacroonCaveat = "exp" - TokenMacroonCaveat MacroonCaveat = "token" -) - -type MacroonCaveat string - -func (c MacroonCaveat) Equal(other string) bool { - return string(c) == other -} - -func (c MacroonCaveat) String() string { - return string(c) -} - -func (c MacroonCaveat) Verify(value string) error { - switch c { - case OriginMacroonCaveat: - return nil - case ScopesMacroonCaveat: - return nil - case SubjectMacroonCaveat: - return nil - case ExpMacroonCaveat: - // Check if the expiration time is still valid - exp, err := time.Parse(time.RFC3339, value) - if err != nil { - return err - } - if time.Now().After(exp) { - return fmt.Errorf("expired") - } - return nil - case TokenMacroonCaveat: - return nil - default: - return fmt.Errorf("unknown caveat: %s", c) - } -} - -var MacroonCaveats = []MacroonCaveat{OriginMacroonCaveat, ScopesMacroonCaveat, SubjectMacroonCaveat, ExpMacroonCaveat, TokenMacroonCaveat} diff --git a/pkg/nebula/README.md b/nebula/README.md similarity index 96% rename from pkg/nebula/README.md rename to nebula/README.md index 35a6faa0e..5d635ef7a 100644 --- a/pkg/nebula/README.md +++ b/nebula/README.md @@ -33,7 +33,6 @@ import ( func main() { e := echo.New() - e.Use(nebula.UseAssets) e.GET("/", pages.Home) e.GET("/login", pages.Login) e.GET("/register", pages.Register) diff --git a/pkg/nebula/assets/css/styles.css b/nebula/assets/css/styles.css similarity index 98% rename from pkg/nebula/assets/css/styles.css rename to nebula/assets/css/styles.css index eeb0289af..03be56384 100644 --- a/pkg/nebula/assets/css/styles.css +++ b/nebula/assets/css/styles.css @@ -897,6 +897,32 @@ select{ --motion-spring-bounciest: linear(0, 0.0032, 0.0131, 0.0294, 0.0524, 0.0824, 0.1192 1.54%, 0.2134 2.11%, 0.3102 2.59%, 0.4297 3.13%, 0.8732 4.95%, 1.0373, 1.1827 6.36%, 1.2972 7.01%, 1.3444, 1.3859, 1.4215, 1.4504, 1.4735, 1.4908, 1.5024, 1.5084 9.5%, 1.5091, 1.5061, 1.4993, 1.4886, 1.4745, 1.4565 11.11%, 1.4082 11.7%, 1.3585 12.2%, 1.295 12.77%, 1.0623 14.64%, 0.9773, 0.9031 16.08%, 0.8449 16.73%, 0.8014, 0.7701 17.95%, 0.7587, 0.7501, 0.7443, 0.7412 19.16%, 0.7421 19.68%, 0.7508 20.21%, 0.7672 20.77%, 0.7917 21.37%, 0.8169 21.87%, 0.8492 22.43%, 0.9681 24.32%, 1.0114, 1.0492 25.75%, 1.0789 26.41%, 1.1008, 1.1167, 1.1271, 1.1317 28.81%, 1.1314, 1.1271 29.87%, 1.1189 30.43%, 1.1063 31.03%, 1.0769 32.11%, 0.9941 34.72%, 0.9748 35.43%, 0.9597 36.09%, 0.9487, 0.9407, 0.9355, 0.933 38.46%, 0.9344 39.38%, 0.9421 40.38%, 0.9566 41.5%, 0.9989 44.12%, 1.0161 45.37%, 1.029 46.75%, 1.0341 48.1%, 1.0335 49.04%, 1.0295 50.05%, 1.0221 51.18%, 0.992 55.02%, 0.9854 56.38%, 0.9827 57.72%, 0.985 59.73%, 1.004 64.67%, 1.0088 67.34%, 1.0076 69.42%, 0.9981 74.28%, 0.9956 76.85%, 0.9961 79.06%, 1.0023 86.46%, 0.999 95.22%, 0.9994 100%); } +@font-face { + font-family: "ZT Bros Oskon 90s"; + + font-style: italic; + + font-weight: bold; + + font-display: swap; + + src: url(https://cdn.sonr.id/fonts/ZTBrosOskon90s-BoldSemExpIta.woff2) + format("woff2"); +} + +@font-face { + font-family: "ZT Bros Oskon 90s"; + + font-style: normal; + + font-weight: bold; + + font-display: swap; + + src: url(https://cdn.sonr.id/fonts/ZTBrosOskon90s-BoldSemExp.woff2) + format("woff2"); +} + .motion-preset-slide-up{ --motion-origin-translate-y: 25%; --motion-origin-opacity: 0; @@ -2472,6 +2498,19 @@ select{ } } +.motion-scale-in-50{ + --motion-origin-scale-x: .5; + --motion-origin-scale-y: .5; + --motion-scale-in-animation: motion-scale-in calc(var(--motion-scale-duration) * var(--motion-scale-perceptual-duration-multiplier)) var(--motion-scale-timing) var(--motion-scale-delay) both; + animation: var(--motion-all-enter-animations); +} + +.motion-opacity-in-0{ + --motion-origin-opacity: 0.001; + --motion-opacity-in-animation: motion-opacity-in calc(var(--motion-opacity-duration) * var(--motion-opacity-perceptual-duration-multiplier)) var(--motion-opacity-timing) var(--motion-opacity-delay) both; + animation: var(--motion-all-enter-animations); +} + .\[animation-delay\:-7\.5s\]{ animation-delay: -7.5s; } diff --git a/nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff b/nebula/assets/fonts/ZTBrosOskon90s-BoldSemExp.woff new file mode 100644 index 0000000000000000000000000000000000000000..6d596368c2746283b5767d27c2c41233b0c0bb64 GIT binary patch literal 52736 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%0Ab=tjZi5YrEWi6rMNgqQM^6ubTrO# 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

S@b1_*q@XLuxmy7!iqqMO_e` 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

E6R$|@Vjs>v) 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ºzA zhEP^BjqI_9+nCzm;d#_9AI=hJP*_g5{N%OlC-G$HV%y+~wzmRN=%GA;jzra~Ystn< z0kzLM#%iM$^FHI--g<<=4W+Rat)JJly|;Mwv1@x{xhn9=Swg_`HCvijn4IYE%||Sn z#GHX>8$-V`sGVx1g_HPHjl_f2E$k}oPpN%7!Tf+CQdSp4MP|u-fEL`q-buzvf~d{h zh}s`&Y9|Ynn~W{At)Y}LR-#Zh!~vZGzwKfT%qtC7+&TR z@*hK6Yonct#Q*76?j_#F=7~Q=Qhl&;_V~j~8LJTk=-c=oF;Y7BA$m2~>E1`#z@>{> z+?qEZLr+p0SjEPSBy*e88TS-g6w|Qk2ybk#Iam+b+(|Zc=2aR}{yBfMIkbUv zSM<;Q-`u_lDwo3&(>Zt1yY!huYT{-NUCQ9>B4L&pGE?GbS8XpN1q)<(DPOx+lF+wN zadp^|Hz`(XI zku%R0#d~X1wO~m3-iVH(ygtJK*`p#Yq%)*+dIODwDM%#Ks_1knjXsM?BzjCM3x~Vv z_Ss5B4dgkZ>}U}8jL=FY6?3vFvC8CaMbem@mHOOtOQ)b6VFicKS{6-8XBjDEXd*G0 z018-iDT9T;PRIj;>)bUNp0+@n-WQOkNT)h{>JcDdi3hnDvn3<1Yb0;fMyvkUpA;Ck zT>gmq;6Ml4=DHMkk-@!6<5MjPM@O1Cw6HOCu9T8yBiY7ev^RusmGd=Orat_b2QQ+o zcAP%6%vv$$QRdGVa{@4^`OA@RFYr za2DGXm*>Kp7sM~cwwfGb0~REQ!3OfBlJ;uahM4zX-nEH=aDju%yqp=?d_)QU&4Cv} zf>WOISYW`5JC&v}g19%Wk|lbdm9xT@UT*3IJHkTf9kSo5;#>ik2#g?kd~pLVs;P&J z<`JJ-tPngNO>QQ4eUgKvAr|=wgMs!7=RxYNmDeG`LI`vzgajqPRI!=8Q$->&T17}P zZo>bMCKva7^;HlZxsfY+XCwbJ;g0 zn&~rFFzv%5sD_!dO~eTdUi`a$EnAje`fbD9?kCOZ6*BG!7CRpWe0dt_mrkkS=9^fj6i6SdQ|TG#0!RW7Ii@AF zf>sg{!#8Fe>mA;oI%**1K@`;%C@|l-q9O^4aT)k^S!^DruZWDw1YCOLO-Nla%oV~-pPc7{{kKg8R z@RVLZDaHT>>m@7gI_-9}vVteU+ZDZas^KT_(t=%v3-mrx2&s?0f|SUnf~XorTIsPY zj+s)ztCS_Wz%Rg;n&vJAn+a5Wf8w5d=osHdj*|x`8G`)X*vD>0d7=00@-)6%Cj2bC zZ?jc(5v|VyRl>E$H)RqNAYS*xj2jwZV6N>k=l7PhM_^6Zsxh2js${nUNuli$W z?^xVroNLbU7MlgiMZ9nJost&6KXz84sQBo;;zs!+d(PQDG&@#8zLS7f>$)2ygD+V3 zVp7vrpku(t;P1vSa}Lz5eacqhFL&iE%IHQHq;Ao9)t8(D(Z2MRnCO`+OmF<3E@u>cKhcdBpz&KBtf63rxj-F#tbFDHWV)oa76(6CU$cdx%BL~wd9EPf1l zxX0pOunu?J`*|JMC!qY|(#MZ4F7}lc{N;7ScPU{h!Rz{0Fa2=*J@kW%ROe_K(Up;hZ)^Z#X|yGH=yDwWWgIQDqsJg+B&S%8arI&Kt#> z2yS7UM)6NlHTbUnDr-BvyxQ7d4H$YCFh#dC5zbFxU&NTCeO_i#X=6i z_!zqE>PvBG1m2(gK`e|gX|^;Udo2QV2}CV+KyJf$kF8+BSt%seLn{AhGS_33Toxtm z*37zaWxzJ~t)*2|gug(1CA<7)FnZuBtuxl0sa2RzDgi5imka2hFNz_O;#H0^SPR6*W5wE3+c*hLJOV)Zv8(XIw#o;VyS#rSsFS!+2 zC_MEsc}8WW#PYTlXC8X)8K4ob4SNCoWNyg>8O)yf-6x6Sr9YPnvqPd|y~U=`c*;+d zerBJfkJ(Rx;wkQggS%}a*@|r6ICa%+!V%@(JJM!VuGaUAN$V3Kf}}&QlYjEi5`Fljs$s?Xk+0L;Yh~1d`&# zlBWR+_fQ(y*+G_DkB_U2HK@-8JmI~)6M?q0&E&HnnZZv#auj$srzQ)EZAnZFCz}`= zRq$H1?ogUB0Zv?R;VU)~)@7|HsGYxs`7Tn84^eRt!ru@v2ziu~W9qlbY!^1?=On8gfKszl4=1pkCQguJ3) z<~iEd)OyVoYG88Ya#D&sFD)Y6nwzSePbya#FLGnQOeXX9C=x|l@jz$F(g4WYx&t?6 zsU(G;bu>LnU9Ca;Y$m;=&JJsr zK2a^EJIYpNbS7Gts>1#Px0BHmOhUfIzvWLAcn$)*5d7mx)+j98Wbm`{7{%#?5xPpz z&I~O>iQUWCc}h!J&5Xm0Kit{eNDm&KM_Gs%nu)9+xreY?I3VDA9*tL#Y@b&V|Z1@V_k^g?tdL{9DcG+zl^rl?lKEe}QiC0!SA8g)~s8%;R2rpXk!r*8a!)AKF=jS1>guH^>|yh0(@ z1;6%?zbJKYIq?>duA201!MpznYZG(p39pNEbBNPM9tvpr1ZuXB^i$+PGf#h^*;kae zvZhCmK^>ZhbUV>58|8`#O3~Mcf=aVE{}asyz+aNdblksPv)}Qyg}mp98zfnfsY2M(hoaR2KI1gM)&7L_lc_Zl2bgfy?{v_HBA*}>Rm-J+wpmedWqk6-~ z&mBVl1l)4rf3B@qvMj*coVr8&&Alrpe{?LonQC-H?H1-@_3jL251{=q0>n_oc_I|6 zXAu~n2QdP)?L7G%$7wg0R^0+(@i^^|5x@aaZWqo&101XMw=xFwV1$5R3yB@-gw!x) zaHty=cw_`?`Y*_9hfUBHXnR!Ql(&)pRI&$nQ_T49+XRbu*Sask#cMBWeK?{~1!Y|N zp5xFegWE`GPmBjFiVKVhtU3~o*Hld2lf)jPjj67)fA_Kb)2aA9-IYU!eh7!2v2xA! z9|h^fIASEyXund*M-}73h-QlzRzbfWt)qN4<`^{qFvcAtmmcEF`M*tsE%)ak_8gXn z?TngIwQWn+zN4df7pE>Jk4R5qep#coY@*F^fk6SiM^g7;fa+_;y95eN2Bm8J1KfGm z%?Xe$V+*?M5s)ogX@4~1?`&VZOCbdYLZ@uOh)zHUPX;reS`ynWlB?E7MhfN#BmA@pe0HQ9`ANWOF2#?|9{-d-thp z7|Q<8J>*kz=PnaB^k@75IY$n^S)c#Sd-PSlSpr?C*>#Dji|R=1PG;9z3AH}lfBx1M zP@ts{g8eI2k5tSiv8RZA+;^XDfkCSX0qPW=;N&;{<*92Z5|fG=5B?Zj7rsCzZD`{( zwcm1LT5Df;cm2{f^uC#X0NLI49v08J`L$mHv#Kh+-)7j*yf53|>tF5R`~3rAs=qVr zpq>(t3^4|Bz5#u2V3`0kOy0X3jYQOYLTwdpROB-2$qFGZ;`lm4TP*p*0yxA&s@&t? zWO<4ZKBAD>=v65ZU;V+4(7@MZFv6;DH6eAxo<+jDvj);yjAd;Pfzi=9k_O)DYXcJ? zbN|u8iVp^J?9fCg_UZ4<$Qyqc9RO$%lM(>uCP%eOZ;&)ykZ0-94Fl046Zx6;Dm`vO zu^RYv0Wkaukg1z50)*X-nlE zjQ_wVt9I!uEgC=EY2&`vXPL$Jd|;=k9{SQkBYu}RVZa67_|2kS-YY0swbwOQ>{G17 z3Z*_(=Bn#%y5TdQ`$4(8ZndgCX9s#U2`r&hg54VpA+)}l?Tb{$^p z)Mb|0=9=TUP3D`Y+X6rO*$H@V4AZimzJ5v9^ZUbRu*E8M)&ITl1wxTnB9+N|c-96Z zrAn>Q>gej}8yFh(vJqrrYG!U>X=QC=YiIA^*fC$Uvx}O#27AJk)y^kZs~H)aaK*RE z!qUF`b#EW%Sca{gy@R8Zvx_Uv;HuBVrq1E4@2m0n4Fre+(AHJNCU1SO?Bv3T=Z`E9 z)E3eH8I}iwAy8O>a0C*C#$a*PHR5aQSUS_P(ra!=!PH7nL?$}8B7*84=*3T zfM9na2K~Ofs90k0y!?D_B_vDH1!XAhA7ZbRbW_h|WaZ=)SUdc3v~_g#^bHIhOm6D4 z=~CV!@5*?ujZQ7tCP{7KVuG5n-Ah{Fm3dH98S2(Xw|I7qbpQ*InBX>&0>@ z8*65@MAM|al6bH-CO5pKH5iavgoezlfRt|#d;@JlCmDUvyF*Dcf!tTxB32Z>*}~gZH%!a z6WgG8Lh3I+aqgw%anBR)%d2;7%(coW8`LA)oT4@s-6&Swf*QlPLwg*fEq5#@c#F%? zi6y+^6f2~>qO_T=cn)u->HV``At^{ZvKqxo8uW7Wn7_)MDBIYhqe`)RKQyX3zdsJ+ zsR45TT;nfeskO=s$3r)XC!XCYtH9Y4(_Wx3cxI4!7_;TsQSWnMv$Evl8hKUTV4(cd zY(!tLI&|0Mmu>9+R4Pkbfz1ZGdz!`0rN9v&5}hm81quV;2oQ-rHlb z7*?KEg{bppz?^+@%zQ!O)?dDGSeGV^-oJ0%$t;l}as%5{MfGJR$v-K}J~?ZpS(QTm zT$N9k2V?oM9Gvr0#;G|!t&)_+)g!~O5c~-OLI|95ffFtuAlQizI2Qtf3!DG|06*^I A$^ZZW literal 0 HcmV?d00001 diff --git a/nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff b/nebula/assets/fonts/ZTBrosOskon90s-BoldSemExpIta.woff new file mode 100644 index 0000000000000000000000000000000000000000..638667898d0241b5f9d4837f7753a25e5adc499c GIT binary patch literal 56220 zcmZsBV{|6Z6Yd))8{4*R+qP}n$;QdXwz08o+qP{RcYptT?zh`B&-7IFQ(fIPXQum1 zx4XQU7yth7v|FMjYV443HTI zA^QI~o0AT40m(q1X}{ADAu%ybruB|J9aoc=sMQ$n3lC8LStSc2hzuHDJkeCwv|RsVqJPVCKyXRh)wRRgo4b(4Kgf*UmE zSh&n#=P83+N~y|~gux^@hn-L|O^M4D{8_{LIqcOxX4(U1J-wGRdC0`LYRp`{>cg<&l z4U>}XsS(OpLu^hsbCg-E*}qdm5YG}vNXUx0Vtg0PRZ18`!8V(MR_PC3MVkeR@cHZY zHy-J>pVsSEE=)un1sW9gyuS19>GmkkXK$?IROEsVrIrbr8o}`q;orDO&|POGQPv|D zH=aI$j#TSM9!?)wC92t2$k4ygbmw-vv4&a(gXF>v?_Dtj@`ZPtKlP}%;JNU5P(1CP zTbIPWhHhZrcz*Q`}{@`Z2%snxoUU6)@TW1g3>8n4pp{f@j)UNd6F!eYtO^B%zENfPs^CMM3OdiECG?oDwz0>P{R4fO! zP`gKdd>(1&@HrI5pkgpyoQ^Ot1nXW$o-W!6 zcSJ)~$NsR%8R_B2d;7qb@qt7x?g407)9E|NHR=TG6(W~0dGOyipebQZIo1$mg#YA= z^aD%s)zgpO^u(Onbb{^^DcP4^Iv*_Fa1@EiDxsLccxP-ibyCAD&GBGa#(4W>%HN<( zunX^~KMGnsC;f!;M2F|Z`PirDcUb5K*c`o5F?Cr@&|y@J<=|X69+&l)+x3_mWpd3v zR(7<-LG)c8@)_lW&XbB~jyH5?t||m-b?3NB{CJJg5(TTEX$5V$g04d960CkW{i69h zcv|S%x{Y~grd~r0=a7z7b-2d|@2IQ)9jmBgC`87+Xg8)|#{Ig-4+QDXhh#`8!;)y3 zm(-;FxL9({^pB|J2L!3C@+^vDPdolr>NWIB3bw<+mY|)*)^~d+m;Y78`uO@n6DsQx ztEOB*;x1^`nOrCG35Tz41VUr{9Y`dj|fGqa3zeg7E;U^3qlvOf0i5bX|Evjd2u0& zi49$dvZmK@b?@e7t&awZI-bQr;~$IAyUv95-{*3HU+E5vw@t&^IVMWkIfr>~9`V6@_A2Kn3^8j?cwIf97Dh(<^T$Rx;aC;$`%lpa(t)c&swXkh4I z=y@0hn0{Ch*m5`>xLSBn_;Lhbgfv76#1teLBoAarWDDd)6g`wy)Zb_{Xtn47bQ*Li zbT{-Y^mg=R3^9xnj7v-t%x)|^tVV1MY$xn~93GrtTs+)3+;uz+yk2}1d?);V0xE(S z!e4|*M8Al%mvk9)@AMw@j|?7+zZj#KP?+wS?N~5adRZOV@YurH z?%7S)=Q(sZIXH8;fVu3rj=2@M^LPk&`gx7`e(_cFOYqMNI0?K8`U$}Zl?XEl4~l4s z%!>+%){9Yz<%xZYYlyc?;7C+TN=TMUK}y+49ZE|`hf06T_{hA={+0umOOQvBFHj&* zC{ZL+tW^?II#-raE>%HM@laV-rBO{$eN}T(hg46{VA0srl+%3Ia?nQ6{;eaSGpp;T z`>5xkPo-aKpkXj==wkS2RAlU8{A@C7s$e>8#%ES)4r=aTK5Zdqv24j@nPkOcwQ4P4 zU1Vco^J?p4yKTo~S8WexA8NnrAmNbVNaC2}q~)~lTP8|!ytfKWhpAXngSkV(*GuvYM6h(#z) zXl#1y+UNg$aeVh0}$XMOZ}=MIJ@7#bm`k#or~1C6|9mN-;{sN}Wni%Ye&d$`Z=9 z%UQ~;$`>nWD%>g>DgwxT8q;W#2fWQ)-(+UwwLXd<054Vzw)OR-C!hda&$2hX@aNCOO>SGO+hfFoYn@7M$Y(fkH{(WdCxa(|l1GZksq_ zPHy^sM+ZS}Gx_>^o-(AvmuubHz1MaNsu@=3eU956Q8{qd8c|7{YpoVJriEaPz&4t^ z2aHsz(;S4E`do9^6vpqCehIGon@9IE(b~zk~{50pS{@qN;<+jjAx0a4KWPn#H%k4Zy<}o z!aw|M^8{62Nx8u!!Z+r4aK&XM((1`3b&y9Mx^@XVgR@1`D{-N>qn!C-@p9$Q;;Bkk zv7qKdTkk^_+d=WUO%e(^{C!{nXG4NfAS_gFg^Og`-T0nB%v@Qd1?v|?*e(OEH%^QQ zx&>WH!YUCuV)JSOYjlBS8ey*lN|0;GgwuvYo8c8wkbVHx`5yFJ6lV5=QQ5mC=LRLr>l&!(2{*6@LHH< zr4D2E=`LHS5(i7#5u$!vBlbSwpfI+D$2}L{i7I4PX?u-DYU2E@vNEOhXlqga-U7OZ z!dNiG0il{DD!C=9PlTkg0cuaW(IlpglM~s7I+k^M(U@ilv zbUAXFqj?mU3#2A%)$F)>JdTYcQ?DW52iZ2;aH@Ig=&I3&!`>GRmgln@_SzuSJK{1(iC(I=Sm{|F z&@LRm?_TN=<1G0{77S$^CsW+@yExa_+6^?dd)0OLc(xUN6Wg2F8P_sx^m#fvdE>Nv zoCbXEdvEKT^J;31JUScJ=MS(;whLcocU(qeS`Q%iT8DHm^dXV-1zEIUfhO2Z^Qs03 zOqlt_P&mx2O+zUvjdAbn`;k7~yeLeUf3VTi1@Z$-T z0=Jqv@R>r6bQO$ys24OUBUN2h-oQo&7RnP9ok6g*(0249Svp^PI{X+_aLvt6~y}#8eb~TU#5K? z7I|e7o^$T0pI+c?q4gAD)q}V(z{>4Bw6m53nVscTT1?gZ!pCtcfk0>Zz0_dYZcn6i ziH{eP3*-?(vg5A)G%pJct!fMMU^K$t6Q#6v)78ts|Kk!LXx5Zl;M2YjB156w{!U;1 zJ~~D*=LjG=RUKV*+?x>xyS>bf0Hie3__w>QudQ@pkaXj6;AMJY`K5k$4G^GfFv4oT zcp69#)(9{yt$ZIlSQd!LIb8+Akwy9d#*vYb^RZ?f1Se{slZYxS4!HcZ6O;bPE zhXi+!)^aZr++&GaOG>vWl?N-gKvT$2whVW*lEZYMK^SWP29G@M0llEersBY|@zlO! z#f#pP$|CK{OCwov1Dz6g9+Dzy^7Y62l6fFN9Eze0n~2?4NnW<}IOR~%RfZdAS1tzm zfWu{OA1!n|Oi^SoX~Y&3_S1z1Z(1?Euh)ggzF(=FsG)494XY}C>Ej%!!SO?CvB}Kt zTd0R_5&>~=?a(hVn2IbYb<{v<8H&?Z=^SFq!Tw36&z?B{X@saSipy@%cTsGu;p9K9 z<^KWm0R2J$!=(!owrz&WB;$Ewk|vjZtvvhdNo6W0hoSeXv>hcj)rlFQanogZzGCqA z;4euv7m{h+h7>Rxr1ZTkE)KiisJqR?%gagT@l-=jtW36`e#s8`>#*Uz6iTh*2zrxC z!}ia}YZQ($I6r^TMghI9;$sc#aCTJvgbmDKh zz(H6y!&j@Fl4XV|PR?ZuikK?S?VXk~QW0mQwrP|RwH>#>W6o)tiYjbN`*7+;-z6<= z-kLaAFwXah2DTmd8RJZB>y@0IkG`s|2DWYY`#RZZS8KeUlf5cu@}+aw+|HL6!rI$u zX8EcbxoZE1M4*Sb5og@-eLoNPZe&3DN^baP46Mf-0@7Zi!WJc}S=^ z2AzSt41@Da-w27MWTbqJE`0svi$Bq0EYZq&dP%JGpX$GEqx!;DlXa9{Kp+JN!y7bi z*#>9de0k8}#B?C)$b4C(qdiQ>BaThimSudy^@uLgb)WSiN2j$A{k3B-N~Fdl zj4XcQR&6QG0hIW;aXz)>j{HN=nT&6Dcm694*C|yBFG|+&?j@k*?nNHV8_lI8asq87 z9V>Fc$Zo1S-smYylv=F3TlKxv!{-$f-|bDS0?98kX1&aP4skyWVl?C^IATJOjfH|* z2lB{SZ5lu$E5WKc+3dj^MD+{T;YN2FxO(*_A1vQ;X%C%^hM%f_tIdH7qZA4)1*KdS z*zN1;1D#aSU@V&$lh5t`Ia;Sls#F~tT+H2_4UT+nBRP0*=se}&s}wmDOD@{GZtj`c~L z5OJPX9Qe$_v4J3wn~}rr9SQ6)jhQJnmRD~&EtpYIOCDM7?k?zw4kUt;OK%Yqt;hsy zvkwDplUi8LT{-u_+DOyF1NA)(Qj96>?qSu0V)b~h@8BV#=Qj$fBMGd7O&_7{OUL(} ztC@o!zhrhXJzQLxfYTL*W>F`RG(4PDq{j@j!?wy(pM-5<@8=odp7I$ z)#5W35USx3uD72tWf2xb-`HWrO;SGt)&X`(x-J?pDc?in3P=Z_Z={)UHdEE_=fzdf z9ZXd@7L(4N+840i^a)pi)_boA~FtB4y5hEhWoLK0gFWVh0&6Yd78xVh_?Kb@<>JMpqUWfFrNqoLBA>i8R@ONJ0B=r$C@%eCHq!ud_ z3)%1%bx%ZlW?lKz5Qs~A2bexe?*|r6 z$dNnfAph=?fi>w}~sUiMGU> zNrSBK-d<_ZwG6~sY4Q4g?u^i2n_Xph^r)^Pi8G({guwSP-nm?&-E5TWv#p|5TM<{! zUGK8Ee9rt;Hq}C(-3iRYZ&LOrXR&g|08qjPYi1WFMSo;)Lr^`z;r3mL&7B+1!idt(8JHpE_o7o`I%IsgV-ko!UrnzeeqrPI|R zrl&dY&;H>A)91d)ENbMy4Vw1u#$B2<(_!6_FLhCg5%-L%JG$X+N+nz_0@DIAu;}~olc4?F;%@> z2+!rK)$4rAWp?fl8PGDlgtn*S1I!4Mr?T&(7D_ik8;7`V>Se}O7sK=69<8q37~Zcx z`~*91Rr0*9{X2||+(#q z$8;7)`K!+aCR?p*_qe99Hl`qD7sKM6e+;d_1J=~UfFN^-%Qc$Sk%Gr_%|{6K7w3`z zVIj*lE3^~boJMi1cO?+;zh$WoHkIG6(VupTLAuJ}@ zt9W16R9grv=H+tyF2C2+=pz|dy3a<7>pUOwGp&|jbBd+a2^}p3^*3Tds_5WG-$LA@ zu0Ds$cpFR>XrFBS_lA}EHLfCzR5nhm&j`;>-aqhf=Csfbfjmx==P8g~@px8hEpBMx zH`iADPJ&)=v^OM|;BD8v9o&uYuE}F)F`th(Ax~#iTWE6y>c@omc z{!%iYFNxjwSVwKC-VsW)b&D9Q*gNo24sev{F>n)uxaL!r>z{YY2=pdX>tmqUjr$KXP3|7_if zO&eB2F9AAIlG1lMID+L_5$d(t)PJ8bK**PAj8ocD*uRjqM{(<4ORQ=4WO<+4t_BK{ zJq7AX>2K@e6Puqj%xLj3Xc18Wl>As}kIOa&v z${9^)(hR^y9km*vYO*+q8>BzEWD*URS`C+^-3T(sPx*x+G6+0JpYAa-Oo!)iH4(`O zWMux+r~Z6{)z-CiA#PJ%DD5Fx)W-RgCinitYBp2l+woq{q>6=YT+o+`qA{-8)!OiM zTbhM+zRp1{?Gn&e&^K*}Fsc}8gy{laM71WWsb;FEIb`07 zb=cdNVsr*kj9+{95-{EGfua+ty)Q?Az7fn$+J-DP3Q>A-%PA(ORenl$-C^Vo@b6N z)S$6T57vE&+4Vap_iYI%7oM@rAX@(D*7TPm%3shXu?Yt^|J#PG(9n7cmA^tTCoz5n z8Q9|We$$zYs!@u)462J^z^+&c6wM#;R%Q}c+lZqj)H-=scbpu^hMvbXZ6K^D1?*k<+zjik0@xgDUaA((vB_`(lWR| zBe2YH+M1kmNXE(-U``M9@U?3$AZHN>r5wCB;nkUg=rV4`7zRn8y}6sgf>;uvR=iy% zeL}^;UBzWHQy&url%;y42jA7$7E|ZxWbYQic@r$>Fjq*q_M)Wp;y>xOI1p)^IEp_A zj@XrGjvku8kxuu1*G%7X0=4adrQ}rRc)>#tez#Xu_6InG*I!L29sHuH&!lrhoc+}f zgGw5zpz=pmjdl`@C6XDmt?)&^xzc@7A>d1~I)+ z0}U#>^pDHd?Bo! zbWbAC*KaNL_ZlwdAzRRszCmPxujzmzs|kKf#i^%J=4N_HIobIi8UDRi&vrP+Dww{M z2FZdE2GFV4ox+LhrYLWyx*;dTG%_QyyJDi{boVL>y9>aRDN#*%Z}C=$ghrB*lL9$L z^f7={28`Svy(rXDgt59-b0p8?c7I!lghYZ;ex6(!L*I!}C~QQ4;)wpT`x0KGSYJMQ z=Bnt-jtY(3PzAES|Pt7OF%KzLV{Qf&cYQY`B`T(7d}`525#A#6|Hq{>mUF;%9^U8EI*GV zB$;c-{V7i0Qo-1cop7Gy8UB;2j!i$0Q!9qrm!vwYypoxnw!w*yr=dtXVJaM7=Pz+? z;Rp@PEQ&|z^wH{PmWq?MD$=Bt*Lp}u4tQudLyteb zZ=X5yL~5)^bvJ|GNPnf$5*tfaMw68rq2|KodZhtD;g>Y9Ce}(>aMqdD5=l1k#is2U z4U{|EYE!4wpFBxm{YwpFARL|V57ul_E6Fd;CKkxvI%iF%8jEK2aB&tH-s-LlGB8U@%IMMbig6s2b64sx*+k!eYk!=2 zM<88IpC^I2ps)WXghJ&Ne5mNr;dGCPNj5=;IhD=Nz+T&=faOrp2kUvjfs|;wB8Y9?;jv|~Au=8p& zMEtt`94PBXpUu;E;zgz|DU&{8_Dfg9BsMIx^1~OH-A>qrX1G1ay0u_rTe>goq5C=a zS`(2iXvgJ{s!27b$RR-SV-tAAzx&;FJ0x%uK zSXkS8WWah!(TB9g?4oZr69WJdy!kSNH!cg4>K1WQOAdnpZyV5lyrKTkD4=p}%6GQg z3c<%#MzDP3ut}evG{S*@@DYSbAUS5!B*QUWIW4;zc@cq9HMLsbHys#m&la1b?uDr zqc9nWQM9v&EiK;=Rs05jZKB4hnc0G`M)O<4e5BV!yA^RwfFfFe!p-*(qbW~8}!AgQScHe5oSi2zyQixFA z);Y}>(IXTHSGPQ-!Ux$Gss>n-FLa-7@@2&!=@$QRCX(d&rgAuGWYn_&xZ5juqJnY= z1@WFT6diE768?9gk;`8rukS+-if82Re2G>^tU94H(171uD7NesV9O@XEC-G|19OOB zq2^7PASGLQ>gO9zKX7pFq`Fn!uqp1)y8sIDimO@i7nUh$$YkG}A~GK%g?a7RX_ve= z)h{t5e)z5mKI*E&>E~K=zNx}~r>EnD``i4d@Nqd2`{zC2i#PQ6XOdpi=)T; zgqTdiq0`*qL_#C~cVtj4_yThq=0`&jh-kX?3LL5=J>Gw0ch<|+eB(GkETA~uz>FhT zif56;*v^eNv@EZd+c_8M4+1ZH2bxf*m~;pPaf|5jweBpIo1oaF{N=~t zy%nQK82Qf5R+pi>^j5)8R|rD;`%UpnD(C~SdNFbp86^9dqMpAo&7{IGSd4IltgCqM7r)&W(zTCrF(`6$JJ2IwJb4!DS5>*=t8H-^;Co=iSY7io7 z1?yw%L{ixyO^QI(;W(0oXRs*iuEfM}fLM3o;|^C%$ZRkaxf6~Z-ex+A9~J0i?Pz%( z#A;|6sOr6J-|c&Qrtloa)Z&?AtXO3zNUDVhLMn~|FV>X}uk<00(}qMvsOQ&WG~)Lk zc)c@?jtW3K!E8}No%KCTxuo}=5QyOEzVr+eY<1BDy;OKLQ=rJHA9G0jAxvv|F^$;E zTN9SM01DwRDod($CjYVebzb{M3bTkQ&2QVYMekEFBmXYAuncCGsdCAUC%TFg15}H@ zeQx=bcmr3i0?Cav8m}ELl05yon*mAIDW8X{F^R%=A7Hjk z($OZh#NJM-_?g3bN?HKZj$bKjtzxXd`*Q84jw3BYLd+?tfL!swVA`0@Ab1AZ`WWfXNk-byy9+u$9rP9c#xUTp=^6Nxv6~B^@7j)V!2>akO z%C2Ki4*KHAIzHt$4+jf;u-sA61E>&#lN|b7X3) z3nd@&WqIcE^)9vgmP?ypg!l1Q=1jxav^iUR415V{b%HR&6;S-WOtfZ{f_UJ5K?^j* z3Sr@{La2Sp8Nhe|NN7=U*T6Y^kxP~aWK9T7my%^+X=A|0&&Kadv{QHtQREhoMYo4s zpwZF{AKP#^m!fwESP!U|*!sE}JSYG40ZeG>@gcr!s^n8=3+`Z!QvFaixB1%Wtw0HPgh zYoF|keI8~dcctMY*EI)<{kNC2D`Q}e%Kv7G8W>^j7Bc4DGK;KbG-IvoB`q7&I-9_H z`4TE`Jdk-szt37yz?qc4_7)|An1Yj7uyhj|gm}dk)?XLdkx`#)HDi|Gh6afME|clV z&gKZ{emPr@nU|XDtwe_wOaY%|ZC;hN%yUn4J-b5AmFf?%oc*W8>;r#{UoDC?O-sljI(O>`FMEDl+OY?Dt$mhTv~t zb5XGp7tK^gxmP6OX~9&yV)#--F|GNZx#`k<&>d13YSv&V;avGcCz{0O-$0@m<5=7^ zc&MPYI`Ba+Cm+Z>`qzUHPie{Ds4~kRjM~Oa1_Glnqm3I^u3>`=G*@??(hxL~ zFt15mw1*{SaRpukDzyH4neTDk(St$0Zq;&e?OQO7ObrFaqH6I&Iekog$IOtt%teNG zk64Q#B+^uoksjHrF!{j(m{8hOQaO3orAEQimwV>Cc)En;SiaV5q*bBRzRrw4#plB}e6pNgR?4rPRSUWq}P6)O^WIN;K%Ub7TUP z2a$WYPo;nP1g>HOdd(pa-B%Z-(J{eYUfzj#2rRoyqx9Nh%z>-ANu-mXt-qBXA?KXQ z`^KP8|Kb{(^4kcT{{C?vJLiHU`x8qQVd9sOZmI@M-BntY#;FDUX30hi@uh^2EH_~x z(*KE*(6I9Q%iHawi!sn~syr%{ylseQ@H2Y%QSD6yckXQVt7Uu-bpL$b?j>k6R&bpd zi!e4+LJp}r)(`1*Dovy#$O%?=9@xv$B)=tKz;Zv^79rB2p_@uB?^?JW;@nSPB|lEQ z33bt4g;9o2m22E_SEW`;xYvAzHr#LMuhb*YJ0|v&76`!{q;gJoqgbYyNG8*m8W69Q zdB9+MS)q9GV9306F+80FjdTPJn)C(RWtpRzx2hSb-23-?kKc0!%`LufI40ueYDZa3 z1KVj7CX$A(7p;uqFL7^-mzXNU+=`-%-=+anKCkvs8xkP+G ztM^k|%I3Ssj~}4soWHfMsfjxH&41tM3i`DbhrXfRkJ*;ze&2^Fz!je*;4n?RSwL$p z+>Be-s{pMgE=)alg8Z9tQ$Wy>F*p!tcBL7&ip?5%l+Dwh25Y{<#Zw4}oaxfJ+j1HC zoi?nP`d-&i(2q^z)|)?70`-E&HF7cEoe5GP^A@qLu$I0sAb!K@%j&WK&V!)jn}n_& zo8IW0H%;%MUpw_6(%!$5K$he*edQo@4Yf@frUWQ+s^`g(lgY?@)L*i$=7kL_95L%X z4)WE4M$TxLanNc%I^J|vfpaBm%W~sYG|R=flt8oB-?B1L-VQJR{ATQ{&iuPwY?eO( z7i-+TbVALRjO`2>aMXc-TP{tuqVF* z6pwcg6tb`rm3At_hg&Ys+-3EJwOkPEU;HmTxQIo*eDBiglJ;oxwiWN@D$2zjuj_!I z2f5ntbZbb76Eft$K|Ll~n{Kyr-AC6-LO2vs14}P$LNqFa=IM4>8`yWZ=-#Hk2owln~OQ|g#Ytb7@SmZx-1y$ z`O}(J_<*7E86$?^ygVxT4ua$u9q} zPtCXMMY&OvK%J4#rom}(d`uc7y8zY~itKxNgG zGLTnFOA#kBTk-={D&?ckbkmShC6P56+`n9DHp;a)CF?ZSU?tm@Ts>fl>}Y8lBB75@ zECB{5VHaV;L42lkq?~z~xAO}G7c<(JdzxOCCtnaV>K;WoRfLw<^od+uw*UIA79_m;8{~yvx}7@fLMNRk^DS}xrT;r z;;AKMz!K98#4*jz9FM(sB7~z&p5yiWfb+{{OxZE3`wn-3f&%2D37c&y2vR3VtnqY+ zPbS+CQ^a-iJO|u8tMEYjca{6KWvRBW$Hkxi(EOOE25jF|{EP-Oy#>PT*Eo?fw5t9; zh2~z}YjVtzSW0V#PPYCLz7;xj&4cV+sYUaqcGrQoR?-=T9ae!)8RU`%PC#u%Ab9XG z9&ll&g`b@|OZ+gl&I`P(0a0jn(7TZW?vi|gSAo)-pPyNE=X8~ge~E3M*5b+Z&%^_* z)Y9k1TzPl!Y(E}D6|}$Z?-;m<#_?DOK||Ynx;VP++CXH#Y$-$ZL}s{H#0Tr@bVz?M zr~+r+s6`A4ZJ5-x^6*L*ArOv^&XaCPuYtWHAM8!s$y5< zW~x}i1lw@UB{FS8_c(3{|6ysqa4^JuRhh7;LRZ{hwbj?qe-{G>D+TjR2ivrutsuML z_^l55WuH67&xw%wDHy!Jt(YVJXYeE?OG~K=#S|2|?3LG{CLY(S$`a=cGVCO}1trv6 z_iG(}czFhYUE!Bmhj$@wi`^x76CN(={4ev}HgeWJ>^`cTR-fZ0Ge{ZTyY|(XrYY{` z>A-=UV9m0c9fA9Edn0?zWi{14C$r=+KI`d%%JLM|6w-=SzdJ8E7FPU=A8D$vW5Y|$2mrFSginHmYJMSw_VJfbcL_TU5TK&@d z_+{DixtNThAHs-WvV+>KBu7d0XpWuy3BwQ(NDVmM_P;eBmv+-W2WQ8=z}W7h_gHth z6>=e0++CZ)2RXe~5=E(7jS~m5Gs{IdF=;B#FkJN#JDQ`t?8ga{skU@$vFG~PC`4&% zv__3u?HDx9qosj^#c^Ti${{%a4ZWG5`P*uU?7-3scn(KfV-wvbR)kI;f-XYVC27on)v3ma5VzgGRl3z$-X>lP zK-H|_Uhy%Nb!hsoh`OniVmh3+EIzci?&z^2CgVmO-j@<;8}0U^MHe3Ft8`GT(KOUP z(Y0*{sSks$bg@}FU!xGWMcYBE|7S_59Z}B*14Dd`rHS~;c`?hw8aD}EZn4p%CWuFR zo(EC?YaQ9>Vj}P}iJ+RLKHxKn197D&^IBy@6i$(UDET0(T)%NZD z$MNnb{hL0$x<_a{$JFuG2a35uLm}rX-k^xTssn-j_$x(D>>V=nG#(LXKS&6(kvHZ8 zN=n#ee5};#Ll2$S-ol}wC}=R8*ZN-GkkWLnH>cvnfx+~5G_)hJ&9N+lUr)%j2R(il ziAr)o;v6PcS9;@mGxudLw_T^4Bh8kWzb&H-QNK&p>|x_);zFfp8lwoV(iN#|mRZFH z+M6T?5+b$^m!if)b1~6=yI1hAYxy>JbOYd(5T$Yn!=E!Xiq3f0i{r&*>=pOBgYBZGfAZ z%Mvx$dQ{pf+T&fr-@i@Fe2%n)#}A0B-PnI$_Hljd3-#%7%j#thXm-O8{MW1vjh-4{PxU}g8l)!Y*bwuZl{4Z zn}A?L^mCr3{E|omy3twhfK2o|&77h=5!2Wy%vF`gpz{v7cICMr_mgeforcpNH3hd{ zshcRsNU=Ffz&>xJB+;I>gh`@=G&y} z;4Zo-Uf~t`ok#I=Ia6Jn^mWwTZY~RLL&EG&rX;UeV4HQGvP};UOM2wMNocs640;k{ zyHW>z%HGH7u2FK8n9^qUTwUIN1EcL**xVIrcv{TRfs>y@)ZRXGt{--%`Nx%;%vMzq zbj77@B-d2SB#!<4V{DZ!Yd{!>Dg!xFV^Yp~umu2kOH5D^l zTl^*YJK-5`j-h@ju@d+mOfLSx`O80hwmaG&riZk#1IL+WJ@UDlfEx<9m#BF&^aI(* z_ER=d1yW6kaN;W{72St4pQ<7Z4TlH{q~K)W?nbh&jSpXlwa-JjED%+t$9(y?K8tdelqmoJVOyLFJ@GtRJrWCu#i4-+-A>%W$^uAW=3;8oTO`TVb z?qo@{2>3ND61-kX{!`dC5jU0w&j5OIDISH>#dg(yFQC6`HqwQn4_`6M)4)7DO(uq4 zl6xI`7aa~t?DSPdtoZOgj~O_-xyi=ziA)!CE|D9<#GXR+3)r9F3N=IUchz(6 z&%-Uf*2VFO^G70PFcgP|V$^f9mQIWfy%|J4WcM=_c4eS*<75v*h}P|?nzqNb1`~O% z4jjUJ3XS*f8^?k?b3cn#3cZ4#AMiAN(woMKL6y6tvq?Ieyy%#NCoST9x?o>vS?OaH zG&ZQJYp^%qS`scl1VxpfC*;gJ9Zv!U3J-;71M)c5ojg1Vs*2VI0d?9AIs^_w5%{+v zI>6joa1?r-H#OUtT@_IcEUoC7`w^TVPZ1*h`tN&V9c0bEMvuLr?)`pXvUIl1f#u>x zz@4Z}Ec_$4J77dI+IGssj~bqz?vT8`ZhFQ?S}AhsW^L7B0rw?#Q|r6pYgeM>S=Gth zY`3Y>aCb6BXL}PB8&JEXx3?H^9`RlJY;hB^LL%qQn$fmkJ+XZ}jmMcPJ)3pzMtZ{{ zGM(#{)4_$9b3t@FPp1j$`hE`S^vb7{ucKJHm!#=tLZ5Zh@kgE~{yQFpGunmXI^Z+P zLlM4V_EtEU@S$2*BQ{*yh5AIzZACVjsFQZ~<;_)%V+E)Fh$@bQYG7~g-G0=xNjoi;&^N=zO}BJ&O-g>RVwe5CS05mhT=*i8yQ>z;uMGbS&1!hGW9^Bcl>7ScC_&;E81yr2nx}TP>BWqyjwaPQBr0tSsvk4u2N#l30yu;ud zKj2Xv%&?(tlc$+X7swca5&ZcZ64$anPI$v*om?_F{eeWlGZHRDU_1O+BNcY;EmAMIhcN z>j&~&XS9|)vSsZRB-mW|$TwGw-5`U)O^o%{|7An7JmL8fU|Oc|ijBb!GPm=%;g)|) zo;Ja<&fITutc^sA`^mWGz7q{FP5UizAA`y%{g$}atRcd6yLkak-_*hylhbH7T9V&@EHFU8KyxZ_sdS`wgMResg zC=O~QFQ`xG3|1LgkvExukE+j|W*wR(5hFN_!G|T(syUcL5u7_BwMa=pJ&R6*)NM$e zIgm)aQ%ctv)ub*|j3G9ACd{Jf?#895W>78_Q-I)9?KQ<_tk1hlF?8e_T?7i~Uc@|1 zcIV_TUH?x}jn-Xnd4^Wes>IIoyA`_Cw0`a)$dP5J(+O}V!9+N14i4)^7cw4JNb@WA z>tN;81Bb4-4b%GWl12LhXA3UzIKCml($QdGAPc1+=gk^~*UVx&Pf1!E`Xd`XX5~OV zlAufP%4KwlUWRLbtjM8N<^~#tuc2XYAV>_aa;gFBSH7xo^`&dKpU(g$N)m(#YOCniS3>xK0^0)PrH8NG^cBbN{2FDm8HRXu)x>R z+a}pm^tSuK@Nl5W<8U>DGkq)arC09FI1P`p@l@%R{ig(331Z6Y&qVx8*}k5D5_K=y z?MPQ@VOGeXEEsWpTa>-elq`^1?(@*D_Qm_V>PFf+^F7g7%Vj!bcsz8~>xVNd=FOVr z4`kvVFHbyTr`O%EY`8Jp(A*GS(B#xi<(AX6U7fX@M@cG1s61c4wDb;~Pm2!T-iKA5 z%CxEk7IH41VcvWc zqt04eu*m;!2h`HmpPO5n#|9H;oL+CzqqH7=v<6V%xEiq6aOc#UXcN88;dCsrCt8!` znyj@;Fi|$G8Hb{zEKg%~iDvA9Z=Z2WPqKXai9J%5&w&%WNqlKvDsq%JjD29Ai{T$X zFINFos1=+bAr?o|end&dr6(3iH~|bXAv#eA>2S@h5;woTF75J*XN5T*rYcjj*2GP@ zYy+Fi_}_+`GtcGGt%FS%yPsCxvNWza*}Lrxo6ih+eMm)mZ1%c-5kTNR@1t1CbA%V5 zYhG(i@c-j;1N-J?T{MTZczYtBXX#uPv0FDaFE3Whl(S)Qg~G}oIYo$}EdI!Z!u+k{ zbwuw$p<{7E4>O>f3OGww?d_kyqixV!-qwvryNPK?X2KAex+5!&ci#W)V0PBPU`$Qd z1zXdhd|GZ<8Ex#zd*?m0=|t8g@(E5-D86<7s%}544YmhuJz4I!LLaBzb_DE6kS^NZ zYfE(0Y69i#y0=C`F3|_OyH(yn7^_^`lZBR(E5EM9W-Bn~Dwp;?B?O0WThta108ktI z4-Tek*F3nm$qj&>AG~>f4Ep%~c8c05X|GnA{Qj3GIG`Z3PME>=hffFR7}T*f^BOuBF>=-&CJov1OzPUha8v z9(L1v6gkW=YcW1_6T_@#n6M)6kX$D&K6bmz?NsCt%dW=w-~pCh$+96u-YK|lw|Z;T zREh4VpK_eM)^}#Dm~?GhciB>|y*6iNjMF=_?4+`Ch@6v}wbDcEXvnc>mPW<#wtsu75up4AqMVieNSZucWd zr9eZR$r$C)=<+eZ=$0+rcS~b{j2gG zP@q;qS7kpv`jcxA+=1dogW*BDQH=aHFYlnLw5;YqJE^$+dm9`vLLp=F1tS=|x`|u_ zgXIg`9;Ti}^(2;i92+bTQtm$xKVfgr)I!Ll?LFPs4n~>w?sghwAJ${Z5;a@C1x(+C zcDKd$Eag1b0L$6zf|wDMXW`{y^Ifz+nj&>J_E^6g?YK`i8=;KA~IAE93-zGta5|D4Em(bEH=<=vrW z?+eRF*zP+|4-48gf$~#SWs4vx55nTg##DHI(ZhQ;^tVI^V&?-Li*Fy<`;9v{6^QD) z3S;+!%aR-AojZ2ajomhw5h>1DT(R%T$ z{cz1q@fu*k3;WP5aBXw6b)-WQgr=MM8BhiwHb*TlWY;1Hm3%16w`nMoJ`#6u&bnATENZ84*S)J$MUb!&$=@v(N4`m=wfhOYitpcvRGAQt(V$^9ZD zqx%F6u#`UeNAg|ZfE#1v=SnT)4m=_l2s8BR$wxRJJNc;O&Nz7veo3qr;g?y#S*!oF zw4d`crG0L1QWQDxV{!-lm=m3qb5TAA_EIU7woU|4qt`v!%!7*l0DtcbQyp|nTU|bn zNS=JjKB*{<(#b&SE7pGYS7eX9sog%;?IN+UqeMr7g!W^OC(HHSX)Ch}&6Ha9aq;rO zgt^MlvR&8ZKvFoF1T%kN5`lsW{cF0oy)CPBd^Uf_rk;8njeeCv;(TDe~@3XcG zFnpkW@$Gxe;#h-^O1<1fbwVeojvyvh7zpA!0LOtGpaFs;#3-WT#LlXn6N=Zvb3Q?p zM3$vUIyRJVFe6H-foZpC%Z9VXbEfBON9U&LqTjZGUjN4aGYLfB(g0Xfss8j5OC>C zgu1t7^{sb5cx!9n=(JJad+vBk@sz^9 z)XqL8=wkt0^ZPY@+hD;?H0GBv^QxWy^Z!;DgTinxH$fdYmk}L*~!95KwXBtq;c^Sni+OalubMGgRzp2uJhX?VdfKSo)WU35R`do40=f zzX;Ef^|e=~Oe%8<*K0x6Ql}3>0y7UnvfF|1EI+GBaPAJW^@E27ng$rUDriJpAuZ7w zann5O9ctB)d)0cUwqU4(G6g3If63;d+H|`i(3_ezMg`RLc>RiHEe&yhRQKt=`f4LS zGN%T~687FSd;bAWfI#J=t?jX7OD9?HAE|ZVZF;9YYi7)B`hb^${(D%Rb#g12D6z+N zzS`$FjCu8SMJGP^#;IrNgTxOB)+`pV=i|%s2Piu8=+jCPW@qfS>NeX0L-xT>==dv? zalk|U8hOMAolvUeOZz?4H=V1_UfKQmOFHeDy*i7jU^sxdt!qp%fsfM3pMN357jC%o zH874!hVkLgoGi19E{bd|CmJ99VDQw=+4t@6H`dk0RRYLdwFMZ3&qWdU?WdbJteTT1 zH2*VP3H}|8Tj!#InPzl2-@#Q5Wf@1~^P0-ZdD&(_=>q^9*g~x4^n2_=N!c8eDa%mu zc9ZOKbpyvQX%6HC#?YNkLrYS0bv?tNREr-_DAZcWwayL&WS8XDJbrH#;_>oM3PWst z&$ozv2e9d=D)+swZL@>d4=A%5r1qp<2!iiZ&ej7Gw(%Rm9~4DoYB-Yi$rTkqc5P+{ zg6PM+1o&99Q=;IL+0o{-K?6#Q3}oBaw#8@)xMBm7pM?KG&;w=A7j3k=pbaj_+6_{AUGw6dYw9Cw_pa?3IeK$T)$*Ix%>L+rlS>JbB&0Ye@LubO zp0fL)d)7BtZPLLqKG;w2!MbUDU=6FLKzWK57*+w&&U63lU%!m3!I{Z#T1ddp!P6ow zU){%>h@}k3k~^h)oCu>J1Kto>dGc=2ge+POw{zs#O`=-w6xhiDG3}fj-~=(FeE{ww zcfe`clOnjG6eV{`VNR5)OcKY}PrXO~jDCgq^*YBA$NF+jr&5%uc-e9WS}Ez2t9sMB z{6V=%^`}SIm0RcKqw6>@^9Vocr4GOd)SIkyuWLs?$3hOt10ofsR3o$2|>69E4?MwP2cA-bI4 zr{d+~Z>O0?4>@@fE!5J}0>jj9x-qarrYSKU$qoCYD32*A(Y_>`t^|zM^H#tJ)x~%h z`_T)UOtYG-`YUWB;cq6}Xn}PzoX8>Qk+)Ezgk}6S7CMYCx%r1B#SS)SRx8D9d`+jH zp;VllJ6IRZceQ!;ePY31QLI!YdEDR&#H4jdF|L3{Y?{F;vFSM!6qw0bg5oSQ63CqB z0%)O+Cmi*Pgrg1{M;;_RowD`M<7jdG|LnbYoE+7aHr%&v<*Kf#uBxu;+|zk_a?Tp1 zku*v(l2AetgAf9VAS59&2oWr>0U@veV+s@2)^@67L-FvHgrn_eVO_02Qd_MygniBFMzrTIl9*2-Bd|(862Ytvx*O#aX#@8u` zRD#z2q6i3~R>rT7%Hq6s2Cx^0*jUG+^Lw0E(jV9GE17U#$pCpIS1s*R1730bjRa8z z46qDj5kBc_iy{e)9vVHa`05oGu0D}kn6SY2TDPa52wFatTDr0?i(b?!f6yPU&s(YC zg*CKKWyp(a;nG2(y9b?pj$?ni3*V=H%gE?`nOl-CM#3>1;kbNv9Zo{Mzl6KibP8n+ z0EH0_Qy3=mYANA?I`f7lE_ammq5kZus+twOhXS@u&7%O@ni~s-E@bTOGb1!e7K4Cj3RK zX3SvJ>9(+2P7nL65E_|-oND;IdI0#LPx4Qj-{_A|8#!6@>t8WMmMJ;=5pwq78K2!K zbE#(K=x3I?W$Ls~4t_oE&zWQAK1j~Je&*+PCs&-w1$UHUR*uizC~Br`KBfi3{4ObE zs{B^kH+?B=-za9x2Q=*gBP(vC$KWxi*=^L98g+D2rwl(1FK zOiEN`x^Y$nb6}ua?j6YClx5CISx#RT|ImaJo#d}%vP1?8kPLLsiqadSkH_fHnBL`a z%Zp_IxvVY;nSkX_LArU`BGDQ;cwuNuyS}n03i`WI3+I@u!lP4_$)gJ!8s^X6;&SFj zPaJ2jVID&M#Dh4i(Bg7}Sj+@cFYJ7g^DCUiS*7wJ-W<+4;HD8gVBI-Bp^ZmWF=w3X zB9nL1^>y)=+wjP}6N8d=c^<|4gMc!a{V>23u0bB@zOc#nH?x`0?>n#g1r}S&j!25O z3qSHndx6Zzw1k{_z_jH>wkC4ngYgJ2HdYU$0t`i+C*;$05N2b$!HS>mw!^R)R{0H! zLJp+pPj;s7_eH3UeCA#&6I2z*z_?|Ya0wOjn|_L;C|dAEj3YUE1rO&9B)aOVLs8Y{ zZDh7;ZR$yh=0}G)@2g?`_5-?2(*YyTOOL%^>Muc)w?td8I3djQIU^LdGBV%Roa1TQ zZv!E2Rq;b`I5Y zf~}-{4SKskc=SCt7T#d~1I2yA#heOuM=(IGal@5$sq0Ik-Hu!~jj0{d#pXV|%fO|- z)2-Gjql0O*{OpiDXUk8{QaB37zHlryhO%giir)>6StxV9*9!kRlB@m`xbmmZ{=AnZ z{CGC-7Vf<4mHRFq)KlyJ@;sXenp^B|Jv zwWkuJlelZ#>5}VrMIZ9$9>*Tt#n_|cwlW%fYVf+Y)Z3#SZc{AZZAiYCc&f9Ru?aQ?pDBuLOuJ{<)Xp?nlsDa@ZN-6|w`c}}riRVH z^iF7%2X!Q_$7k$C_q^RRhxDDF{3-Pb%@ET&;jbpdBhx$GWfd3A;r~^c2T@FNW(EIm z*(N&n{rG?@_t7~WFN7d?3upn?bYgC~&maYMh^Rf?ptLEjw&5KsCAYy1i8p(w4@S!;V3eUZ#kBJYwXSn~@ z`RNPW>EoqT+ohp5q`n$D)%v z$0RSqG!^sojg{`Z|rj744#NC=QIxc z`^l~s?VfiVId3=F&-4B#p3n+7%|o_1k6wuzI*oI^UFl;2&u!pg_$+*d@FyuC4&13X zgty}Vlg1T1k5q&sS@4Bn$x*L~G=Dd`a`i?;lfGd^3tr?ihXu|2vOsh9C_t?@gR=Sx zre@Q{uo&fiCiQjJX0Md#txi# zi9O1^?omBeo|W!yL7e0wBe|4QpQLimdMVo?4I`K&lO=?SW947mv0r4-v@Lho4{Y+! z-@pbq>UUm!=k2%t`l;REA8tYaG;Q?Tes{Ybe52UbS{_&xE_gmhKX6L;E z-;4eu`1hau576@Peb*aG#%I;aJoVK-opbbOHyr}G9UK(i z`I%raify{*%P*}(U)cdxJby2+zIR>KCWBu^0~V&VUmx|*kgAQAjWaA>Ev(b<8UF(6ruOT~9Hq4vfN2Zrml#Nr#{E7so$ zfe0Zj7*R8%OIkMWS!m-*Qe!ZdJsH?vA zsUh31uQ~8{dzPwth-OEh2uNDj#n-I++*5q~_@7v=QOjsyuL5Dh$iQqU?65HBv_=lz zb7s6vWW%8>qzu)cpqXH#J(*w?F9o5{weQh$wmy1bF~tCi@B<`I9HYO+JV#!K81K$T zj?Jo&Y9yIfai-(YUt>c87-`OW;BiI_w$soPxQWV58{o*FkA9UlqP5es<6l zjrPphRUgzdDb<$_q=TB57Qr1u;Gr`=w4wnBBApNFwLPo5x>B5cDOE4%b|99>*L6gj zN6zfD)AjXvZ||DsOeh`F(jBogmux&MZ8R@Bt8>rCbjsFa+2v>S=kNc>@gIFc#WJNR zB-IE*dy%E^b#l~k@N~-=ms~YxzCQwaf1)!zc!?7S5Z**)C*e&zbH>bx<&=%H%A;8L zwd0F8{Ey}=&?>?er4*85ve-3CvVdjI#;nTX|CY5U&w?oE`K2Asn`34HCC`^S0nE5;8i{N!oVje?Gp?RpA$|IN!tGf=k}?*5hm+y) z_}h_LFOk_=&sj5;n#XMv8TXuKS5oT-s#&(Yb~GE(2{k1XP2-b;MY)8LTvDF(lijqE zo*FP!U=@35-c>a6cxMf;ry-^P*U*WZYC80l?;;%Pk8Y36@eNbCb8naQ*O2?h+yb9Q zGRk{)csv=G^v4ksWycucEGHi0H8oYKD7i-bp#-=d! z%vxduAOr@=vqtLT=0G(;xQGwT%2K5YS(qwh9c)#X}=6u zlWA)1y=s-pFqD;B+CrFjHPU~b!G(_y!T6HXcW&kLe95(TIZXz5Idt|ZohGou8e7E^QRTQ1MQx- zmz;Niu$oT!#3k(%oLiNh(Q$uMGT)BhJoKzgOSN;{p?Lhlk-gDtPaLB@hwf&c@Zpwn zml~aukl+$VM(jA32NAdD^pWP z@%jPVrNOmZRq*3V7Tm~P1;ZyvPXyr7vK!|a``o+G=kA))=XNNa#ytL$|KOCDl5Zmy z>nwD!yeIj|>3%tDl+GpM&;3Jmm-1vT@#H`E#0$ht;luwkxh#*B_}!9vva&y?v@j)M zdw|dI2D%@4PYanNJ?T?W6CJ{nKf{m5yuI-Tg_Bf*UGC9g{9JnC7;Q4odHi^`ErY51 zh@*npGFnNiC{8@!ri*dHRNLxkCz%?Ym@v`H+@5vmznvYC7XF{Zyl8>1w-46@Spc;3 zqK3}3wI)Szp}`JnBfM&u6{t*{)3`ug$EwZOEbQIVlk?FW%jcG#^}*#E+E~BTE!qv4 z#;uI1MBqjFL5^isUS%kPocr@Z$x4RLjtHi%&1E)SdH1$N?Ya%^XCJyGpWE@FE%fgO z*9ijL@Xwz=BYWm`mtMB6Jv(RJhO>uKb(h|8=})^<>idRGiAqp??7tSxN{3vOddo5uMRqA=&-Acjx8(uX20(rFWs-t)HBwm%6Iluogf6 zu9N-z<@u9oeEy@+@NK+VbXTVO`Qfh0oQU)JN66=2{QjSR631jZrznhhBOzz%hdW1_ zvMzpA-U3iOOCveUn)f{mXmL4hC(lt#=TzU<({@BsV;rlO4DXEhVme^I6Y-!T+Wo z@kk!SlfpCV+~lGbRe6@Xrt@>8#x z0eEzb!C)_@pXl|+V+8wGAsIf7;!4F6^{l{kFPp53b4vM4N3IP| zyf_63gCmJ`#VzA2z@=Af0L8Zse>!w0K(FAX3>IvWxatjk+j^4VVMfx~!Y6%F-OAo= zy{Q-5M83iDIl|wwLRK@ZpEG>kdY=@FL0+g`jnr`YDpAg{eqJ}gw^y$dXbwChsXJC( zf9=YV6+Gk$oBh^VtFF5SytTlqE&194qJssJ+QQN34K(}wR^zo7HWO_u5akx0W>uB! za`+K_E3&l%_;$<+^Kf}?d=_|!uPIxIGy_^n;PHr?i8k56K)-!RHYqp;v#h}3*KJEvA&-Aj?Mke zVUeSJ=_QT5JND5?U~+s>9i*yb%SK`&;an`_i{z`NFG+efEc=?Xpf?s1E1s0yUw{Z)WeM+VWlD6uxt&_GK~ucFS_~S+MZkQ-M2u(Gt&+(dJ!%*l1_$ML&k*8 zkXZ*u;ev^Mi8Dq>po|%@I8z=b^U|wlVYa@ULTpxsrSHWwWWSKTgof-5c?P@!Bc=Rh zZk>>Ri`2X}&AgsmN1Wz#PvB4eT$!@*pFgEMB11E;h>`1PIr zptFL6n-rN_a`vtOWvM!?E?JzBrjLccvAtJbsaSeO#Y)}{_)ZJ`##G;i<4G&?^A2%g~@#@`!9gPCF zx<#gFZ?yem(GV-uboz?OQMpYGg49ug98*QesS5YTaFH4D5@5oIcFB^lc0quD5ekfMD3ysD7E=ge@}szwm%&L-(=?FbdK9n6t; zb_bFb-fwDqc9)%Vg=nCp{x zxJYD7Mu0LUaOu1N>43k=5_HC^&RN{n#0$gCEDvaz=~*-oD`J9MVwDZEva*0xp_=lmR=8B2ltgPRP3P7(wMZO7-&l>5 zppWO7G57_D91om0#{7mm;%Ou~a%Vn_T)Q;Yse2MF#g#W~w%r})#}!jdXi?rf-0b&r zLqbFJ?B9<3uJGN9^L^kAu;zt-4M!oF-M5UwhxdK!-piNjy0qe|FYSHgUluE`l@BmJ znDGBR+8|X|e;aK2DOdvT8xdRMFB=icR6*;Ks~-E}xqH9!%z?otA4)N0oq&|HOBMN| zGOHr3s#i84>}WHznR7neJWMcE%jpL<|xvY))~cp54wygFGM@l;f?bHaRO zQ6D4DxlURileR=nRW17}&O;_gPewcNmldVSG5z3k^h`}Zp7Hex)6&W}RyA_mKy|*6 z=cb~If9R^tcX#Kj$92%@eD;&xFg*Ubr!4u~@n>F$KQn()w_$$q!xrUyJNm2(rg#sE zd$-7J4*|}!U+86CvV^El`LL(c!j+#b@;+C#~Pc2%-!dhR51``wq@h)uUqpa!i zBd>fr@hseB*vPTK+px)gm7-Hnx(~a7YInSe3G1+(wd2Gmp$H{0NqbViG(UMtoR?Y?ycoF|Jg&HbFDaz5&_R5sy*%Y^!y=Or60L4!NLI<{eP%|;y>V3kbs zwHX-Nd_fgB!{B7^oVA+d^>Ra1dd3TWzA?3ReIMSL9j@)J$(eV2n!bQGg^%Xn8N#_8 zAFT)B72f`pnYld)0kU5&ZqDxR;yCby0X@dE@t`&@KyMYQO?!B!sdB9En{EI9toggm zn&VySml6EznTQ_deb7=W39^~T-B^!7SIW%oa$gle_-;_T@O_{&2T3L`5xQ}y$p=NF z+QE^JK#&F^mzPw?0l!?!$<#L-NGd^f5>(yxUN{=!y(IM2avhutCy{_KiiC*1ph@gI zzaele<+%x;VlF15Jb!SyI9S${rxs2Px6KnJ$p*KljDCysSgn{&hgD^oX=eRZ`6A6d zN9ma6ep;Pmua~Bl#xOG%Vdkn+iJ6IcmeT~Ar4v#yrv^E{EKSpl^&SmZH|nNEV4 zCDZKaEQ)AmSh>y(q#AgBS{UgrIT!HM6yBu!nTI`hj-w-&O0seAUdg%fVY(uGoZV6A z!EbRHE8EB5Q$&wF&Sr@xXvg3CewLudk8s4+g%p+pl$yzNIOCKw1jETVH4EHut4u-f z+#7#?c`!T?RRQEzr@}w^-OuW{W-5w1$f!lD@6Yq=x$2Ju5T-a5{jRN3i(%A{pamF6 zQM9B6wEO%43S%qYUYAIiQC0JSjZy8|4;eNPS;@y~X~XA7AB$pfKB}>HzKRg3P!tGa zuvrL_C13*~-3ZZirtk;FG8F{2d?A-H?D}v>^#i|x!RA-^Dn076yk5psFy=Tz&jvfH zk_miY_ZI#O=1335=1P>YkS)QJyKuBT7dUAukYLhr$nZD1=#xKuh(qXGv~`HWgA4N; zw(Y{F)C7L{5-;S@AC6O}bjTk!4Nca%mlczK6eTeOa~+(D$-&Ks*6g{FVb^@*>GQ_= zr^#%?6@}l^e01?y%iFH;(+HOrc6jxAlHW5mE37D*Pjk|HKx71#r4j_R9hV*1JG6bp z@_mbP96e^gZb$a(>Qng!PKf9_PnR9rI2QTgz!pb-%Bitu`O>&h8nZdqy-N1w@&XJq$`48(vQkY+(FM=Qo~MqAd45Vk%hOoV(Y-Cw@6h_CXMI>3jd0n zB+ec;9L7!B>j8gWC_LV&iYi?DZB8i z!W)H87CtpE@{wa8_lch$Z-HXM@>!JnUxlAd*6+dWEZkrC{@PF6d&61nHEF8_9~~wr)&SNmErIgXLH4>OwR30D{>&PR ztv((IYifBTTPFZ^b2R+wq1J~7Q%X1rVJf&r6rrw&E$ePuSFLyWAeG6bKD47^#zP@o z>U*u`72P#WtNP;crR%%ehvpyu$`{t2yL`p=LbQ4AKw{qY=gkGR0Y7Zd>w?8Dy493| zRjk2oJbLKMofNSBdQj#2wsu~8!F*~ckg+LxTX~kXh_$&0YpZ97H8{~XpB119)1Sw@(;}8ST`cW6#aPly9Q4zLq2Ur=e%7(`{J5i!a8uaBO3aH0H>+m){uK++ z#jNivy?rZvg6uo2&^}gx1GT}VGHnpO-6Q19*k=rmhOF}W<*9KjJw~u}KH*840+!&E z?GlNH2vrSs(o@rV^Z1rjt@orM)u}m<@)?}$yUWWcj089P^{jZZz+zLul=6PaS`p0J z6#TPLZN@(D!+VB&|C&rWdGk@`$H>3B#&ej|hDs@BdAyh^ktFo9R0aJk;}jHJULQhL zi^0Vp-@FxXSwPM`RrXcFA%uBxCiTPU=NdRB9eHARdsSRka)dHTW&}VF(b3VjqVy00 zX-2Ec=AYNqqqe!d$q0_t9_!!gwH%4ryM7nM+3~Z-k!5 zFf^}L**Mn3+_*=>VTNmp)?h}{Cwz=pcyR(h1@hmvusIuZ{iN(FhLXg9oRVt!0C+SU zE{sHjEy1`CvNIU`MmQX0bhPB-=!d~{L$y{Ifbhdr{!o~~!^vzp(YmyyRRY(4E z-{P&u9w}TK4;c|q(+pS8TwOm8{Yvr-k&|R=@0!t96-oRmb$fZIvxCtB^RLW99@%pr z=|yrkfRf(z@~D!XfY|bov!cG!(Uv95xpr?cLgmN~(av$os-kHnU#h5i*cPQw-Y9Iu zJL2BZ`Fcpbj9{FJw(jk@u&PS(Wv!HLiV|doU}W^I7%W3^>)yT#5sban(b}NNv-eQ4 zQ0-Qe@`4Z0>1@DabK%F2h9VT#+S4dQNuWZ0ngN*{2686y#8crgq@sb|CK-K#jHps9 zG{p@1;UhXH!c^$EpxDPlqrF1bAEM}_on)Y{L}`7+vnJz zXQR`1Te^WwF9+;orKW!10JoyhgmFv)*cgPL|9$mQ!E2!3)_sNDg3Nw3+rDnVpkrx zZk+;m`FjpZPM5@d{^ZM;@K_{X#xy;`@12t`Vsd7kUtk(NdC$@*%{ssLAlu1L4Bz04 zuT>nkWPI%;$A_g!r`C#G`(dQpMN{OZuP9wjQ=5g--ORXdH!byPB~>eTuAY7i>8yJy zI;*V4O+iaNm8Uq#x%AJMeQvA^9J9BR?EX~lS!IMiU2VKIAts-mK312+<3*l>AkxQ_ zChaE{1*f2q+{C)xN$TWJPPl8}Xcu@E72bpbdapM)9wlgyw52z zWW!HjrSh$j8XNn43{7)Nd_<^LO`Z}MpUP=zzv>Suil(b``kP3>fLG{{Q6s=$v^|r6 zw}i}EBc>GHx1gElC_C65O&z}`7HADrX)Z@a;Z5q3%rl;qSOO07GgmHw%E}D+7pzMglGB#|nm|@Q(-R+lD$jR<7*mD%rO(g6`w&J88qi_^N5drJBk z*P%Q4dFE-4KsZwrXU4a&3d|L#ZYeE z$b$B4O=owf&H^9Yw=UAmuyqFdbIE-Ax|^@=O#U7r|P zf$<46@&`;CC)D*cy2=dPbk)$yYZRKlTN%3K?xh2D95dH(l-H-h(?FHH47LYJb4$bB zQ->C*a>#0D%rag4cd zY?sfJz%^;y%B;oEX>*|Spt`OEI_FFVokkAkFmzs?q_n^?4^9q^`DeWgG=N?ar=Pg2 z&`LePjCiu-y>>KQ7N<|taBi}5ffrXR40n%y<#T5b)N|aN8XS$U!y5C78gp1oC>d*W z^Wpp?t@12F}Q>#@023JxmL-54$}#;MdxY zIgrM0at<_*rweyX0{6ix&Htdcnw~7hV|4;2^G4WliqAO290YJe4)SGtv+ZZA0z#kN znafFq0`&9!GTq0~OjWGQ%lD@@2XCp4#v$K~(>*G~K0#9mVX_w1Ek6xY;r4w;BOy+z zbD%IE_<3*_owaO0>Hd%*`r5Dl5E%)o9bVCrEBwY1HtFLD%f;1!wD)i`4+7~RMFpvQ zS-{Pe)xz`DwLMjgRFkJ@5U^@E=!*xNLs9s_fLf!*y*dx5pdT9_DjG~f2RVh03Jec! zr*nY>ik|_D8(A3krv)+B-;^)>HW)a*uOz?urNt!wc5dM!nq@7|u;=U|-wuV_vvV-p z(V5Ow67INNyltJOnH{%Dz+v1b^Js3acdWq|{?d^7ox%K?dVj*OSd;n)D|kUtW*7Ec z7r!!JOXn8YLAcqxQlz=MRCxUr3BL`)+SR~@X10I+=GKvo4EMJ;D-wGbo#YN%g?=JK zRn%M&f*==_4`!O11wJHH(;y|=>@$xn+tvEz?|nZS)WJVrMBOsrtK!+1<(n6xd9Q!R zmeHpLj!$(gsEch`eC}80u|c`;TM-IRScMyqoT8sGHQp5y@+r~VOJ4(@C-rV3CFn{C z3CT$(j7iD$kSl#CcWY>woaimOEL>oOTjr#YU`$Sj_j@BCDZ=V_&;F{*Yw}!nULXJi z8;H%t=F&K;>Bb&pi5UquqcS&rePlhu9lc4FxI5V@?yw)&Y(zd7Ni_v{AtcRe{59Q~%2POjSRJ{5AfUBa64cG@rK}Av_*L*r+~HfKPHq z(91(+a!5vc+*<~nlf34%0|^^9PLz#BwZPq7)||Z7cJ*ieaCy*%T*E-S@|4QqN1MqY z%lK3T+0)i=-ZmKyfG3Qe9W5(co1+2!lJfPE?RV_Sqnl#ZK<P3wW3`Mh&{u}6orZD>%PLJ0nPk&RzI-9=uAOFe{yO_q9!^eq$%j=f9`Njpz)lS z)Qrfzp&`=I9Kzu^vG)j;XbD*a(tCt;0*fcbiZY6)!LOL3sIVpt+iWKI`|j(0LsXS+ zjw;+!3MGQyvQun+FAqeS|4dbE`}KZ0EBSu00ugfHArKZZeQiEn%C8mq5Flr75%hdwq>u@=i>1&L^Etf5xx~?+8i3U3^s21;Npl%yB=! zV;$%%LyG!uJk`;+K@n9iH(X_Akfs##zWOmu@m1mhtg1j0ef44^#=A;FQMMTvzR>V; zobpP0(zR_5A|3U)^M(^IQb`4=sHCEU;b^GHs|5Fkd{RxH-tuPW^}h%sy)+H9Do-&e z=+LU{fXTp2_z7)sUmzS|xK_tYcuMa*&%H+1jdbb5=x?l!Z4c%hZE&mC!@DBk2Ah;> zOyu%meN?j)e&`cK8}a#_tr_tBfsus^M;skc|3Y-oe9}57sa&6=_^U>`&=(pSyOD2w zQi4Bz?m%P1f&~qY_zlG}e*npR)4Sb@HXOlZo!wL&?|n(oH{fkY#6K)5TEmf*Irb-4p6BJCy zLP_j4=)>c>G_c0+7ub5yfC7}HwHnOz3?(-G8CQJbZ6h>5ziH#n@{7u$+9gkf3@|Jh3>LFFsFH$ zB*j+xJr1|#E_Z{)>~U+B`9-tGrTM3_vGSQyXAV@(oG&R{#QcK!IKt*FrxBYKUdmq& zp2xpd>h%Ot%IQYv+wlt5$>}$uZ--AKjBc4#j8?k6vj)@AH_G~tkQir-)WQcU`;dxu z^mc^R+fE}^Cyrou{uRyXbrXlVPdjEop>!}@EU~NG5oXVxP0Yecq(5u0{oy3CoVkhZ zs}K(5x%R{{6mY!m(OlV-IsGRgD?$udA}vfWI4&=$?2gYxA&xS4wJs?#yCP+#WcWp& z$ggSKg{0LLiMrBC`)j%E;t-Y=R1tuV6y>%3!;vOMp^74FT9ni&mfb_r+IRC&_!_#E z_NsGjm1DK9_9jOA*_eD_!O~J`oxjhOmgwV)(yGto6GeFin_31MV?}Xc|8GfQ7kPvB zjrqjF*tCbgV70op~^5qyV)?%I4N*q#l7HPjyhK5&%vO2^NaYK^33%Mvc21gKyj$1=gjhOC!`H#RP9 z;pn^(qG+fUIs{q$YFMw;B3>`#^8OG2NS<2?JK-pLKL(v{HA2rorIO=?4xh%6sj#M|KZ~ypdo9k1U#4+$YV?rgS2pDyC|*BbEv#AW(ot#xLKGj@G;~eR zInvNWK>%bGUJ9Q!6O9dBwf5-k+rE3xc~xCzz?EfyG>7M4+>}3_~Z&P1Rd|%o8HQ`&P-y+=73r>P3yP~~g8f?mbp`!29cCVtdCl zG;-s_j+LnrdZ$YoK1iL^(aU{AFLTL8>8Wj%Z!I$GzljQ+q|@xO9g zw3=yXi%yk;c}lp;cN5*sCzXl!VQMd5LQ;ObZ1G~aVgKOCysI7WM1@GWS$f2l=R>mV++H_^GPf&5~h;rlFi^w+x_?;u`}bz zx>Lr~_>5<2Y{;{iS7LD6<0hVpHJ)+)p*8vSJC?A2&sFVx@|IscxtqBwX!2*vY;EZG z&22w#H}t*df8>Pc@qw@di7i`oqwU{XuK1bXfGt$iv@J5}d7mDE8|mCfVl@GYg)#Kl zP>W#Pv`q@3wf|m!2rf1IFG|m;%ZCz%kBL!l&b#G<*I%-_K@4{0;Gdg==b!V*pN;+^ zs{NwM7oaINdd;_h{^9$8^}YQemZJSy;Z1MAP#14$w2VS76KKlB6~A98-0ZbXb#CO@`fl0QgIg<+wfGb^9Qno>@bb;FE z36>zjSZW!@ST5jT3?}icr|gav-^o+eHx#V=kHiVL+b0zgWv2+qqlpFTfh50HpTj~eJd8;ze^ zcTFsjV7NMeDqy0>MgUJBM~vou5hGwS-tNOyH&m^gB$z zm$V~)5tvHBx@7batjPzdVGAO)h=r%PMm4L3(HqL7ttdsou$^VO&EW9&p)@Tt~ zreIXh(}}L->&~p*^GcU)7x)&gp`4#^1cB`pW|ybK$-Cn{!#H+DP@={fvWsqiu7p(F zB+!EuoY-sgZ9e28^*4uee$^)rf3&rm%XS0;@Peq*VG@j~GQXx_$I4KPtcXBoa@)=t zxTwrX!>7a5b$W819t!D&6F)5c0DJI59}!jl@u12^<^78m*Qcu1rbL!owxhuZzF5I? zjj&O;h~B|GNU(9~DZmC(S=c%q@F?6^QDQ%35c#|EYCFjR!B>zi>L5L}Q^v@|66f?_ zQn;nEQDcfwdFRiS#m%A}xt(C;@>5|)CLx(S9dKEKndoHmu@XLlQwA9JA1k@)igsl? z!pzcX*_BC%9Hxhwt_e&8Q?@YAR4^{!^Wk}x%h3BXfM>%E9HBbH3h0r>b^-G&6o)O_ z+emzC*)f`RH?4FUZ5?Grk%tY_8(-M8>sCJtWTUF8vAWCuP?nE2F4=hP;sqP)pb^#* zhxXiL8oTz@_O(Vez>B$M+m5Wid`krSL)4vkeUiJBt_tk($#omH_C2sC+1pZElc-MA z8wX#jUB7kB!kjK9-cbCZAKZJEQYiHdgD0G@1JIej~i_(60HFKYExbAoL)m{8rr|&yp<;OQxsp;y#Z=jL!WnWW9^x1JK7chv$CN}v5tA!_4TRVwnV6Z?^!KpZ|vyP%vZhi^736GSf7`3 z2i;vF)6(Z;90@bkYkkS4>@m*Rndq1KNF^z*qvP)|BS^>Vr?2D5PCr9cgD>7V$sFc% zH4eW~&hG#`XBOUo`%nzC%j02+?O;V(cT&}L=7^p3x+&7Xi1ge#5ghbb@P^Rg(keOt zA$0+;6CEGMnCeDBT;CaK5gAD~L=^Pr7^bEkzbc$>`;e>vf7sFuZ`H!aOKvH{iLU>Mn&)IWwf^o^EZ40~b-n7*GbvGkO?u`os8s|s*3U5#kz@s=O0q=?lE;(^oarv&|ECx-PEK9&f-E1Rp z1PreUII|_wIeu(@#Jh`q)eU%eaimS;3|kR{W2=j4WeAF_DUAM)u?RiEq7QKei+L zv2ObIV-kAdnVOF;6_0M&MJGs{w)OaJIRi1i3&#s@(0|W7TC5d7XM%@nV901HausQ3 zGucqcy5N)r z%nW46wTVXsixxC97z(G+#hJ&;G>BL^mI;TOV^M*orP}cPWWB_MfFT!n8L-ZL@Eypm ze3{-v=7UL@rIbf@tY^xZ0DkW^=uYj*86tM69voy@;P)R7+6>q7sN$opBW0vRLY1Pc z{MyuIJu*iViD9!sjI?OsmFPBlEQpQPIH|iY7N;b|#w22aLtS)4HT*D0$#9>o*J{G( zZuBQUDv2~36K`%^EvV1%_V3K2inI!r^7*eTj81(8I^a57_(Y}d>qz>C1*RejRN^xXP){#&Rq(t1eoLOQ4+oPdy(6_{YO zAr%rBTBwipG-VJLO!>Gd10LKxf$!^MCw>Hz^q)N%i9IXpl@pNCQPx~XfG`mUkR^r5 zHM%S-{OYKg)d~n1e&`_M0Psl&8CC)TV}124^Ri8%1bd?~CTs^n5JpNAProVTEo=3; zwkputKQ<)_`%8cj5-<*WSG829BShQ5a%BV0e9by~Lc9(l)x99~+k+ z#{u%VlkaUf>ZHp7&(@P_l3%J8#&P-S}y!&h3zOe5WuGq-esf+*HR$7##~DQJa?hD<^^OYhD+?kB&-1CSin#y zrxhs0MMsHwKp<#)G{jU>0+(~;QmfGYW03H&>#J{_zc|EGoj~AGv)kQ^Ay18$7Q{MK2G$#|8D92oE1jg*ZA5I)&uHx2vws~%J`b&5O z0ha{Qz`UC!wPmLfQy>^&@U#^AI#v4h_a+fwE*EOFkfF*Php>TSt9hQLzKm*1G@G{~c<2xO^Q7bi z#T}A(8_2n{wL|hfg*^-VH0Qp{PHUIVU?$rXzd7kP>v24W-Hhr?@mNttJ}n3={B6bV zxKj&ENUF3#w;5YE=l7S1Y!I19*n$0^Mt3Aya&Gl0^bQWEqce&!@o?6X_ODF@|0!YY!N+S3!iMjk9L2ESGLzoP2Q>u=HyztC8OMVi~XE^zrmLTe)(e zwS*HLx|mvkFtv*?!Oaj=9ukog)17m96;9LRSZJ(ELMCAOQ;<$JbnwE^mUeyRsm9h# zQOk@*O>6VQhKBj`w=5(wb?_DTh{(e_6aCJ(Ou%e`%@HgNjGuXQVCHzcVoYxIG527j zpPfG3o*ffP5oh-yobB;kKMU6Dz1mz(3*6L-t{6)BAaC+s_AD)bsx2BNOwvMw{v|ht zz1?J&`PNgi&AeRLvtZ@6zgK_J46NPgyEhsE&zpr`GgmPW5iB|*r3j7`;gEk9N|{_c zPA`$R5C^XAn7)Ho7tfR#qg}khV%Iq{ClZHcknDL~g@ka2M%T#w%QEO6TCu3)x^1W#h>H(W=ntiN zUrML;lLOu=DTDA>cwq-G2QfL1saYW}2YAIdZ$4({p+#CSQr%~) zJAZux^=+=&oAd?|QXvfaF-HTY{>X6%+H%O7@K!UU7bf#-x`x|((>4aGP^YF8TaqE4 zv!cM6F)zGH-wKaK@) zTuj+~;kc1CgVf`U)>55knOv-OclY{e81k8w+FlT3U+}^~(PuU0SSBB--?lyqqa9Y)~FgflCY#Y#NNFg0?(FlC+7!0TSv2_iH&EOS2E@ALauHWSLM@-9>T ziQ|VRCezZwb9p@aKu7%5ytV82en|qG{BiK} z<>8DdX311U)SvX4`@S#B-;HML!z^Ee7Y%@z9q}=m7Sv*LoGR=I1q+v>KNt>%^g1)9 zF?38f0u*I{R0Y{Q<=Kkfzt1rvo^|9Vv|uJp!exS+&77)!8)j`RnGA4%t`KAEM8k#y zbj;1$Pq~W;NM18DQ9T^})tbQt^(?>Q;BzB;E)$W2TP|AGeP(AyVGjev;twmfS5P>9 zRqn=~wm#4oi>ZRQsrJ%K>o;-9jk*_J(em)Bd$)BmT&6~^vZ{m02H7ZlzbNVuDJH7i zIg$#W4$Zl2&EEg{#!ai|N zuoQCtAbEr7kl}|+K6cmjzIX--b$LzuFbuOGACRqBz=TXT9KW-$7uR5A^RcoTEb}l3 z+ewAdqP`lYU`G6fRl~tXfz8_pLU?=!GIo7BB{ATLKS24zp@dGufI)y8w$dEenk(!V z1aMn4Z9))oxNj@gwNjq$LL>Yagu7Lq^BmStj!KkpBpL2vWax5Vk4+3X=rdW&o#Jpq z=bSdwZ0EZg1o$eKA0Ddx_rkY(H`C1A#z0K23O@2BN@V*t_HJyBvow3anbi>z3ZD7N z-7v4Yr!5?kB!Ts1BWFHxUI*h{8Xn9ho8;jB^#=-?LK&&bNa4$I?ky1noXGey%(O*l$%@g(KpSgG)eZOX8o z&LAH;BlfM{3rriCZaHIx7?v`c3s8`KU{}B=(>cnodsQke_xs9vcv2&rr2DFn*Vmb* zc-DlgSdsNU6Jww$e!stW3+q+w2n1107rUAZ9x+I-K~AIg8CihM*J%mS;IuVb`1kRh04J$X<`3h0haFvZB3%y6jxJ00C(oWDuN&u6oVgY^m2fLM z`nw(JZ_zaF2^qG_P0*X>BJ>u2eXPSRjHd-~ma^MtilGuLxw z!cJ=7iJf?Yxt2LjwB14|xts}V>_Zl-d#pp{?l_&zPj)$KYuiO{o?jtF3)9XL0MT7Nf}kETfBgWy!W3B1ASBe zzYICCcW%cU%<))#u&UR#&fF0DjOg<#fs|1=Fz=gd`ad483s&{iZ`u%})`}|rg0|>0 zOZq=PzTf4DJNq=F-9hCo_Or62V{WPaRj0k6gG!WBT8!=I*yZke*>|e<29?R?w5@yj z`?9Rh>~DPeW$AOqc#xMu-^p$9a30lTqqiOBx*@=OH98E_?(9Imt=*R5uvno%s2TAn z@>tgciiq2DZO(#(qBoc*a{M^XvVj4|Is~Q393F^wX>Qt`{E>~RZCYS+ec^3h2SGu| zP~9|bCC{O|Y1T~DZeltH(;Nz#kA4i(a5i#3Ei&yf6MH-!Tu+|O8tJG> zHPg|;x8B*?KWOn8e!DU?Sr3>an6`2ZghmOuayV<6pS+{2A z{Tn`8M;UA@7t&;vx(le1$lqnYE=#^B`Z%n#q&5%~xG<+PUMzSX=|UQ;2?RMl!W&d( zg)i4!m$5H=_~>FS+S}L^29JD)dVr-HX)0#4&@qcT{sbG7=}V=#E7mu)NSyG}ybI20 ztH1uCm=OI zPxQob_8MeAMbF1PPmwJj*l^+pkeNVLh2=)zt#B4s4sc{qh|7ShTeuOXbG)Mpr;1?7 z)FE9yb=ZbSI-G72vQ~xfEbrK-1_5O-`(c17T*EMMU)bdPo7qh0_np`L0^fm_9g!4m z7k=cE_5zuaX^G+?VA}E`TN5d~9gpy0WA#8Pz);kALOxvwVK%lKtoZ3}I}Dp)mEW)^ z1Q*et>`dS9i%=W+%)M47s49?wamz5_5-R35{U{=)Xu%gTj^yYSJe)U>=&Gv@MOB-( zX&<_7r4wbfHua=L^P|I@_tmg|`vFXz6)^I=^w7GeTi2BlB&| zIi9BdMgS(P1kRxP(I2WgzK}&^cEv-kqQo3+q z=TI%ur;_qD=!^@bpc_&54d*wMph2$#YSXd~$D@RX*#; zl@2?WzY@>2+|;s2op`gT*V6MF<1!Vbpz8hbog7{L0Z9T(bm69pJ9b{~hXHokr}ma! ztc|xMp~+tPiA!%}7(Dzqtk8G`>)eKOFEN8^;VWgY#7?k(%gtLSTqo+snYq1H?0S~h zinEZkrgL~0^2Qw!E$q2r{5q{zAwd4&;xr_b<;aq=mbYDN(%VYk3)*ww#7pc^bazx_ zzg7@#DHb`e_#zaCbMd{P@IVtbLU>Tg(m7`yn;0Y4mqM3jd}P;6RhQiXu*IIgfwMX4 zcV2zx?YI2;somhETYmG&-KKy32G-AxnyT+2*w`y8w;xF15$%6`=-&O7H>25kS>Srn ze-Quvlm7u)|K=mt8cN1z)yjO~yJe_-^HAaS9Xu@}vo9?<=aWA>{&n<^n-7894h{s_V|UM_c5XwOwAegq#! z_)|PlBqz**$6^o_#l&>v+OkAK*nKfLmh@e^GEx9C*w|h-0C&`u(7hq=yWC#`y@D5+ zU$8~usyFm)>q&x#8A)dgpY%y}D|@%~re16l`3B4940Z2WA*&hI&lx^%y-$k8An#1s zUcO3{bF81&jnCmhA9IX^>)Wf>2{Z?uk<=ZluD^EW2r>d(VYA;lYt?nvfVUQSwIyF$ zK&HDFNNNj5Gpb_t`K`ulFKi~`wF^YK1zCJm1wSc^pefIW!X9`T^P*<}_jFIMm%VcA zZ-$-hz@9+tG=o0&Li_+9OXV}F4mkEcSW&?ZS_KE{jp3%Y{ z`g!K#o*Y%Yy)$bxep{^6KGy$DNdLIEw3W<47rRR*Zzt6! z>mZ##XI|1$THaRd^pKWy6^j|CZS-T68h83gOPh*G`)FxTvC}ttys`3Bfbh^K;j^CX z$+FO&B;ow~a?7Kb{x9^k)IPGK*fVL)9kfoCBBu|QXSe|{=>yc=%yy5CQ95BRlv+P= z!jsulKC%gbPVc7{GeM8x@;X&CJW=(Nv@0>e%AO+tWcqUO6Qa$VNw&DSjM_@fCm=d^t|oSJYi&!-NJq&=&anNv$La7 z;8wMwi_nO7!PKA|7xbqzTb6wtg*V9_8`>KZ>vdL5`!zqhGOFgASU*WUNU=X12du7YWAv zZwnWBzIoy)V@^_D*Hh;rXFn!f3#gum<$(Kbn&9jxW+NGS-t0u&8>g&(g}x-Pi$Uv4`4qZh2m z>$JGCaCsQgl%f75-q{#2gdFIF0i|$URw$8$q8NHLtTkPI#RE5+NXfK~#KR+Mn2&Q>KO;sYV@$nYI^oZDa3HN5G99i4@(gQ9V$3~krCsdrDTR=CnP;h-Eb>QUq(ao;XJDhI5g>>&Xfh3-OT3dr&i|%c=HtX#`l`oJ@xKxcUY=%@#%)iOHc5XHjR^rt; zX&DTvHT`iRuOmd>reuyj_p9rw+tqeoYpB*6pgL>UoAVy%j@R_=I=T%+1+P~qY#(ev zqOz(`2-*urQj82lXWd*wU z-iGjfh-`fRYa)C?JIw!@PQv?0*Gx_ZDbh!i!VUlN(5MZInXApXT@+Onz7^jXoUh5vzn_FD9_uTB252Shq; z!JqmAH2%f$1kxP-*_a>y1OM!P6!9O03G%ZgKZgbW3jM5Qlb?HMh4TxTaQ>tCA07ZY z>2B&=cEA%NodnLr4bejB4mWC(u&%wjH{zqI>StxyX65*W38*2v+0jjZv2AHE-`wo~ z;a23je>(z63n3>PoZjy>H*@?e(fkwX0N; zN~NVrDlMg5vaHRrEZefY+t_%;Hs0dUga(H|+L$GPLjxg%(1ef--JwZ3LlT;S>5!$F zUed`-K4zwqp&dH;`b($N-GmTgmFM2~swCM!Lh|YR?5elbedpYJ{&VmB&pG4=>Z-(k z@ZI|E8kK_SFY}5i2sMWilq%_g&K`l^M1M6@pT|!=!5B5x#7Rk|nN^(yQqa=3uly>w z*LRVua->&2yLjcpVSOo#Tix)iB-lJ7%7>D;*^Qvs&GYjY-G_hwBx6W5Jbt>LV#nO4 z6Wf60f*xar@$*TIr&0Mwz7^{nH_E~-RS{1bSkJ33xm+KQJ+P z^dr>LkVF39NMoCvw}cvNoJZ2$z<#8gs-mKUfk~c{_t+uM>Q=j2h6J&WPKQd+5aq|%V zK6=x=EK-G3u6}|GLcmijLR@g$hFDw2AnIyvuiv;e$b~7DV_g~S#xgiZzwLX_l|jJv zxEIZID(OmLIa7?AX2+$JxvN9%E+i12u%ojoo?<4sEFBn#QU$vzol4l4 z#C(Uu-3&EkN%^U8o)!lC4&0(dF4;jbkg? zrI>rqlADJ=bOF)fl*jXX2Hb=8Q>Kr1?RlKYHEyGs;A`bK9}Wh80HjaA@815x3%B3) z{PV8Q_@T=`rGDgl-6!}gUwnDZs*Vi5cl!u}?Im8AFLadjd2kVb=I7h5`n>S^ct`vA z_<@Nl|MR#%-?;n~_xE(!=lI%ulfJXQKP9XL4(pd>E=N&7qT{?Tkn{oy_l@?9=fA?G zW5m9Cxky~Xs@I_y%T50cNzY;2)$RgWiX^s>+)7p4V5WM_5~qQBDZ8n+Go∾u}&8 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

-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 WUL8|Bp%dZqoEr}tb+;0 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 Iqd5Qo0JA*Iga7~l literal 0 HcmV?d00001 diff --git a/pkg/nebula/assets/js/alpine.min.js b/nebula/assets/js/alpine.min.js similarity index 100% rename from pkg/nebula/assets/js/alpine.min.js rename to nebula/assets/js/alpine.min.js diff --git a/pkg/nebula/assets/js/dexie.min.js b/nebula/assets/js/dexie.min.js similarity index 100% rename from pkg/nebula/assets/js/dexie.min.js rename to nebula/assets/js/dexie.min.js diff --git a/pkg/nebula/assets/js/htmx.min.js b/nebula/assets/js/htmx.min.js similarity index 100% rename from pkg/nebula/assets/js/htmx.min.js rename to nebula/assets/js/htmx.min.js diff --git a/pkg/nebula/assets/js/sw.js b/nebula/assets/js/sw.js similarity index 100% rename from pkg/nebula/assets/js/sw.js rename to nebula/assets/js/sw.js diff --git a/pkg/nebula/bun.lockb b/nebula/bun.lockb similarity index 100% rename from pkg/nebula/bun.lockb rename to nebula/bun.lockb diff --git a/pkg/nebula/components/auth/forms/consent_privacy.templ b/nebula/components/auth/forms/consent_privacy.templ similarity index 100% rename from pkg/nebula/components/auth/forms/consent_privacy.templ rename to nebula/components/auth/forms/consent_privacy.templ diff --git a/pkg/nebula/components/auth/forms/consent_privacy_templ.go b/nebula/components/auth/forms/consent_privacy_templ.go similarity index 100% rename from pkg/nebula/components/auth/forms/consent_privacy_templ.go rename to nebula/components/auth/forms/consent_privacy_templ.go diff --git a/pkg/nebula/components/auth/forms/credential_assert.templ b/nebula/components/auth/forms/credential_assert.templ similarity index 100% rename from pkg/nebula/components/auth/forms/credential_assert.templ rename to nebula/components/auth/forms/credential_assert.templ diff --git a/pkg/nebula/components/auth/forms/credential_assert_templ.go b/nebula/components/auth/forms/credential_assert_templ.go similarity index 100% rename from pkg/nebula/components/auth/forms/credential_assert_templ.go rename to nebula/components/auth/forms/credential_assert_templ.go diff --git a/pkg/nebula/components/auth/forms/credential_register.templ b/nebula/components/auth/forms/credential_register.templ similarity index 100% rename from pkg/nebula/components/auth/forms/credential_register.templ rename to nebula/components/auth/forms/credential_register.templ diff --git a/pkg/nebula/components/auth/forms/credential_register_templ.go b/nebula/components/auth/forms/credential_register_templ.go similarity index 100% rename from pkg/nebula/components/auth/forms/credential_register_templ.go rename to nebula/components/auth/forms/credential_register_templ.go diff --git a/pkg/nebula/components/auth/forms/details_basic.templ b/nebula/components/auth/forms/details_basic.templ similarity index 100% rename from pkg/nebula/components/auth/forms/details_basic.templ rename to nebula/components/auth/forms/details_basic.templ diff --git a/pkg/nebula/components/auth/forms/details_basic_templ.go b/nebula/components/auth/forms/details_basic_templ.go similarity index 100% rename from pkg/nebula/components/auth/forms/details_basic_templ.go rename to nebula/components/auth/forms/details_basic_templ.go diff --git a/nebula/components/auth/modal.templ b/nebula/components/auth/modal.templ new file mode 100644 index 000000000..1cb4718fe --- /dev/null +++ b/nebula/components/auth/modal.templ @@ -0,0 +1,13 @@ +package auth + +import ( + "github.com/labstack/echo/v4" + "github.com/onsonr/sonr/nebula/components/auth/sections" + "github.com/onsonr/sonr/nebula/global/styles" +) + +templ Modal(c echo.Context) { + @styles.OpenModal("Account Registration", "Enter your account information below to create your account.") { + @sections.RegisterStart() + } +} diff --git a/nebula/components/auth/modal_templ.go b/nebula/components/auth/modal_templ.go new file mode 100644 index 000000000..b4abfe0d0 --- /dev/null +++ b/nebula/components/auth/modal_templ.go @@ -0,0 +1,64 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.778 +package auth + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "github.com/labstack/echo/v4" + "github.com/onsonr/sonr/nebula/components/auth/sections" + "github.com/onsonr/sonr/nebula/global/styles" +) + +func Modal(c echo.Context) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Err = sections.RegisterStart().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) + templ_7745c5c3_Err = styles.OpenModal("Account Registration", "Enter your account information below to create your account.").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/nebula/components/auth/route.go b/nebula/components/auth/route.go new file mode 100644 index 000000000..260bf49ee --- /dev/null +++ b/nebula/components/auth/route.go @@ -0,0 +1,18 @@ +package auth + +import ( + "github.com/labstack/echo/v4" + "github.com/onsonr/sonr/internal/ctx" +) + +func AuthorizeRoute(c echo.Context) error { + return ctx.RenderTempl(c, Modal(c)) +} + +func LoginRoute(c echo.Context) error { + return ctx.RenderTempl(c, Modal(c)) +} + +func RegisterRoute(c echo.Context) error { + return ctx.RenderTempl(c, Modal(c)) +} diff --git a/nebula/components/auth/sections/authorize.templ b/nebula/components/auth/sections/authorize.templ new file mode 100644 index 000000000..152e1b842 --- /dev/null +++ b/nebula/components/auth/sections/authorize.templ @@ -0,0 +1,17 @@ +package sections + +import ( + "github.com/onsonr/sonr/nebula/components/auth/forms" + "github.com/onsonr/sonr/nebula/global/styles" + "github.com/onsonr/sonr/nebula/global/ui" +) + +templ AuthorizeStart() { + @ui.Breadcrumbs() + @forms.BasicDetailsForm() + @styles.Spacer() +

+ + +
+} diff --git a/nebula/components/auth/sections/authorize_templ.go b/nebula/components/auth/sections/authorize_templ.go new file mode 100644 index 000000000..83a0ca845 --- /dev/null +++ b/nebula/components/auth/sections/authorize_templ.go @@ -0,0 +1,58 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.778 +package sections + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "github.com/onsonr/sonr/nebula/components/auth/forms" + "github.com/onsonr/sonr/nebula/global/styles" + "github.com/onsonr/sonr/nebula/global/ui" +) + +func AuthorizeStart() templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = ui.Breadcrumbs().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = forms.BasicDetailsForm().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = styles.Spacer().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/nebula/components/auth/sections/login.templ b/nebula/components/auth/sections/login.templ new file mode 100644 index 000000000..e8b596a0a --- /dev/null +++ b/nebula/components/auth/sections/login.templ @@ -0,0 +1,17 @@ +package sections + +import ( + "github.com/onsonr/sonr/nebula/components/auth/forms" + "github.com/onsonr/sonr/nebula/global/styles" + "github.com/onsonr/sonr/nebula/global/ui" +) + +templ LoginStart() { + @ui.Breadcrumbs() + @forms.BasicDetailsForm() + @styles.Spacer() +
+ + +
+} diff --git a/nebula/components/auth/sections/login_templ.go b/nebula/components/auth/sections/login_templ.go new file mode 100644 index 000000000..db440a0ee --- /dev/null +++ b/nebula/components/auth/sections/login_templ.go @@ -0,0 +1,58 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.778 +package sections + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "github.com/onsonr/sonr/nebula/components/auth/forms" + "github.com/onsonr/sonr/nebula/global/styles" + "github.com/onsonr/sonr/nebula/global/ui" +) + +func LoginStart() templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = ui.Breadcrumbs().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = forms.BasicDetailsForm().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = styles.Spacer().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/nebula/components/auth/sections/register.templ b/nebula/components/auth/sections/register.templ new file mode 100644 index 000000000..eccefd2e8 --- /dev/null +++ b/nebula/components/auth/sections/register.templ @@ -0,0 +1,17 @@ +package sections + +import ( + "github.com/onsonr/sonr/nebula/components/auth/forms" + "github.com/onsonr/sonr/nebula/global/styles" + "github.com/onsonr/sonr/nebula/global/ui" +) + +templ RegisterStart() { + @ui.Breadcrumbs() + @forms.BasicDetailsForm() + @styles.Spacer() +
+ + +
+} diff --git a/nebula/components/auth/sections/register_templ.go b/nebula/components/auth/sections/register_templ.go new file mode 100644 index 000000000..fa3458dc1 --- /dev/null +++ b/nebula/components/auth/sections/register_templ.go @@ -0,0 +1,58 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.778 +package sections + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import ( + "github.com/onsonr/sonr/nebula/components/auth/forms" + "github.com/onsonr/sonr/nebula/global/styles" + "github.com/onsonr/sonr/nebula/global/ui" +) + +func RegisterStart() templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + templ_7745c5c3_Err = ui.Breadcrumbs().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = forms.BasicDetailsForm().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = styles.Spacer().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/nebula/components/dash/page.templ b/nebula/components/dash/page.templ new file mode 100644 index 000000000..179a0fa8f --- /dev/null +++ b/nebula/components/dash/page.templ @@ -0,0 +1,15 @@ +package dash + +import ( + "github.com/onsonr/sonr/nebula/components/home/sections" + "github.com/onsonr/sonr/nebula/global/styles" +) + +templ View() { + @styles.LayoutNoBody("Sonr.ID", true) { + @sections.Header() + @sections.Lowlights() + @sections.CallToAction() + @sections.Footer() + } +} diff --git a/pkg/nebula/components/auth/modal_templ.go b/nebula/components/dash/page_templ.go similarity index 62% rename from pkg/nebula/components/auth/modal_templ.go rename to nebula/components/dash/page_templ.go index 31fe422e2..61b503086 100644 --- a/pkg/nebula/components/auth/modal_templ.go +++ b/nebula/components/dash/page_templ.go @@ -1,7 +1,7 @@ // Code generated by templ - DO NOT EDIT. // templ: version: v0.2.778 -package auth +package dash //lint:file-ignore SA4006 This context is only used if a nested component is present. @@ -9,13 +9,11 @@ import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" import ( - "github.com/labstack/echo/v4" - "github.com/onsonr/sonr/pkg/nebula/components/auth/forms" - "github.com/onsonr/sonr/pkg/nebula/global/styles" - "github.com/onsonr/sonr/pkg/nebula/global/ui" + "github.com/onsonr/sonr/nebula/components/home/sections" + "github.com/onsonr/sonr/nebula/global/styles" ) -func Modal(c echo.Context) templ.Component { +func View() templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -48,7 +46,7 @@ func Modal(c echo.Context) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = ui.Breadcrumbs().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = sections.Header().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -56,7 +54,7 @@ func Modal(c echo.Context) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = forms.BasicDetailsForm().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = sections.Lowlights().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -64,17 +62,21 @@ func Modal(c echo.Context) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = styles.Spacer().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = sections.CallToAction().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = sections.Footer().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } return templ_7745c5c3_Err }) - templ_7745c5c3_Err = styles.OpenModal("Account Registration", "Enter your account information below to create your account.").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + templ_7745c5c3_Err = styles.LayoutNoBody("Sonr.ID", true).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/nebula/components/dash/route.go b/nebula/components/dash/route.go new file mode 100644 index 000000000..2a039ff5f --- /dev/null +++ b/nebula/components/dash/route.go @@ -0,0 +1,10 @@ +package dash + +import ( + "github.com/labstack/echo/v4" + "github.com/onsonr/sonr/internal/ctx" +) + +func Route(c echo.Context) error { + return ctx.RenderTempl(c, View()) +} diff --git a/nebula/components/home/page.templ b/nebula/components/home/page.templ new file mode 100644 index 000000000..1f91b4a74 --- /dev/null +++ b/nebula/components/home/page.templ @@ -0,0 +1,19 @@ +package home + +import ( + "github.com/onsonr/sonr/nebula/components/home/sections" + "github.com/onsonr/sonr/nebula/global/styles" +) + +templ View() { + @styles.LayoutNoBody("Sonr.ID", true) { + @sections.Header() + @sections.Hero(hero) + @sections.Highlights(highlights) + @sections.Mission() + @sections.Architecture() + @sections.Lowlights() + @sections.CallToAction() + @sections.Footer() + } +} diff --git a/pkg/nebula/components/dash/page_templ.go b/nebula/components/home/page_templ.go similarity index 85% rename from pkg/nebula/components/dash/page_templ.go rename to nebula/components/home/page_templ.go index aa5ccb22b..e1df8e53e 100644 --- a/pkg/nebula/components/dash/page_templ.go +++ b/nebula/components/home/page_templ.go @@ -1,7 +1,7 @@ // Code generated by templ - DO NOT EDIT. // templ: version: v0.2.778 -package dash +package home //lint:file-ignore SA4006 This context is only used if a nested component is present. @@ -9,8 +9,8 @@ import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" import ( - "github.com/onsonr/sonr/pkg/nebula/components/home/sections" - "github.com/onsonr/sonr/pkg/nebula/global/styles" + "github.com/onsonr/sonr/nebula/components/home/sections" + "github.com/onsonr/sonr/nebula/global/styles" ) func View() templ.Component { @@ -54,7 +54,7 @@ func View() templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = sections.Highlights().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = sections.Hero(hero).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -62,7 +62,7 @@ func View() templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = sections.Features().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = sections.Highlights(highlights).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -70,7 +70,15 @@ func View() templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = sections.Bento().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = sections.Mission().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = sections.Architecture().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/nebula/components/home/route.go b/nebula/components/home/route.go new file mode 100644 index 000000000..bdd2c6cc4 --- /dev/null +++ b/nebula/components/home/route.go @@ -0,0 +1,10 @@ +package home + +import ( + "github.com/labstack/echo/v4" + "github.com/onsonr/sonr/internal/ctx" +) + +func Route(c echo.Context) error { + return ctx.RenderTempl(c, View()) +} diff --git a/pkg/nebula/components/home/sections/bento.templ b/nebula/components/home/sections/architecture.templ similarity index 99% rename from pkg/nebula/components/home/sections/bento.templ rename to nebula/components/home/sections/architecture.templ index 51ce476df..6f4fadcdd 100644 --- a/pkg/nebula/components/home/sections/bento.templ +++ b/nebula/components/home/sections/architecture.templ @@ -1,6 +1,6 @@ package sections -templ Bento() { +templ Architecture() {
diff --git a/pkg/nebula/components/home/sections/bento_templ.go b/nebula/components/home/sections/architecture_templ.go similarity index 99% rename from pkg/nebula/components/home/sections/bento_templ.go rename to nebula/components/home/sections/architecture_templ.go index 2c33d796e..50e4d3c56 100644 --- a/pkg/nebula/components/home/sections/bento_templ.go +++ b/nebula/components/home/sections/architecture_templ.go @@ -8,7 +8,7 @@ package sections import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -func Bento() templ.Component { +func Architecture() templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { diff --git a/pkg/nebula/components/home/sections/cta.templ b/nebula/components/home/sections/cta.templ similarity index 100% rename from pkg/nebula/components/home/sections/cta.templ rename to nebula/components/home/sections/cta.templ diff --git a/pkg/nebula/components/home/sections/cta_templ.go b/nebula/components/home/sections/cta_templ.go similarity index 100% rename from pkg/nebula/components/home/sections/cta_templ.go rename to nebula/components/home/sections/cta_templ.go diff --git a/pkg/nebula/components/home/sections/footer.templ b/nebula/components/home/sections/footer.templ similarity index 100% rename from pkg/nebula/components/home/sections/footer.templ rename to nebula/components/home/sections/footer.templ diff --git a/pkg/nebula/components/home/sections/footer_templ.go b/nebula/components/home/sections/footer_templ.go similarity index 100% rename from pkg/nebula/components/home/sections/footer_templ.go rename to nebula/components/home/sections/footer_templ.go diff --git a/pkg/nebula/components/home/sections/header.templ b/nebula/components/home/sections/header.templ similarity index 100% rename from pkg/nebula/components/home/sections/header.templ rename to nebula/components/home/sections/header.templ diff --git a/pkg/nebula/components/home/sections/header_templ.go b/nebula/components/home/sections/header_templ.go similarity index 100% rename from pkg/nebula/components/home/sections/header_templ.go rename to nebula/components/home/sections/header_templ.go diff --git a/pkg/nebula/components/home/sections/hero.templ b/nebula/components/home/sections/hero.templ similarity index 72% rename from pkg/nebula/components/home/sections/hero.templ rename to nebula/components/home/sections/hero.templ index ddd0bf671..a6a8b94fd 100644 --- a/pkg/nebula/components/home/sections/hero.templ +++ b/nebula/components/home/sections/hero.templ @@ -1,11 +1,11 @@ package sections import ( - "github.com/onsonr/sonr/pkg/nebula/global/ui" - "github.com/onsonr/sonr/pkg/nebula/models" + "github.com/onsonr/sonr/internal/orm/models" + "github.com/onsonr/sonr/nebula/global/ui" ) -templ SectionHero(hero *models.Hero) { +templ Hero(hero *models.Hero) {
@@ -33,7 +33,7 @@ templ SectionHero(hero *models.Hero) {
@heroImage(hero) - @stats() + @stats(hero.Stats)
@@ -41,7 +41,7 @@ templ SectionHero(hero *models.Hero) { templ heroImage(hero *models.Hero) { -
+
} -templ stats() { +templ stats(stats []*models.Stat) {
- -
-

0K

-

Assets packed with power beyond your imagination.

-
- -
-

0K

-

Assets packed with power beyond your imagination.

-
- -
-

0M+

-

Assets packed with power beyond your imagination.

-
- -
-

0K

-

Assets packed with power beyond your imagination.

-
+ for _, item := range stats { +
+

{ item.Value }{ item.Denom }

+

{ item.Label }

+
+ }
@counterAnimation()
diff --git a/pkg/nebula/components/home/sections/hero_templ.go b/nebula/components/home/sections/hero_templ.go similarity index 77% rename from pkg/nebula/components/home/sections/hero_templ.go rename to nebula/components/home/sections/hero_templ.go index 776705800..0b37dde62 100644 --- a/pkg/nebula/components/home/sections/hero_templ.go +++ b/nebula/components/home/sections/hero_templ.go @@ -9,11 +9,11 @@ import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" import ( - "github.com/onsonr/sonr/pkg/nebula/global/ui" - "github.com/onsonr/sonr/pkg/nebula/models" + "github.com/onsonr/sonr/internal/orm/models" + "github.com/onsonr/sonr/nebula/global/ui" ) -func SectionHero(hero *models.Hero) templ.Component { +func Hero(hero *models.Hero) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -41,7 +41,7 @@ func SectionHero(hero *models.Hero) templ.Component { var templ_7745c5c3_Var2 string templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(hero.TitleFirst) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/components/home/sections/hero.templ`, Line: 17, Col: 24} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 17, Col: 24} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { @@ -54,7 +54,7 @@ func SectionHero(hero *models.Hero) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(hero.TitleEmphasis) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/components/home/sections/hero.templ`, Line: 19, Col: 28} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 19, Col: 28} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -67,7 +67,7 @@ func SectionHero(hero *models.Hero) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(hero.TitleSecond) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/components/home/sections/hero.templ`, Line: 24, Col: 25} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 24, Col: 25} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { @@ -80,7 +80,7 @@ func SectionHero(hero *models.Hero) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(hero.Subtitle) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/components/home/sections/hero.templ`, Line: 27, Col: 22} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 27, Col: 22} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -106,7 +106,7 @@ func SectionHero(hero *models.Hero) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = stats().Render(ctx, templ_7745c5c3_Buffer) + templ_7745c5c3_Err = stats(hero.Stats).Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -139,14 +139,14 @@ func heroImage(hero *models.Hero) templ.Component { templ_7745c5c3_Var6 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

0K

Assets packed with power beyond your imagination.

0K

Assets packed with power beyond your imagination.

0M+

Assets packed with power beyond your imagination.

0K

Assets packed with power beyond your imagination.

") + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + for _, item := range stats { + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var11 string + templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(item.Value) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 61, Col: 145} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(item.Denom) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 61, Col: 166} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var13 string + templ_7745c5c3_Var13, templ_7745c5c3_Err = templ.JoinStringErrs(item.Label) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/hero.templ`, Line: 62, Col: 50} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var13)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/pkg/nebula/components/home/sections/highlights.templ b/nebula/components/home/sections/highlights.templ similarity index 97% rename from pkg/nebula/components/home/sections/highlights.templ rename to nebula/components/home/sections/highlights.templ index 21d9c9929..df376f838 100644 --- a/pkg/nebula/components/home/sections/highlights.templ +++ b/nebula/components/home/sections/highlights.templ @@ -1,6 +1,8 @@ package sections -templ Highlights() { +import "github.com/onsonr/sonr/internal/orm/models" + +templ Highlights(highlights *models.Highlights) {
@@ -9,11 +11,10 @@ templ Highlights() {

- The Internet Rebuilt for You + { highlights.Heading }

- Sonr is a comprehensive system for Identity Management which proteects users across their digital personas while - providing Developers a cost-effective solution for decentralized authentication. + { highlights.Subtitle }

diff --git a/nebula/components/home/sections/highlights_templ.go b/nebula/components/home/sections/highlights_templ.go new file mode 100644 index 000000000..a2d818def --- /dev/null +++ b/nebula/components/home/sections/highlights_templ.go @@ -0,0 +1,68 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.2.778 +package sections + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +import "github.com/onsonr/sonr/internal/orm/models" + +func Highlights(highlights *models.Highlights) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var2 string + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(highlights.Heading) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/highlights.templ`, Line: 14, Col: 26} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(highlights.Subtitle) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/components/home/sections/highlights.templ`, Line: 17, Col: 27} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

\"Feature
\"Feature
\"Feature
\"Feature
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/pkg/nebula/components/home/sections/lowlights.templ b/nebula/components/home/sections/lowlights.templ similarity index 100% rename from pkg/nebula/components/home/sections/lowlights.templ rename to nebula/components/home/sections/lowlights.templ diff --git a/pkg/nebula/components/home/sections/lowlights_templ.go b/nebula/components/home/sections/lowlights_templ.go similarity index 100% rename from pkg/nebula/components/home/sections/lowlights_templ.go rename to nebula/components/home/sections/lowlights_templ.go diff --git a/pkg/nebula/components/home/sections/features.templ b/nebula/components/home/sections/mission.templ similarity index 99% rename from pkg/nebula/components/home/sections/features.templ rename to nebula/components/home/sections/mission.templ index 0a4828fcb..8e7b7eb8e 100644 --- a/pkg/nebula/components/home/sections/features.templ +++ b/nebula/components/home/sections/mission.templ @@ -1,7 +1,6 @@ package sections - -templ Features() { +templ Mission() {
function createCredential() { diff --git a/pkg/nebula/global/state/authenticator_templ.go b/nebula/global/state/credentials_templ.go similarity index 98% rename from pkg/nebula/global/state/authenticator_templ.go rename to nebula/global/state/credentials_templ.go index 1c094100c..3790d28c4 100644 --- a/pkg/nebula/global/state/authenticator_templ.go +++ b/nebula/global/state/credentials_templ.go @@ -8,10 +8,6 @@ package state import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -func UseNavigatorCredentials() { - templ.NewOnceHandle().Once() -} - func NavigatorCredentialsCreate() templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context diff --git a/pkg/nebula/global/state/store.templ b/nebula/global/state/database.templ similarity index 100% rename from pkg/nebula/global/state/store.templ rename to nebula/global/state/database.templ diff --git a/pkg/nebula/global/state/store_templ.go b/nebula/global/state/database_templ.go similarity index 100% rename from pkg/nebula/global/state/store_templ.go rename to nebula/global/state/database_templ.go diff --git a/pkg/nebula/global/state/worker.templ b/nebula/global/state/worker.templ similarity index 100% rename from pkg/nebula/global/state/worker.templ rename to nebula/global/state/worker.templ diff --git a/pkg/nebula/global/state/worker_templ.go b/nebula/global/state/worker_templ.go similarity index 100% rename from pkg/nebula/global/state/worker_templ.go rename to nebula/global/state/worker_templ.go diff --git a/pkg/nebula/global/styles/globals.css b/nebula/global/styles/globals.css similarity index 87% rename from pkg/nebula/global/styles/globals.css rename to nebula/global/styles/globals.css index ed929e5e0..40e044a5f 100644 --- a/pkg/nebula/global/styles/globals.css +++ b/nebula/global/styles/globals.css @@ -10,6 +10,25 @@ display: none; } +@layer base { + @font-face { + font-family: "ZT Bros Oskon 90s"; + font-style: italic; + font-weight: bold; + font-display: swap; + src: url(https://cdn.sonr.id/fonts/ZTBrosOskon90s-BoldSemExpIta.woff2) + format("woff2"); + } + @font-face { + font-family: "ZT Bros Oskon 90s"; + font-style: normal; + font-weight: bold; + font-display: swap; + src: url(https://cdn.sonr.id/fonts/ZTBrosOskon90s-BoldSemExp.woff2) + format("woff2"); + } +} + /* Custom styles */ .form-input:focus, .form-textarea:focus, diff --git a/pkg/nebula/global/styles/layout.templ b/nebula/global/styles/layout.templ similarity index 84% rename from pkg/nebula/global/styles/layout.templ rename to nebula/global/styles/layout.templ index a60c2d2e7..d82b8318d 100644 --- a/pkg/nebula/global/styles/layout.templ +++ b/nebula/global/styles/layout.templ @@ -1,7 +1,5 @@ package styles -import "strings" - type Icon interface { Render() templ.Component } @@ -30,6 +28,7 @@ templ Layout(title string, remote bool) { + @Fonts() @Styles() @Htmx() @Alpine() @@ -54,6 +53,7 @@ templ LayoutNoBody(title string, remote bool) { + @Fonts() @Styles() @Htmx() @Alpine() @@ -122,35 +122,3 @@ templ OpenModal(title, description string) {
} - -func clsxMerge(variants ...Variant) templ.Attributes { - combinedAttrs := templ.Attributes{} - var classElements []string - - for _, variant := range variants { - attrs := variant.Attributes() - if class, ok := attrs["class"].(string); ok { - classElements = append(classElements, strings.Fields(class)...) - } - for key, value := range attrs { - if key != "class" { - combinedAttrs[key] = value - } - } - } - - if len(classElements) > 0 { - combinedAttrs["class"] = strings.Join(classElements, " ") - } - return combinedAttrs -} - -func clsxBuilder(classes ...string) templ.Attributes { - if len(classes) == 0 { - return templ.Attributes{} - } - class := strings.Join(classes, " ") - return templ.Attributes{ - "class": class, - } -} diff --git a/pkg/nebula/global/styles/layout_templ.go b/nebula/global/styles/layout_templ.go similarity index 92% rename from pkg/nebula/global/styles/layout_templ.go rename to nebula/global/styles/layout_templ.go index ca5b3c3fc..0076fc4fe 100644 --- a/pkg/nebula/global/styles/layout_templ.go +++ b/nebula/global/styles/layout_templ.go @@ -8,8 +8,6 @@ package styles import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import "strings" - type Icon interface { Render() templ.Component } @@ -146,6 +144,10 @@ func Layout(title string, remote bool) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } + templ_7745c5c3_Err = Fonts().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } templ_7745c5c3_Err = Styles().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err @@ -165,7 +167,7 @@ func Layout(title string, remote bool) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/styles/layout.templ`, Line: 39, Col: 17} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/styles/layout.templ`, Line: 38, Col: 17} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -212,6 +214,10 @@ func LayoutNoBody(title string, remote bool) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } + templ_7745c5c3_Err = Fonts().Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } templ_7745c5c3_Err = Styles().Render(ctx, templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err @@ -231,7 +237,7 @@ func LayoutNoBody(title string, remote bool) templ.Component { var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/styles/layout.templ`, Line: 63, Col: 17} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/styles/layout.templ`, Line: 63, Col: 17} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -281,7 +287,7 @@ func OpenModal(title, description string) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/styles/layout.templ`, Line: 111, Col: 47} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/styles/layout.templ`, Line: 111, Col: 47} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { @@ -294,7 +300,7 @@ func OpenModal(title, description string) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(description) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/styles/layout.templ`, Line: 117, Col: 22} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/styles/layout.templ`, Line: 117, Col: 22} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { @@ -316,36 +322,4 @@ func OpenModal(title, description string) templ.Component { }) } -func clsxMerge(variants ...Variant) templ.Attributes { - combinedAttrs := templ.Attributes{} - var classElements []string - - for _, variant := range variants { - attrs := variant.Attributes() - if class, ok := attrs["class"].(string); ok { - classElements = append(classElements, strings.Fields(class)...) - } - for key, value := range attrs { - if key != "class" { - combinedAttrs[key] = value - } - } - } - - if len(classElements) > 0 { - combinedAttrs["class"] = strings.Join(classElements, " ") - } - return combinedAttrs -} - -func clsxBuilder(classes ...string) templ.Attributes { - if len(classes) == 0 { - return templ.Attributes{} - } - class := strings.Join(classes, " ") - return templ.Attributes{ - "class": class, - } -} - var _ = templruntime.GeneratedTemplate diff --git a/pkg/nebula/global/styles/scripts.templ b/nebula/global/styles/scripts.templ similarity index 67% rename from pkg/nebula/global/styles/scripts.templ rename to nebula/global/styles/scripts.templ index 9cc29c2c1..b5a185990 100644 --- a/pkg/nebula/global/styles/scripts.templ +++ b/nebula/global/styles/scripts.templ @@ -11,6 +11,11 @@ var ( htmxHandle = templ.NewOnceHandle() ) +templ Fonts() { + + +} + templ Styles() { } diff --git a/pkg/nebula/global/styles/scripts_templ.go b/nebula/global/styles/scripts_templ.go similarity index 68% rename from pkg/nebula/global/styles/scripts_templ.go rename to nebula/global/styles/scripts_templ.go index 49acdd3b3..5d5734639 100644 --- a/pkg/nebula/global/styles/scripts_templ.go +++ b/nebula/global/styles/scripts_templ.go @@ -19,7 +19,7 @@ var ( htmxHandle = templ.NewOnceHandle() ) -func Styles() templ.Component { +func Fonts() templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -40,16 +40,45 @@ func Styles() templ.Component { templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return templ_7745c5c3_Err + }) +} + +func Styles() templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var2 := templ.GetChildren(ctx) + if templ_7745c5c3_Var2 == nil { + templ_7745c5c3_Var2 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" @@ -14,7 +14,6 @@ templ SecondaryButton(href string, text string) {
} - type button struct { variant styles.Variant hxGet string diff --git a/pkg/nebula/global/ui/button_templ.go b/nebula/global/ui/button_templ.go similarity index 93% rename from pkg/nebula/global/ui/button_templ.go rename to nebula/global/ui/button_templ.go index 315dc1fce..03cf22dd7 100644 --- a/pkg/nebula/global/ui/button_templ.go +++ b/nebula/global/ui/button_templ.go @@ -8,7 +8,7 @@ package ui import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import "github.com/onsonr/sonr/pkg/nebula/global/styles" +import "github.com/onsonr/sonr/nebula/global/styles" func PrimaryButton(href string, text string) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { @@ -38,7 +38,7 @@ func PrimaryButton(href string, text string) templ.Component { var templ_7745c5c3_Var2 string templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(href) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 7, Col: 124} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 7, Col: 124} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { @@ -51,7 +51,7 @@ func PrimaryButton(href string, text string) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(text) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 7, Col: 133} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 7, Col: 133} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -93,7 +93,7 @@ func SecondaryButton(href string, text string) templ.Component { var templ_7745c5c3_Var5 string templ_7745c5c3_Var5, templ_7745c5c3_Err = templ.JoinStringErrs(href) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 13, Col: 123} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 13, Col: 123} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var5)) if templ_7745c5c3_Err != nil { @@ -106,7 +106,7 @@ func SecondaryButton(href string, text string) templ.Component { var templ_7745c5c3_Var6 string templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(text) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 13, Col: 132} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 13, Col: 132} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) if templ_7745c5c3_Err != nil { @@ -269,7 +269,7 @@ func renderHxGetButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxGet) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 101, Col: 25} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 100, Col: 25} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { @@ -282,7 +282,7 @@ func renderHxGetButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var10 string templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxTarget) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 101, Col: 69} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 100, Col: 69} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10)) if templ_7745c5c3_Err != nil { @@ -295,7 +295,7 @@ func renderHxGetButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var11 string templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxTrigger) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 101, Col: 96} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 100, Col: 96} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11)) if templ_7745c5c3_Err != nil { @@ -308,7 +308,7 @@ func renderHxGetButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var12 string templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxSwap) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 101, Col: 117} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 100, Col: 117} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) if templ_7745c5c3_Err != nil { @@ -366,7 +366,7 @@ func renderHxPostButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var14 string templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxPost) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 107, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 106, Col: 27} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var14)) if templ_7745c5c3_Err != nil { @@ -379,7 +379,7 @@ func renderHxPostButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxTarget) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 107, Col: 52} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 106, Col: 52} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { @@ -392,7 +392,7 @@ func renderHxPostButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxTrigger) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 107, Col: 79} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 106, Col: 79} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { @@ -405,7 +405,7 @@ func renderHxPostButton(c *button, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var17 string templ_7745c5c3_Var17, templ_7745c5c3_Err = templ.JoinStringErrs(c.hxSwap) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/button.templ`, Line: 107, Col: 100} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/button.templ`, Line: 106, Col: 100} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var17)) if templ_7745c5c3_Err != nil { diff --git a/pkg/nebula/global/ui/card.templ b/nebula/global/ui/card.templ similarity index 97% rename from pkg/nebula/global/ui/card.templ rename to nebula/global/ui/card.templ index 7e70704f2..912016170 100644 --- a/pkg/nebula/global/ui/card.templ +++ b/nebula/global/ui/card.templ @@ -1,6 +1,6 @@ package ui -import "github.com/onsonr/sonr/pkg/nebula/global/styles" +import "github.com/onsonr/sonr/nebula/global/styles" func Card(id string, size styles.Size) templ.Component { return renderCard(id, size.CardAttributes()) diff --git a/pkg/nebula/global/ui/card_templ.go b/nebula/global/ui/card_templ.go similarity index 97% rename from pkg/nebula/global/ui/card_templ.go rename to nebula/global/ui/card_templ.go index 9d8188b80..90e9c406a 100644 --- a/pkg/nebula/global/ui/card_templ.go +++ b/nebula/global/ui/card_templ.go @@ -8,7 +8,7 @@ package ui import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import "github.com/onsonr/sonr/pkg/nebula/global/styles" +import "github.com/onsonr/sonr/nebula/global/styles" func Card(id string, size styles.Size) templ.Component { return renderCard(id, size.CardAttributes()) @@ -42,7 +42,7 @@ func renderCard(id string, attrs templ.Attributes) templ.Component { var templ_7745c5c3_Var2 string templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(id) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/card.templ`, Line: 10, Col: 13} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/card.templ`, Line: 10, Col: 13} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { diff --git a/pkg/nebula/global/ui/icons.templ b/nebula/global/ui/icons.templ similarity index 100% rename from pkg/nebula/global/ui/icons.templ rename to nebula/global/ui/icons.templ diff --git a/pkg/nebula/global/ui/icons_templ.go b/nebula/global/ui/icons_templ.go similarity index 100% rename from pkg/nebula/global/ui/icons_templ.go rename to nebula/global/ui/icons_templ.go diff --git a/pkg/nebula/global/ui/panel.templ b/nebula/global/ui/panel.templ similarity index 100% rename from pkg/nebula/global/ui/panel.templ rename to nebula/global/ui/panel.templ diff --git a/pkg/nebula/global/ui/panel_templ.go b/nebula/global/ui/panel_templ.go similarity index 97% rename from pkg/nebula/global/ui/panel_templ.go rename to nebula/global/ui/panel_templ.go index ce84cd57b..f3d677983 100644 --- a/pkg/nebula/global/ui/panel_templ.go +++ b/nebula/global/ui/panel_templ.go @@ -100,7 +100,7 @@ func breadcrumbItem(title string, active bool) templ.Component { var templ_7745c5c3_Var3 string templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/panel.templ`, Line: 26, Col: 126} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/panel.templ`, Line: 26, Col: 126} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) if templ_7745c5c3_Err != nil { @@ -118,7 +118,7 @@ func breadcrumbItem(title string, active bool) templ.Component { var templ_7745c5c3_Var4 string templ_7745c5c3_Var4, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `pkg/nebula/global/ui/panel.templ`, Line: 28, Col: 118} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `nebula/global/ui/panel.templ`, Line: 28, Col: 118} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var4)) if templ_7745c5c3_Err != nil { diff --git a/pkg/nebula/package.json b/nebula/package.json similarity index 67% rename from pkg/nebula/package.json rename to nebula/package.json index 3ce73e18d..04e124ec2 100644 --- a/pkg/nebula/package.json +++ b/nebula/package.json @@ -2,10 +2,9 @@ "name": "@onsonr/nebula", "version": "0.0.2", "scripts": { - "fetch:deps": "bun run .deps.mjs", + "fetch:deps": "bun run deps.mjs", "build:css": "bunx tailwindcss -i ./global/styles/globals.css -o ./assets/css/styles.css", - "build": "bun run fetch:deps && bun run build:css", - "watch": "bunx tailwindcss -i ./global/styles/globals.css -o ./assets/css/styles.css --watch" + "build": "bun run fetch:deps && bun run build:css" }, "dependencies": { "node-fetch": "^3.3.2", diff --git a/pkg/nebula/tailwind.config.js b/nebula/tailwind.config.js similarity index 100% rename from pkg/nebula/tailwind.config.js rename to nebula/tailwind.config.js diff --git a/pkg/dwn/embed.go b/pkg/dwn/embed.go deleted file mode 100644 index 30e008568..000000000 --- a/pkg/dwn/embed.go +++ /dev/null @@ -1,64 +0,0 @@ -package dwn - -import ( - "bytes" - "context" - _ "embed" - "encoding/json" - - "github.com/ipfs/boxo/files" - "github.com/onsonr/sonr/pkg/dwn/gen" - "github.com/onsonr/sonr/pkg/nebula/routes" -) - -//go:embed app.wasm -var dwnWasmData []byte - -//go:embed sw.js -var swJSData []byte - -var ( - dwnWasmFile = files.NewBytesFile(dwnWasmData) - swJSFile = files.NewBytesFile(swJSData) -) - -// NewVaultDirectory creates a new directory with the default files -func NewVaultDirectory(cnfg *gen.Config) (files.Node, error) { - dwnJSON, err := json.Marshal(cnfg) - if err != nil { - return nil, err - } - - w := bytes.NewBuffer(nil) - err = routes.IndexFile().Render(context.Background(), w) - if err != nil { - return nil, err - } - fileMap := map[string]files.Node{ - "config.json": files.NewBytesFile(dwnJSON), - "sw.js": swJSFile, - "app.wasm": dwnWasmFile, - "index.html": files.NewBytesFile(w.Bytes()), - } - return files.NewMapDirectory(fileMap), nil -} - -// Use IndexHTML template to generate the index file -func IndexHTMLFile() (files.Node, error) { - w := bytes.NewBuffer(nil) - err := routes.IndexFile().Render(context.Background(), w) - if err != nil { - return nil, err - } - indexData := w.Bytes() - return files.NewBytesFile(indexData), nil -} - -// MarshalConfigFile uses the config template to generate the dwn config file -func MarshalConfigFile(c *gen.Config) (files.Node, error) { - dwnConfigData, err := json.Marshal(c) - if err != nil { - return nil, err - } - return files.NewBytesFile(dwnConfigData), nil -} diff --git a/pkg/nebula/components/auth/modal.templ b/pkg/nebula/components/auth/modal.templ deleted file mode 100644 index 53a97b9bb..000000000 --- a/pkg/nebula/components/auth/modal.templ +++ /dev/null @@ -1,21 +0,0 @@ -package auth - -import ( - "github.com/labstack/echo/v4" - "github.com/onsonr/sonr/pkg/nebula/global/styles" - "github.com/onsonr/sonr/pkg/nebula/global/ui" - "github.com/onsonr/sonr/pkg/nebula/components/auth/forms" -) - -templ Modal(c echo.Context) { - @styles.OpenModal("Account Registration", "Enter your account information below to create your account.") { - @ui.Breadcrumbs() - @forms.BasicDetailsForm() - @styles.Spacer() -
- - -
- } -} - diff --git a/pkg/nebula/components/dash/page.templ b/pkg/nebula/components/dash/page.templ deleted file mode 100644 index e228c5075..000000000 --- a/pkg/nebula/components/dash/page.templ +++ /dev/null @@ -1,18 +0,0 @@ -package dash - -import ( - "github.com/onsonr/sonr/pkg/nebula/components/home/sections" - "github.com/onsonr/sonr/pkg/nebula/global/styles" -) - -templ View() { - @styles.LayoutNoBody("Sonr.ID", true) { - @sections.Header() - @sections.Highlights() - @sections.Features() - @sections.Bento() - @sections.Lowlights() - @sections.CallToAction() - @sections.Footer() - } -} diff --git a/pkg/nebula/components/home/page.templ b/pkg/nebula/components/home/page.templ deleted file mode 100644 index 4c8578b58..000000000 --- a/pkg/nebula/components/home/page.templ +++ /dev/null @@ -1,39 +0,0 @@ -package home - -import ( - "github.com/onsonr/sonr/pkg/nebula/components/home/sections" - "github.com/onsonr/sonr/pkg/nebula/global/styles" - "github.com/onsonr/sonr/pkg/nebula/models" -) - -var hero = models.Hero{ - TitleFirst: "Simplified", - TitleEmphasis: "self-custody", - TitleSecond: "for everyone", - Subtitle: "Sonr is a modern re-imagination of online user identity, empowering users to take ownership of their digital footprint and unlocking a new era of self-sovereignty.", - PrimaryButton: &models.Button{Text: "Get Started", Href: "/register"}, - SecondaryButton: &models.Button{Text: "Learn More", Href: "/about"}, - Image: &models.Image{ - Src: "https://cdn.sonr.id/img/hero-clipped.svg", - Width: "500", - Height: "500", - }, - Stats: []*models.Stat{ - {Value: "476K", Label: "Assets packed with power beyond your imagination."}, - {Value: "1.44K", Label: "Assets packed with power beyond your imagination."}, - {Value: "1.5M+", Label: "Assets packed with power beyond your imagination."}, - }, -} - -templ View() { - @styles.LayoutNoBody("Sonr.ID", true) { - @sections.Header() - @sections.SectionHero(&hero) - @sections.Highlights() - @sections.Features() - @sections.Bento() - @sections.Lowlights() - @sections.CallToAction() - @sections.Footer() - } -} diff --git a/pkg/nebula/components/home/page_templ.go b/pkg/nebula/components/home/page_templ.go deleted file mode 100644 index 89b3a54e8..000000000 --- a/pkg/nebula/components/home/page_templ.go +++ /dev/null @@ -1,139 +0,0 @@ -// Code generated by templ - DO NOT EDIT. - -// templ: version: v0.2.778 -package home - -//lint:file-ignore SA4006 This context is only used if a nested component is present. - -import "github.com/a-h/templ" -import templruntime "github.com/a-h/templ/runtime" - -import ( - "github.com/onsonr/sonr/pkg/nebula/components/home/sections" - "github.com/onsonr/sonr/pkg/nebula/global/styles" - "github.com/onsonr/sonr/pkg/nebula/models" -) - -var hero = models.Hero{ - TitleFirst: "Simplified", - TitleEmphasis: "self-custody", - TitleSecond: "for everyone", - Subtitle: "Sonr is a modern re-imagination of online user identity, empowering users to take ownership of their digital footprint and unlocking a new era of self-sovereignty.", - PrimaryButton: &models.Button{Text: "Get Started", Href: "/register"}, - SecondaryButton: &models.Button{Text: "Learn More", Href: "/about"}, - Image: &models.Image{ - Src: "https://cdn.sonr.id/img/hero-clipped.svg", - Width: "500", - Height: "500", - }, - Stats: []*models.Stat{ - {Value: "476K", Label: "Assets packed with power beyond your imagination."}, - {Value: "1.44K", Label: "Assets packed with power beyond your imagination."}, - {Value: "1.5M+", Label: "Assets packed with power beyond your imagination."}, - }, -} - -func View() templ.Component { - return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { - return templ_7745c5c3_CtxErr - } - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var1 := templ.GetChildren(ctx) - if templ_7745c5c3_Var1 == nil { - templ_7745c5c3_Var1 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = sections.Header().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.SectionHero(&hero).Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.Highlights().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.Features().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.Bento().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.Lowlights().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.CallToAction().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(" ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = sections.Footer().Render(ctx, templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return templ_7745c5c3_Err - }) - templ_7745c5c3_Err = styles.LayoutNoBody("Sonr.ID", true).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return templ_7745c5c3_Err - }) -} - -var _ = templruntime.GeneratedTemplate diff --git a/pkg/nebula/components/home/sections/highlights_templ.go b/pkg/nebula/components/home/sections/highlights_templ.go deleted file mode 100644 index 38feb933f..000000000 --- a/pkg/nebula/components/home/sections/highlights_templ.go +++ /dev/null @@ -1,40 +0,0 @@ -// Code generated by templ - DO NOT EDIT. - -// templ: version: v0.2.778 -package sections - -//lint:file-ignore SA4006 This context is only used if a nested component is present. - -import "github.com/a-h/templ" -import templruntime "github.com/a-h/templ/runtime" - -func Highlights() templ.Component { - return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { - return templ_7745c5c3_CtxErr - } - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var1 := templ.GetChildren(ctx) - if templ_7745c5c3_Var1 == nil { - templ_7745c5c3_Var1 = templ.NopComponent - } - ctx = templ.ClearChildren(ctx) - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString("

The Internet Rebuilt for You

Sonr is a comprehensive system for Identity Management which proteects users across their digital personas while providing Developers a cost-effective solution for decentralized authentication.

\"Feature
\"Feature
\"Feature
\"Feature
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return templ_7745c5c3_Err - }) -} - -var _ = templruntime.GeneratedTemplate diff --git a/pkg/nebula/models/marketing.go b/pkg/nebula/models/marketing.go deleted file mode 100644 index e558e2e34..000000000 --- a/pkg/nebula/models/marketing.go +++ /dev/null @@ -1,28 +0,0 @@ -package models - -type Button struct { - Text string - Href string -} - -type Image struct { - Src string - Width string - Height string -} - -type Stat struct { - Value string - Label string -} - -type Hero struct { - TitleFirst string - TitleEmphasis string - TitleSecond string - Subtitle string - PrimaryButton *Button - SecondaryButton *Button - Image *Image - Stats []*Stat -} diff --git a/pkg/nebula/nebula.go b/pkg/nebula/nebula.go deleted file mode 100644 index 49779a784..000000000 --- a/pkg/nebula/nebula.go +++ /dev/null @@ -1,32 +0,0 @@ -package nebula - -import ( - "embed" - "io/fs" - "net/http" - - "github.com/labstack/echo/v4" -) - -//go:embed assets -var embeddedFiles embed.FS - -func getHTTPFS() (http.FileSystem, error) { - fsys, err := fs.Sub(embeddedFiles, "assets") - if err != nil { - return nil, err - } - return http.FS(fsys), nil -} - -// UseAssets is a middleware that serves static files from the embedded assets -func UseAssets(e *echo.Echo) error { - fsys, err := getHTTPFS() - if err != nil { - return err - } - assets := http.FileServer(fsys) - e.GET("/", echo.WrapHandler(assets)) - e.GET("/assets/*", echo.WrapHandler(http.StripPrefix("/assets/", assets))) - return nil -} diff --git a/pkg/nebula/routes/routes.go b/pkg/nebula/routes/routes.go deleted file mode 100644 index 4d1338a71..000000000 --- a/pkg/nebula/routes/routes.go +++ /dev/null @@ -1,72 +0,0 @@ -package routes - -import ( - "bytes" - - "github.com/a-h/templ" - "github.com/labstack/echo/v4" - - "github.com/onsonr/sonr/pkg/nebula/components/auth" - "github.com/onsonr/sonr/pkg/nebula/components/home" -) - -// ╭───────────────────────────────────────────────────────────╮ -// │ Marketing Pages │ -// ╰───────────────────────────────────────────────────────────╯ - -func Home(c echo.Context) error { - return render(c, home.View()) -} - -// ╭───────────────────────────────────────────────────────────╮ -// │ Authentication Views │ -// ╰───────────────────────────────────────────────────────────╯ - -func AuthorizeStart(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -func AuthorizeFinish(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -func LoginDevice(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -func LoginStart(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -func LoginFinish(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -func RegisterStart(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -func RegisterFinish(c echo.Context) error { - return render(c, auth.Modal(c)) -} - -// ╭───────────────────────────────────────────────────────────╮ -// │ Helper Methods │ -// ╰───────────────────────────────────────────────────────────╯ - -func render(c echo.Context, cmp templ.Component) error { - // Create a buffer to store the rendered HTML - buf := &bytes.Buffer{} - // Render the component to the buffer - err := cmp.Render(c.Request().Context(), buf) - if err != nil { - return err - } - - // Set the content type - c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTML) - - // Write the buffered content to the response - _, err = c.Response().Write(buf.Bytes()) - return err -} diff --git a/pkg/nebula/worker/auth.go b/pkg/nebula/worker/auth.go deleted file mode 100644 index a68070578..000000000 --- a/pkg/nebula/worker/auth.go +++ /dev/null @@ -1,43 +0,0 @@ -package worker - -import ( - "encoding/json" - "fmt" - - "github.com/go-webauthn/webauthn/protocol" - "github.com/labstack/echo/v4" -) - -func CheckSubjectIsValid(e echo.Context) error { - credentialID := e.FormValue("credentialID") - return e.JSON(200, credentialID) -} - -func HandleCredentialAssertion(e echo.Context) error { - return e.JSON(200, "HandleCredentialAssertion") -} - -func HandleCredentialCreation(e echo.Context) error { - // Get the serialized credential data from the form - credentialDataJSON := e.FormValue("credentialData") - - // Deserialize the JSON into a temporary struct - var ccr protocol.CredentialCreationResponse - err := json.Unmarshal([]byte(credentialDataJSON), &ccr) - if err != nil { - return e.JSON(500, err.Error()) - } - // - // // Parse the CredentialCreationResponse - // parsedData, err := ccr.Parse() - // if err != nil { - // return e.JSON(500, err.Error()) - // } - // - // // Create the Credential - // // credential := orm.NewCredential(parsedData, e.Request().Host, "") - // - // // Set additional fields - // credential.Controller = "" // Set this to the appropriate controller value - return e.JSON(200, fmt.Sprintf("REGISTER: %s", string(ccr.ID))) -} diff --git a/pkl/DWN.pkl b/pkl/DWN.pkl index 0f6905ff8..7272ebd43 100644 --- a/pkl/DWN.pkl +++ b/pkl/DWN.pkl @@ -1,4 +1,4 @@ -@go.Package { name = "github.com/onsonr/sonr/pkg/dwn/gen" } +@go.Package { name = "github.com/onsonr/sonr/internal/dwn/gen" } module dwngen diff --git a/pkl/ORM.pkl b/pkl/ORM.pkl index 33c7a411d..f62a2f238 100644 --- a/pkl/ORM.pkl +++ b/pkl/ORM.pkl @@ -1,4 +1,4 @@ -@go.Package { name = "github.com/onsonr/sonr/pkg/orm" } +@go.Package { name = "github.com/onsonr/sonr/internal/orm" } module orm diff --git a/pkl/README.md b/pkl/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/pkl/Txns.pkl b/pkl/Txns.pkl index 0852eebea..e658489b1 100644 --- a/pkl/Txns.pkl +++ b/pkl/Txns.pkl @@ -1,4 +1,4 @@ -@go.Package { name = "github.com/onsonr/sonr/pkg/orm/transactions" } +@go.Package { name = "github.com/onsonr/sonr/internal/orm/transactions" } module transactions diff --git a/process-compose.yaml b/process-compose.yaml index 275db47f3..6388a1415 100644 --- a/process-compose.yaml +++ b/process-compose.yaml @@ -17,9 +17,9 @@ processes: max_restarts: 1 depends: - ipfs - - tunnel: - namespace: public - command: "cloudflared tunnel run --token $TUNNEL_TOKEN" - restart: on_failure - max_restarts: 1 + # + # tunnel: + # namespace: public + # command: "cloudflared tunnel run --token $TUNNEL_TOKEN" + # restart: on_failure + # max_restarts: 1 diff --git a/proto/README.md b/proto/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/scripts/init_env.sh b/scripts/init_env.sh deleted file mode 100644 index eb6138fee..000000000 --- a/scripts/init_env.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/zsh - -export ACC0_MNEMONIC=$(skate get ACC0_MNEMONIC) -export ACC1_MNEMONIC=$(skate get ACC1_MNEMONIC) -export CHAIN_ID=$(skate get CHAIN_ID) -export DENOM=$(skate get DENOM) -export KEYRING=$(skate get KEYRING) -export MONIKER=$(skate get MONIKER) diff --git a/scripts/setup_xcaddy.sh b/scripts/setup_xcaddy.sh deleted file mode 100755 index 13a882eec..000000000 --- a/scripts/setup_xcaddy.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Exit immediately if a command exits with a non-zero status. -set -e - -# Function to check if a command exists. -command_exists() { - command -v "$1" >/dev/null 2>&1 -} - -echo "Starting the build process for Caddy with Cloudflare DNS module..." - -# Check if Go is installed -if ! command_exists go; then - echo "Go is not installed. Please install Go before running this script." - exit 1 -fi - -# Set Go environment variables -export GOPATH=$(go env GOPATH) -export GOBIN=$GOPATH/bin -export PATH=$PATH:$GOBIN - -# Install xcaddy if not present -if ! command_exists xcaddy; then - echo "xcaddy not found. Installing xcaddy..." - curl -sSfL https://raw.githubusercontent.com/caddyserver/xcaddy/master/install.sh | bash -s -- -b $GOBIN -fi - -# Build Caddy with the Cloudflare DNS module -echo "Building Caddy with the Cloudflare DNS module..." -xcaddy build --with github.com/caddy-dns/cloudflare -mv caddy ../build/caddy -echo "Caddy has been built successfully with the Cloudflare DNS module." - -# Optional: Move the caddy binary to /usr/local/bin (requires sudo) -# echo "Moving caddy to /usr/local/bin (requires sudo)..." -# sudo mv caddy /usr/local/bin/ - -# echo "Caddy has been installed to /usr/local/bin." diff --git a/scripts/version_bump.sh b/scripts/version_bump.sh deleted file mode 100644 index c918e6c32..000000000 --- a/scripts/version_bump.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -e - -# Get the current version from most recent git tag -export VERSION=$(git describe --tags --abbrev=0) - -# Check if the version is a valid semantic version -if ! [[ $VERSION =~ ^v?[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Invalid version format: $VERSION" - exit 1 -fi - -# Check if the version has already been bumped - diff --git a/workers/handlers/auth.go b/workers/handlers/auth.go new file mode 100644 index 000000000..a41117634 --- /dev/null +++ b/workers/handlers/auth.go @@ -0,0 +1,84 @@ +package handlers + +import ( + "encoding/json" + "fmt" + + "github.com/go-webauthn/webauthn/protocol" + "github.com/labstack/echo/v4" +) + +// ╭───────────────────────────────────────────────────────────╮ +// │ Login Handlers │ +// ╰───────────────────────────────────────────────────────────╯ + +func LoginSubjectStart(e echo.Context) error { + return e.JSON(200, "HandleCredentialAssertion") +} + +func LoginSubjectCheck(e echo.Context) error { + return e.JSON(200, "HandleCredentialAssertion") +} + +func LoginSubjectFinish(e echo.Context) error { + return e.JSON(200, "HandleCredentialAssertion") +} + +// ╭───────────────────────────────────────────────────────────╮ +// │ Register Handlers │ +// ╰───────────────────────────────────────────────────────────╯ + +func RegisterSubjectCheck(e echo.Context) error { + credentialID := e.FormValue("credentialID") + return e.JSON(200, credentialID) +} + +func RegisterSubjectStart(e echo.Context) error { + // Get the serialized credential data from the form + credentialDataJSON := e.FormValue("credentialData") + + // Deserialize the JSON into a temporary struct + var ccr protocol.CredentialCreationResponse + err := json.Unmarshal([]byte(credentialDataJSON), &ccr) + if err != nil { + return e.JSON(500, err.Error()) + } + // + // // Parse the CredentialCreationResponse + // parsedData, err := ccr.Parse() + // if err != nil { + // return e.JSON(500, err.Error()) + // } + // + // // Create the Credential + // // credential := orm.NewCredential(parsedData, e.Request().Host, "") + // + // // Set additional fields + // credential.Controller = "" // Set this to the appropriate controller value + return e.JSON(200, fmt.Sprintf("REGISTER: %s", string(ccr.ID))) +} + +func RegisterSubjectFinish(e echo.Context) error { + // Get the serialized credential data from the form + credentialDataJSON := e.FormValue("credentialData") + + // Deserialize the JSON into a temporary struct + var ccr protocol.CredentialCreationResponse + err := json.Unmarshal([]byte(credentialDataJSON), &ccr) + if err != nil { + return e.JSON(500, err.Error()) + } + // + // // Parse the CredentialCreationResponse + // parsedData, err := ccr.Parse() + // if err != nil { + // return e.JSON(500, err.Error()) + // } + // + // // Create the Credential + // // credential := orm.NewCredential(parsedData, e.Request().Host, "") + // + // // Set additional fields + // credential.Controller = "" // Set this to the appropriate controller value + return e.JSON(200, fmt.Sprintf("REGISTER: %s", string(ccr.ID))) +} diff --git a/pkg/nebula/worker/grant.go b/workers/handlers/openid.go similarity index 96% rename from pkg/nebula/worker/grant.go rename to workers/handlers/openid.go index 77c522171..0f7c8417e 100644 --- a/pkg/nebula/worker/grant.go +++ b/workers/handlers/openid.go @@ -1,4 +1,4 @@ -package worker +package handlers import ( "github.com/labstack/echo/v4" diff --git a/pkg/nebula/worker/sync.go b/workers/handlers/sync.go similarity index 89% rename from pkg/nebula/worker/sync.go rename to workers/handlers/sync.go index 5d009803d..2ff633a17 100644 --- a/pkg/nebula/worker/sync.go +++ b/workers/handlers/sync.go @@ -1,4 +1,4 @@ -package worker +package handlers import "github.com/labstack/echo/v4" diff --git a/workers/routes/client.go b/workers/routes/client.go new file mode 100644 index 000000000..24b886194 --- /dev/null +++ b/workers/routes/client.go @@ -0,0 +1,30 @@ +package routes + +import ( + "github.com/labstack/echo/v4" + + "github.com/onsonr/sonr/nebula/components/auth" + "github.com/onsonr/sonr/nebula/components/home" + "github.com/onsonr/sonr/workers/handlers" +) + +func RegisterClientAPI(e *echo.Echo) { + g1 := e.Group("api") + g1.GET("/register/:subject/start", handlers.RegisterSubjectStart) + g1.POST("/register/:subject/check", handlers.RegisterSubjectCheck) + g1.POST("/register/:subject/finish", handlers.RegisterSubjectFinish) + + g1.GET("/login/:subject/start", handlers.LoginSubjectStart) + g1.POST("/login/:subject/check", handlers.LoginSubjectCheck) + g1.POST("/login/:subject/finish", handlers.LoginSubjectFinish) + + g1.GET("/jwks", handlers.GetJWKS) + g1.GET("/token", handlers.GetToken) + g1.POST("/:origin/grant/:subject", handlers.GrantAuthorization) +} + +func RegisterClientViews(e *echo.Echo) { + e.GET("/home", home.Route) + e.GET("/login", auth.LoginRoute) + e.GET("/register", auth.RegisterRoute) +} diff --git a/workers/routes/proxy.go b/workers/routes/proxy.go new file mode 100644 index 000000000..956fe8d4f --- /dev/null +++ b/workers/routes/proxy.go @@ -0,0 +1,17 @@ +package routes + +import ( + "github.com/labstack/echo/v4" + + "github.com/onsonr/sonr/nebula/components/auth" + "github.com/onsonr/sonr/nebula/components/home" +) + +func RegisterProxyAPI(e *echo.Echo) { +} + +func RegisterProxyViews(e *echo.Echo) { + e.GET("/", home.Route) + e.GET("/login", auth.LoginRoute) + e.GET("/register", auth.RegisterRoute) +} diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 000000000..2aca33118 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,8 @@ +name = "sonr-id" +main = "./cmd/hway/build/worker.mjs" +compatibility_date = "2024-10-07" + +routes = [{ pattern = "sonr.id", custom_domain = true }] + +[build] +command = "make hway-build" diff --git a/x/did/README.md b/x/did/README.md index 8dd3a7772..91ce8c1c2 100644 --- a/x/did/README.md +++ b/x/did/README.md @@ -2,20 +2,6 @@ The Decentralized Identity module is responsible for managing native Sonr Accounts, their derived wallets, and associated user identification information. -## Concepts - -### Account - -An Account represents a user's identity within the Sonr ecosystem. It includes information such as the user's public key, associated wallets, and other identification details. - -### Decentralized Identifier (DID) - -A Decentralized Identifier (DID) is a unique identifier that is created, owned, and controlled by the user. It is used to establish a secure and verifiable digital identity. - -### Verifiable Credential (VC) - -A Verifiable Credential (VC) is a digital statement that can be cryptographically verified. It contains claims about a subject (e.g., a user) and is issued by a trusted authority. - ## State Specify and describe structures expected to marshalled into the store, and their keys @@ -71,3 +57,15 @@ Acceptance tests. ## Appendix Supplementary details referenced elsewhere within the spec. + +### Account + +An Account represents a user's identity within the Sonr ecosystem. It includes information such as the user's public key, associated wallets, and other identification details. + +### Decentralized Identifier (DID) + +A Decentralized Identifier (DID) is a unique identifier that is created, owned, and controlled by the user. It is used to establish a secure and verifiable digital identity. + +### Verifiable Credential (VC) + +A Verifiable Credential (VC) is a digital statement that can be cryptographically verified. It contains claims about a subject (e.g., a user) and is issued by a trusted authority. diff --git a/x/did/types/params.go b/x/did/types/params.go index 309248c95..af24005a5 100644 --- a/x/did/types/params.go +++ b/x/did/types/params.go @@ -4,10 +4,10 @@ import ( "encoding/json" fmt "fmt" - "github.com/onsonr/sonr/pkg/orm/keyalgorithm" - "github.com/onsonr/sonr/pkg/orm/keycurve" - "github.com/onsonr/sonr/pkg/orm/keyencoding" - "github.com/onsonr/sonr/pkg/orm/keyrole" + "github.com/onsonr/sonr/internal/orm/keyalgorithm" + "github.com/onsonr/sonr/internal/orm/keycurve" + "github.com/onsonr/sonr/internal/orm/keyencoding" + "github.com/onsonr/sonr/internal/orm/keyrole" ) // DefaultParams returns default module parameters. diff --git a/x/vault/README.md b/x/vault/README.md index 8bee0b21d..8f785335d 100644 --- a/x/vault/README.md +++ b/x/vault/README.md @@ -4,6 +4,62 @@ The Vault module is responsible for the management of IPFS deployed Decentralize ## Concepts +## State + +Specify and describe structures expected to marshalled into the store, and their keys + +### Account State + +The Account state includes the user's public key, associated wallets, and other identification details. It is stored using the user's DID as the key. + +### Credential State + +The Credential state includes the claims about a subject and is stored using the credential ID as the key. + +## State Transitions + +Standard state transition operations triggered by hooks, messages, etc. + +## Messages + +Specify message structure(s) and expected state machine behaviour(s). + +## Begin Block + +Specify any begin-block operations. + +## End Block + +Specify any end-block operations. + +## Hooks + +Describe available hooks to be called by/from this module. + +## Events + +List and describe event tags used. + +## Client + +List and describe CLI commands and gRPC and REST endpoints. + +## Params + +List all module parameters, their types (in JSON) and identitys. + +## Future Improvements + +Describe future improvements of this module. + +## Tests + +Acceptance tests. + +## Appendix + +Supplementary details referenced elsewhere within the spec. + | Concept | Description | | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Decentralized Web Node (DWN) | A decentralized, distributed, and secure network of nodes that store and share data. It is a decentralized alternative to traditional web hosting services. | @@ -13,9 +69,3 @@ The Vault module is responsible for the management of IPFS deployed Decentralize | WebAuthn (Web Authentication) | A set of APIs that allow websites to request user authentication using biometric or non-biometric factors. | | WebAssembly (Web Assembly) | A binary instruction format for a stack-based virtual machine. | | Verifiable Credential (VC) | A digital statement that can be cryptographically verified. | - -## Operations - -[View on Eraser![](https://app.eraser.io/workspace/ZFigXnzF1bkQR1VBq7Mz/preview?elements=_hAjUxIKPzF4ffIL4Ow_9w&type=embed)](https://app.eraser.io/workspace/ZFigXnzF1bkQR1VBq7Mz?elements=_hAjUxIKPzF4ffIL4Ow_9w) - -View on Eraser
diff --git a/x/vault/keeper/assembly.go b/x/vault/keeper/assembly.go index 4c0c1f1cf..5a7549a20 100644 --- a/x/vault/keeper/assembly.go +++ b/x/vault/keeper/assembly.go @@ -5,7 +5,7 @@ import ( "time" sdk "github.com/cosmos/cosmos-sdk/types" - dwngen "github.com/onsonr/sonr/pkg/dwn/gen" + dwngen "github.com/onsonr/sonr/internal/dwn/gen" "github.com/onsonr/sonr/x/vault/types" ) diff --git a/x/vault/types/params.go b/x/vault/types/params.go index 0c028e4d9..7c0fee1e3 100644 --- a/x/vault/types/params.go +++ b/x/vault/types/params.go @@ -3,7 +3,7 @@ package types import ( "encoding/json" - "github.com/onsonr/sonr/pkg/orm" + "github.com/onsonr/sonr/internal/orm" ) // DefaultParams returns default module parameters. diff --git a/x/vault/types/vault.go b/x/vault/types/vault.go index 2726c0ff8..0e039147d 100644 --- a/x/vault/types/vault.go +++ b/x/vault/types/vault.go @@ -3,8 +3,8 @@ package types import ( "github.com/ipfs/boxo/files" - "github.com/onsonr/sonr/pkg/dwn" - dwngen "github.com/onsonr/sonr/pkg/dwn/gen" + "github.com/onsonr/sonr/internal/dwn" + dwngen "github.com/onsonr/sonr/internal/dwn/gen" ) type Vault struct {