commit e3d595693edf1404b4d4a74885be3f05322e43b9 parent 4b9a90772c8bcc146a602d1a7e2c4cd75e871bbf Author: Emmanuel Benoist <emmanuel.benoist@bfh.ch> Date: Mon, 15 Jul 2024 15:09:14 +0200 Import of the project of Yann Doy into the GNU-Taler repository Diffstat:
| A | LICENSE | | | 191 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | admins.json | | | 3 | +++ |
| A | clients.json | | | 9 | +++++++++ |
| A | deno.jsonc | | | 32 | ++++++++++++++++++++++++++++++++ |
| A | deno.lock | | | 784 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/.gitignore | | | 4 | ++++ |
| A | docs/build/defense.pdf | | | 0 | |
| A | docs/build/thesis.pdf | | | 0 | |
| A | docs/contents/1.introduction.tex | | | 158 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/contents/2.architecture.tex | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/contents/3.security.tex | | | 103 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/contents/4.design.tex | | | 73 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/contents/5.testing.tex | | | 68 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/contents/6.results.tex | | | 16 | ++++++++++++++++ |
| A | docs/contents/7.conclusion.tex | | | 18 | ++++++++++++++++++ |
| A | docs/contents/_abstract.tex | | | 18 | ++++++++++++++++++ |
| A | docs/contents/_acknowledgement.tex | | | 18 | ++++++++++++++++++ |
| A | docs/contents/_glossary.tex | | | 61 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/contents/appendix-user-manual.tex | | | 156 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/defense.ltx | | | 324 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/figures/DiamondTesting.png | | | 0 | |
| A | docs/figures/authorize-process.pdf | | | 0 | |
| A | docs/figures/connection-process.pdf | | | 0 | |
| A | docs/figures/design.drawio | | | 67 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/figures/ekyc-process.pdf | | | 0 | |
| A | docs/figures/ekyc.png | | | 0 | |
| A | docs/figures/face-challenge.png | | | 0 | |
| A | docs/figures/id-doc-ekyc-doc-back.png | | | 0 | |
| A | docs/figures/id-doc-ekyc-doc-front.png | | | 0 | |
| A | docs/figures/id-doc-ekyc-face-front.png | | | 0 | |
| A | docs/figures/id-doc-ekyc-face-left.png | | | 0 | |
| A | docs/figures/id-doc-ekyc-face-right.png | | | 0 | |
| A | docs/figures/kyc-exemple-alcohol.png | | | 0 | |
| A | docs/figures/kyc-exemple-aviation.png | | | 0 | |
| A | docs/figures/kyc-exemple-casino.png | | | 0 | |
| A | docs/figures/mrz.png | | | 0 | |
| A | docs/figures/oauth2-example.pdf | | | 0 | |
| A | docs/figures/oauth2-flow.pdf | | | 0 | |
| A | docs/figures/old/DepositWithKYC.bpmn | | | 2047 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/figures/old/DomainModel.mocodo.net | | | 20 | ++++++++++++++++++++ |
| A | docs/figures/old/DomainModel.svg | | | 261 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/figures/old/context-map.drawio.svg | | | 5 | +++++ |
| A | docs/figures/old/context-map.png | | | 0 | |
| A | docs/figures/old/detail-context-map.png | | | 0 | |
| A | docs/figures/old/general-taler-working.png | | | 0 | |
| A | docs/figures/old/seq.mermaid | | | 32 | ++++++++++++++++++++++++++++++++ |
| A | docs/figures/old/toplevel-architecture.png | | | 0 | |
| A | docs/figures/old/wallpaper.png | | | 0 | |
| A | docs/figures/phone-ekyc-process.pdf | | | 0 | |
| A | docs/figures/phone-ekyc-step-1.png | | | 0 | |
| A | docs/figures/phone-ekyc-step-2.png | | | 0 | |
| A | docs/figures/phone-ekyc-step-3.png | | | 0 | |
| A | docs/figures/phone-ekyc-steps.png | | | 0 | |
| A | docs/figures/phone-ekyc.pdf | | | 0 | |
| A | docs/figures/project-arch.drawio | | | 886 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/figures/sigdoydy1.jpeg | | | 0 | |
| A | docs/figures/software-layer.pdf | | | 0 | |
| A | docs/figures/strategical-vs-tactical.pdf | | | 0 | |
| A | docs/figures/system.pdf | | | 0 | |
| A | docs/figures/tdd-cycle.pdf | | | 0 | |
| A | docs/figures/toplevel-sequence.pdf | | | 0 | |
| A | docs/figures/toplevel.pdf | | | 0 | |
| A | docs/figures/wallpaper.png | | | 0 | |
| A | docs/references.bib | | | 88 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | docs/thesis.ltx | | | 171 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | flake.lock | | | 26 | ++++++++++++++++++++++++++ |
| A | flake.nix | | | 72 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | media/book.pdf | | | 0 | |
| A | media/demo.php | | | 93 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | media/poster.pdf | | | 0 | |
| A | media/poster.pptx | | | 0 | |
| A | media/presentation.pptx | | | 0 | |
| A | media/video.mp4 | | | 0 | |
| A | media/video.pptx | | | 0 | |
| A | nessie.config.ts | | | 16 | ++++++++++++++++ |
| A | planning.xlsx | | | 0 | |
| A | src/core/application/authn/auth_repository.ts | | | 11 | +++++++++++ |
| A | src/core/application/authn/email_challenge.ts | | | 56 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/authn/exists.ts | | | 44 | ++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/authn/login.ts | | | 45 | +++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/authn/logout.ts | | | 29 | +++++++++++++++++++++++++++++ |
| A | src/core/application/authn/register.ts | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/authn/session.ts | | | 44 | ++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/authn/verify_email.ts | | | 47 | +++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/customer_info.ts | | | 26 | ++++++++++++++++++++++++++ |
| A | src/core/application/id_document/admin_repository.ts | | | 6 | ++++++ |
| A | src/core/application/id_document/approve.ts | | | 45 | +++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/id_document/capture.ts | | | 74 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/id_document/decline.ts | | | 42 | ++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/id_document/id_document_repository.ts | | | 7 | +++++++ |
| A | src/core/application/id_document/is_admin.ts | | | 21 | +++++++++++++++++++++ |
| A | src/core/application/id_document/list.ts | | | 21 | +++++++++++++++++++++ |
| A | src/core/application/id_document/mrzscan.ts | | | 12 | ++++++++++++ |
| A | src/core/application/oauth2/authorize.ts | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/oauth2/client_repository.ts | | | 6 | ++++++ |
| A | src/core/application/oauth2/flow_repository.ts | | | 9 | +++++++++ |
| A | src/core/application/oauth2/initiate.ts | | | 60 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/oauth2/ratelimit_repository.ts | | | 6 | ++++++ |
| A | src/core/application/oauth2/token.ts | | | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/oauth2/user_info.ts | | | 95 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/oauth2/validate.ts | | | 44 | ++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/phone/phone_repository.ts | | | 7 | +++++++ |
| A | src/core/application/phone/register.ts | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/phone/verify_sms.ts | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/application/repository_error.ts | | | 17 | +++++++++++++++++ |
| A | src/core/composer.ts | | | 31 | +++++++++++++++++++++++++++++++ |
| A | src/core/domain/admin.ts | | | 6 | ++++++ |
| A | src/core/domain/auth.ts | | | 68 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/client.ts | | | 51 | +++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/code.ts | | | 20 | ++++++++++++++++++++ |
| A | src/core/domain/code_challenge.ts | | | 94 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/constants.ts | | | 54 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/crypto.ts | | | 179 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/email.ts | | | 20 | ++++++++++++++++++++ |
| A | src/core/domain/email_challenge.ts | | | 56 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/ephemeral.ts | | | 33 | +++++++++++++++++++++++++++++++++ |
| A | src/core/domain/error.ts | | | 5 | +++++ |
| A | src/core/domain/id_document.ts | | | 134 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/id_info.ts | | | 11 | +++++++++++ |
| A | src/core/domain/limiter.ts | | | 49 | +++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/logger.ts | | | 22 | ++++++++++++++++++++++ |
| A | src/core/domain/oauth2flow.ts | | | 83 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/password.ts | | | 53 | +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/personal_phone_number.ts | | | 40 | ++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/phone_ekyc.ts | | | 30 | ++++++++++++++++++++++++++++++ |
| A | src/core/domain/picture.ts | | | 22 | ++++++++++++++++++++++ |
| A | src/core/domain/rate_limit.ts | | | 15 | +++++++++++++++ |
| A | src/core/domain/scope.ts | | | 34 | ++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/session_token.ts | | | 31 | +++++++++++++++++++++++++++++++ |
| A | src/core/domain/sms_challenge.ts | | | 41 | +++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/tests/code_challenge.test.ts | | | 101 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/tests/crypto.test.ts | | | 90 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/tests/email.test.ts | | | 44 | ++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/tests/ephemeral.test.ts | | | 62 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/tests/limiter.test.ts | | | 58 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/tests/personal_phone_number.test.ts | | | 38 | ++++++++++++++++++++++++++++++++++++++ |
| A | src/core/domain/token.ts | | | 20 | ++++++++++++++++++++ |
| A | src/core/domain/uuid.ts | | | 20 | ++++++++++++++++++++ |
| A | src/core/factory.ts | | | 103 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/.gitignore | | | 11 | +++++++++++ |
| A | src/http/README.md | | | 16 | ++++++++++++++++ |
| A | src/http/app.ts | | | 19 | +++++++++++++++++++ |
| A | src/http/ca-cert.dev.pem | | | 22 | ++++++++++++++++++++++ |
| A | src/http/ca-key.dev.pem | | | 27 | +++++++++++++++++++++++++++ |
| A | src/http/dev.ts | | | 7 | +++++++ |
| A | src/http/form.ts | | | 128 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/fresh.config.ts | | | 22 | ++++++++++++++++++++++ |
| A | src/http/fresh.gen.ts | | | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/islands/code_input.tsx | | | 30 | ++++++++++++++++++++++++++++++ |
| A | src/http/islands/delayed_button.tsx | | | 39 | +++++++++++++++++++++++++++++++++++++++ |
| A | src/http/islands/email_input.tsx | | | 29 | +++++++++++++++++++++++++++++ |
| A | src/http/islands/password_input.tsx | | | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/islands/phone_number_input.tsx | | | 35 | +++++++++++++++++++++++++++++++++++ |
| A | src/http/islands/photo_capture_input.tsx | | | 116 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/main.ts | | | 11 | +++++++++++ |
| A | src/http/routes/(admin)/verify/id-document.tsx | | | 171 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/_layout.tsx | | | 9 | +++++++++ |
| A | src/http/routes/(customer)/connect.tsx | | | 83 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/login.tsx | | | 75 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/logout.tsx | | | 17 | +++++++++++++++++ |
| A | src/http/routes/(customer)/register/email.tsx | | | 69 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/register/id-document.tsx | | | 234 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/register/phone.tsx | | | 83 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/verify/email.tsx | | | 76 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/verify/id-document.tsx | | | 80 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/(customer)/verify/sms.tsx | | | 134 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/_404.tsx | | | 18 | ++++++++++++++++++ |
| A | src/http/routes/_500.tsx | | | 23 | +++++++++++++++++++++++ |
| A | src/http/routes/_app.tsx | | | 16 | ++++++++++++++++ |
| A | src/http/routes/_layout.tsx | | | 65 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/_middleware.ts | | | 24 | ++++++++++++++++++++++++ |
| A | src/http/routes/index.tsx | | | 31 | +++++++++++++++++++++++++++++++ |
| A | src/http/routes/oauth2/authorize.tsx | | | 103 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/oauth2/callback.tsx | | | 31 | +++++++++++++++++++++++++++++++ |
| A | src/http/routes/oauth2/token.tsx | | | 36 | ++++++++++++++++++++++++++++++++++++ |
| A | src/http/routes/oauth2/userinfo.tsx | | | 21 | +++++++++++++++++++++ |
| A | src/http/static/favicon.ico | | | 0 | |
| A | src/http/static/logo.svg | | | 7 | +++++++ |
| A | src/http/static/pico.min.css | | | 5 | +++++ |
| A | src/infrastructure/boot/environment.ts | | | 60 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/boot/mailer.ts | | | 17 | +++++++++++++++++ |
| A | src/infrastructure/boot/persistance.ts | | | 19 | +++++++++++++++++++ |
| A | src/infrastructure/boot/sms.ts | | | 16 | ++++++++++++++++ |
| A | src/infrastructure/config/admin.ts | | | 20 | ++++++++++++++++++++ |
| A | src/infrastructure/config/client.ts | | | 35 | +++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/config/factory.ts | | | 20 | ++++++++++++++++++++ |
| A | src/infrastructure/fake/mailer.ts | | | 19 | +++++++++++++++++++ |
| A | src/infrastructure/fake/sms.ts | | | 18 | ++++++++++++++++++ |
| A | src/infrastructure/memory/auth.ts | | | 63 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/customer_info.ts | | | 43 | +++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/factory.ts | | | 53 | +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/id_document.ts | | | 32 | ++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/id_document_list.ts | | | 40 | ++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/mapper/auth.ts | | | 73 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/mapper/id_document.ts | | | 98 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/mapper/oauth2flow.ts | | | 44 | ++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/mapper/phone.ts | | | 54 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/mapper/ratelimit.ts | | | 27 | +++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/oauth2_flow.ts | | | 45 | +++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/phone.ts | | | 32 | ++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/memory/ratelimit.ts | | | 32 | ++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/auth.ts | | | 143 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/customer_info.ts | | | 80 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/error.ts | | | 27 | +++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/factory.ts | | | 29 | +++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/iddocument.ts | | | 103 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/iddocument_list.ts | | | 46 | ++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/migrations/20240531140741_create_auth.ts | | | 42 | ++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/migrations/20240606001232_create_phone.ts | | | 30 | ++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/migrations/20240617195959_create_oauth2flow.ts | | | 28 | ++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/migrations/20240618073559_create_ratelimit.ts | | | 23 | +++++++++++++++++++++++ |
| A | src/infrastructure/postgres/migrations/20240619101025_create_iddocument.ts | | | 34 | ++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/oauth2_flow.ts | | | 120 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/phone.ts | | | 109 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/ratelimit.ts | | | 94 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/postgres/seeds/.gitkeep | | | 0 | |
| A | src/infrastructure/smtp/auth.ts | | | 49 | +++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/smtp/factory.ts | | | 20 | ++++++++++++++++++++ |
| A | src/infrastructure/swisscom/ekyc_send_sms_challenge.ts | | | 59 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/infrastructure/swisscom/factory.ts | | | 16 | ++++++++++++++++ |
| A | src/infrastructure/tesseract/factory.ts | | | 17 | +++++++++++++++++ |
| A | src/infrastructure/tesseract/models/ocrb.traineddata | | | 0 | |
| A | src/infrastructure/tesseract/mrz_scan.ts | | | 71 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/tests/acceptance.ts | | | 13 | +++++++++++++ |
| A | src/tests/auth_email_challenge.test.ts | | | 130 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/tests/auth_email_verify.test.ts | | | 111 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/tests/auth_register.test.ts | | | 68 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/tests/auth_repository.test.ts | | | 126 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | src/tests/phone_repository.test.ts | | | 121 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
229 files changed, 13296 insertions(+), 0 deletions(-)
diff --git a/LICENSE b/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +Copyright 2024 Yann Mickael Doy + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +\ No newline at end of file diff --git a/admins.json b/admins.json @@ -0,0 +1,3 @@ +[ + "1ec1a9a4-9ddf-4b43-ae3e-27daef857543" +] diff --git a/clients.json b/clients.json @@ -0,0 +1,9 @@ +[ + { + "id": "697aca40-17cd-46fc-afb4-74acddff8b01", + "secret": "EEM9cycs4fmSwXKqd5PQdKdhDF69wdouh", + "scope": "phone-number id-document", + "redirectUri": "http://localhost:8080/oauth2/callback", + "description": "eKYC for authorize transaction" + } +] diff --git a/deno.jsonc b/deno.jsonc @@ -0,0 +1,32 @@ +{ + "tasks": { + "dev": "deno run -A --watch=lib --env=.env src/http/dev.ts", + "nessie": "deno run -A --env=.env https://deno.land/x/nessie@2.0.11/cli.ts", + "smtp": "mailcatcher --ip 127.0.0.1 --smtp-port 1025 --http-port 1080 --foreground", + "build": "deno run -A dev.ts build", + "preview": "deno run -A main.ts" + }, + "imports": { + "$dotenv": "https://deno.land/x/dotenv@v3.2.2/load.ts", + "$fresh/": "https://deno.land/x/fresh@1.6.8/", + "$mailer": "https://deno.land/x/smtp@v0.7.0/mod.ts", + "$postgres": "https://deno.land/x/postgres@v0.19.3/mod.ts", + "$std/": "https://deno.land/std@0.224.0/", + "$valita": "https://deno.land/x/valita@v0.3.8/mod.ts", + "@preact/signals": "https://esm.sh/*@preact/signals@1.2.2", + "@preact/signals-core": "https://esm.sh/*@preact/signals-core@1.5.1", + "fast-check": "https://esm.sh/fast-check@3.18.0", + "google-libphonenumber": "https://esm.sh/google-libphonenumber@3.2.34", + "libsodium-wrappers-sumo": "https://esm.sh/libsodium-wrappers-sumo@0.7.13", + "mrz": "https://esm.sh/mrz@4.1.0", + "preact": "https://esm.sh/preact@10.19.6", + "preact/": "https://esm.sh/preact@10.19.6/", + "#http/": "./src/http/", + "#core/": "./src/core/", + "#boot/": "./src/boot/", + "#infrastructure/": "./src/infrastructure/" + }, + "lint": { "rules": { "tags": ["fresh", "recommended"] } }, + "exclude": ["**/_fresh/*"], + "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "preact" } +} diff --git a/deno.lock b/deno.lock @@ -0,0 +1,784 @@ +{ + "version": "3", + "packages": { + "specifiers": { + "jsr:@luca/esbuild-deno-loader@0.10.3": "jsr:@luca/esbuild-deno-loader@0.10.3", + "jsr:@std/assert@^0.213.1": "jsr:@std/assert@0.213.1", + "jsr:@std/encoding@0.213": "jsr:@std/encoding@0.213.1", + "jsr:@std/json@^0.213.1": "jsr:@std/json@0.213.1", + "jsr:@std/jsonc@0.213": "jsr:@std/jsonc@0.213.1", + "jsr:@std/path@0.213": "jsr:@std/path@0.213.1", + "npm:@types/node": "npm:@types/node@18.16.19", + "npm:mrz": "npm:mrz@4.1.0" + }, + "jsr": { + "@luca/esbuild-deno-loader@0.10.3": { + "integrity": "32fc93f7e7f78060234fd5929a740668aab1c742b808c6048b57f9aaea514921", + "dependencies": [ + "jsr:@std/encoding@0.213", + "jsr:@std/jsonc@0.213", + "jsr:@std/path@0.213" + ] + }, + "@std/assert@0.213.1": { + "integrity": "24c28178b30c8e0782c18e8e94ea72b16282207569cdd10ffb9d1d26f2edebfe" + }, + "@std/encoding@0.213.1": { + "integrity": "fcbb6928713dde941a18ca5db88ca1544d0755ec8fb20fe61e2dc8144b390c62" + }, + "@std/json@0.213.1": { + "integrity": "f572b1de605d07c4a5602445dac54bfc51b1fb87a3710a17aed2608bfca54e68" + }, + "@std/jsonc@0.213.1": { + "integrity": "5578f21aa583b7eb7317eed077ffcde47b294f1056bdbb9aacec407758637bfe", + "dependencies": [ + "jsr:@std/assert@^0.213.1", + "jsr:@std/json@^0.213.1" + ] + }, + "@std/path@0.213.1": { + "integrity": "f187bf278a172752e02fcbacf6bd78a335ed320d080a7ed3a5a59c3e88abc673", + "dependencies": [ + "jsr:@std/assert@^0.213.1" + ] + } + }, + "npm": { + "@types/node@18.16.19": { + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==", + "dependencies": {} + }, + "mrz@4.1.0": { + "integrity": "sha512-EJlizJV19BapAipKZX2SjcCHZ1etwDRmOWchRuQpXtdehuPZlYHDiKs3zVVLm3o9bsqOhmSu0YnPvfKl6Yb2zg==", + "dependencies": {} + } + } + }, + "redirects": { + "https://deno.land/x/dotenv/load.ts": "https://deno.land/x/dotenv@v3.2.2/load.ts", + "https://esm.sh/preact@10.19.6/src/jsx.d.ts": "https://esm.sh/v135/preact@10.19.6/src/jsx.d.ts", + "https://esm.sh/v135/@types/babel__helper-validator-identifier@~7/index.d.ts": "https://esm.sh/v135/@types/babel__helper-validator-identifier@7.15.2/index.d.ts", + "https://esm.sh/v135/@types/google-libphonenumber@latest/index.d.ts": "https://esm.sh/v135/@types/google-libphonenumber@7.4.30/index.d.ts", + "https://esm.sh/v135/@types/libsodium-wrappers-sumo@~0.7/index.d.ts": "https://esm.sh/v135/@types/libsodium-wrappers-sumo@0.7.8/index.d.ts" + }, + "remote": { + "https://deno.land/std@0.104.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58", + "https://deno.land/std@0.104.0/async/deadline.ts": "1d6ac7aeaee22f75eb86e4e105d6161118aad7b41ae2dd14f4cfd3bf97472b93", + "https://deno.land/std@0.104.0/async/debounce.ts": "b2f693e4baa16b62793fd618de6c003b63228db50ecfe3bd51fc5f6dc0bc264b", + "https://deno.land/std@0.104.0/async/deferred.ts": "ce81070ad3ba3294f3f34c032af884ccde1a20922b648f6eaee54bd8fd951a1e", + "https://deno.land/std@0.104.0/async/delay.ts": "9de1d8d07d1927767ab7f82434b883f3d8294fb19cad819691a2ad81a728cf3d", + "https://deno.land/std@0.104.0/async/mod.ts": "78425176fabea7bd1046ce3819fd69ce40da85c83e0f174d17e8e224a91f7d10", + "https://deno.land/std@0.104.0/async/mux_async_iterator.ts": "62abff3af9ff619e8f2adc96fc70d4ca020fa48a50c23c13f12d02ed2b760dbe", + "https://deno.land/std@0.104.0/async/pool.ts": "353ce4f91865da203a097aa6f33de8966340c91b6f4a055611c8c5d534afd12f", + "https://deno.land/std@0.104.0/async/tee.ts": "6b8f1322b6dd2396202cfbe9cde9cab158d1e962cfd9197b0a97c6657bee79ce", + "https://deno.land/std@0.104.0/bytes/bytes_list.ts": "a13287edb03f19d27ba4927dec6d6de3e5bd46254cd4aee6f7e5815810122673", + "https://deno.land/std@0.104.0/bytes/mod.ts": "1ae1ccfe98c4b979f12b015982c7444f81fcb921bea7aa215bf37d84f46e1e13", + "https://deno.land/std@0.104.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e", + "https://deno.land/std@0.104.0/encoding/hex.ts": "5bc7df19af498c315cdaba69e2fce1b2aef5fc57344e8c21c08991aa8505a260", + "https://deno.land/std@0.104.0/fmt/colors.ts": "d2f8355f00a74404668fc5a1e4a92983ce1a9b0a6ac1d40efbd681cb8f519586", + "https://deno.land/std@0.104.0/fs/exists.ts": "b0d2e31654819cc2a8d37df45d6b14686c0cc1d802e9ff09e902a63e98b85a00", + "https://deno.land/std@0.104.0/hash/_wasm/hash.ts": "313a4820227f1c45fa7204d9c28731b4f8ce97cdcc5f1e7e4efcdf2d70540d32", + "https://deno.land/std@0.104.0/hash/_wasm/wasm.js": "792f612fbb9998e267f9ae3f82ed72444305cb9c77b5bbf7ff6517fd3b606ed1", + "https://deno.land/std@0.104.0/hash/hasher.ts": "57a9ec05dd48a9eceed319ac53463d9873490feea3832d58679df6eec51c176b", + "https://deno.land/std@0.104.0/hash/mod.ts": "dd339a26b094032f38d71311b85745e8d19f2085364794c1877057e057902dd9", + "https://deno.land/std@0.104.0/io/buffer.ts": "3ead6bb11276ebcf093c403f74f67fd2205a515dbbb9061862c468ca56f37cd8", + "https://deno.land/std@0.104.0/io/bufio.ts": "6024117aa37f8d21a116654bd5ca5191d803f6492bbc744e3cee5054d0e900d1", + "https://deno.land/std@0.104.0/io/util.ts": "85c33d61b20fd706acc094fe80d4c8ae618b04abcf3a96ca2b47071842c1c8ac", + "https://deno.land/std@0.104.0/log/handlers.ts": "8c7221a2408b4097e186b018f3f1a18865d20b98761aa1dccaf1ee3d57298355", + "https://deno.land/std@0.104.0/log/levels.ts": "088a883039ece5fa0da5f74bc7688654045ea7cb01bf200b438191a28d728eae", + "https://deno.land/std@0.104.0/log/logger.ts": "6b2dd8cbe6f407100b9becfe61595d7681f8ce3692412fad843de84d617a038e", + "https://deno.land/std@0.104.0/log/mod.ts": "91711789b28803082b1bdfb123d2c9685a7e01767f2e79c0a82706063ad964d8", + "https://deno.land/std@0.104.0/testing/_diff.ts": "5d3693155f561d1a5443ac751ac70aab9f5d67b4819a621d4b96b8a1a1c89620", + "https://deno.land/std@0.104.0/testing/asserts.ts": "e4311d45d956459d4423bc267208fe154b5294989da2ed93257b6a85cae0427e", + "https://deno.land/std@0.170.0/_util/asserts.ts": "d0844e9b62510f89ce1f9878b046f6a57bf88f208a10304aab50efcb48365272", + "https://deno.land/std@0.170.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934", + "https://deno.land/std@0.170.0/encoding/base64.ts": "8605e018e49211efc767686f6f687827d7f5fd5217163e981d8d693105640d7a", + "https://deno.land/std@0.170.0/fmt/colors.ts": "03ad95e543d2808bc43c17a3dd29d25b43d0f16287fe562a0be89bf632454a12", + "https://deno.land/std@0.170.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", + "https://deno.land/std@0.170.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", + "https://deno.land/std@0.170.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677", + "https://deno.land/std@0.170.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", + "https://deno.land/std@0.170.0/path/glob.ts": "81cc6c72be002cd546c7a22d1f263f82f63f37fe0035d9726aa96fc8f6e4afa1", + "https://deno.land/std@0.170.0/path/mod.ts": "cf7cec7ac11b7048bb66af8ae03513e66595c279c65cfa12bfc07d9599608b78", + "https://deno.land/std@0.170.0/path/posix.ts": "b859684bc4d80edfd4cad0a82371b50c716330bed51143d6dcdbe59e6278b30c", + "https://deno.land/std@0.170.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", + "https://deno.land/std@0.170.0/path/win32.ts": "7cebd2bda6657371adc00061a1d23fdd87bcdf64b4843bb148b0b24c11b40f69", + "https://deno.land/std@0.208.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.208.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.208.0/fs/_util.ts": "fbf57dcdc9f7bc8128d60301eece608246971a7836a3bb1e78da75314f08b978", + "https://deno.land/std@0.208.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40", + "https://deno.land/std@0.208.0/fs/expand_glob.ts": "4f98c508fc9e40d6311d2f7fd88aaad05235cc506388c22dda315e095305811d", + "https://deno.land/std@0.208.0/fs/walk.ts": "c1e6b43f72a46e89b630140308bd51a4795d416a416b4cfb7cd4bd1e25946723", + "https://deno.land/std@0.208.0/path/_common/assert_path.ts": "061e4d093d4ba5aebceb2c4da3318bfe3289e868570e9d3a8e327d91c2958946", + "https://deno.land/std@0.208.0/path/_common/basename.ts": "0d978ff818f339cd3b1d09dc914881f4d15617432ae519c1b8fdc09ff8d3789a", + "https://deno.land/std@0.208.0/path/_common/common.ts": "9e4233b2eeb50f8b2ae10ecc2108f58583aea6fd3e8907827020282dc2b76143", + "https://deno.land/std@0.208.0/path/_common/constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", + "https://deno.land/std@0.208.0/path/_common/dirname.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", + "https://deno.land/std@0.208.0/path/_common/format.ts": "11aa62e316dfbf22c126917f5e03ea5fe2ee707386555a8f513d27ad5756cf96", + "https://deno.land/std@0.208.0/path/_common/from_file_url.ts": "ef1bf3197d2efbf0297a2bdbf3a61d804b18f2bcce45548ae112313ec5be3c22", + "https://deno.land/std@0.208.0/path/_common/glob_to_reg_exp.ts": "5c3c2b79fc2294ec803d102bd9855c451c150021f452046312819fbb6d4dc156", + "https://deno.land/std@0.208.0/path/_common/normalize.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", + "https://deno.land/std@0.208.0/path/_common/normalize_string.ts": "88c472f28ae49525f9fe82de8c8816d93442d46a30d6bb5063b07ff8a89ff589", + "https://deno.land/std@0.208.0/path/_common/relative.ts": "1af19d787a2a84b8c534cc487424fe101f614982ae4851382c978ab2216186b4", + "https://deno.land/std@0.208.0/path/_common/strip_trailing_separators.ts": "7ffc7c287e97bdeeee31b155828686967f222cd73f9e5780bfe7dfb1b58c6c65", + "https://deno.land/std@0.208.0/path/_common/to_file_url.ts": "a8cdd1633bc9175b7eebd3613266d7c0b6ae0fb0cff24120b6092ac31662f9ae", + "https://deno.land/std@0.208.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", + "https://deno.land/std@0.208.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", + "https://deno.land/std@0.208.0/path/basename.ts": "04bb5ef3e86bba8a35603b8f3b69537112cdd19ce64b77f2522006da2977a5f3", + "https://deno.land/std@0.208.0/path/common.ts": "f4d061c7d0b95a65c2a1a52439edec393e906b40f1caf4604c389fae7caa80f5", + "https://deno.land/std@0.208.0/path/dirname.ts": "88a0a71c21debafc4da7a4cd44fd32e899462df458fbca152390887d41c40361", + "https://deno.land/std@0.208.0/path/extname.ts": "2da4e2490f3b48b7121d19fb4c91681a5e11bd6bd99df4f6f47d7a71bb6ecdf2", + "https://deno.land/std@0.208.0/path/format.ts": "3457530cc85d1b4bab175f9ae73998b34fd456c830d01883169af0681b8894fb", + "https://deno.land/std@0.208.0/path/from_file_url.ts": "e7fa233ea1dff9641e8d566153a24d95010110185a6f418dd2e32320926043f8", + "https://deno.land/std@0.208.0/path/glob.ts": "a00a81a55c02bbe074ab21a50b6495c6f7795f54cd718c824adaa92c6c9b7419", + "https://deno.land/std@0.208.0/path/glob_to_regexp.ts": "74d7448c471e293d03f05ccb968df4365fed6aaa508506b6325a8efdc01d8271", + "https://deno.land/std@0.208.0/path/is_absolute.ts": "67232b41b860571c5b7537f4954c88d86ae2ba45e883ee37d3dec27b74909d13", + "https://deno.land/std@0.208.0/path/is_glob.ts": "567dce5c6656bdedfc6b3ee6c0833e1e4db2b8dff6e62148e94a917f289c06ad", + "https://deno.land/std@0.208.0/path/join.ts": "98d3d76c819af4a11a81d5ba2dbb319f1ce9d63fc2b615597d4bcfddd4a89a09", + "https://deno.land/std@0.208.0/path/join_globs.ts": "9b84d5103b63d3dbed4b2cf8b12477b2ad415c7d343f1488505162dc0e5f4db8", + "https://deno.land/std@0.208.0/path/mod.ts": "3defabebc98279e62b392fee7a6937adc932a8f4dcd2471441e36c15b97b00e0", + "https://deno.land/std@0.208.0/path/normalize.ts": "aa95be9a92c7bd4f9dc0ba51e942a1973e2b93d266cd74f5ca751c136d520b66", + "https://deno.land/std@0.208.0/path/normalize_glob.ts": "674baa82e1c00b6cb153bbca36e06f8e0337cb8062db6d905ab5de16076ca46b", + "https://deno.land/std@0.208.0/path/parse.ts": "d87ff0deef3fb495bc0d862278ff96da5a06acf0625ca27769fc52ac0d3d6ece", + "https://deno.land/std@0.208.0/path/posix/_util.ts": "ecf49560fedd7dd376c6156cc5565cad97c1abe9824f4417adebc7acc36c93e5", + "https://deno.land/std@0.208.0/path/posix/basename.ts": "a630aeb8fd8e27356b1823b9dedd505e30085015407caa3396332752f6b8406a", + "https://deno.land/std@0.208.0/path/posix/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b", + "https://deno.land/std@0.208.0/path/posix/dirname.ts": "f48c9c42cc670803b505478b7ef162c7cfa9d8e751b59d278b2ec59470531472", + "https://deno.land/std@0.208.0/path/posix/extname.ts": "ee7f6571a9c0a37f9218fbf510c440d1685a7c13082c348d701396cc795e0be0", + "https://deno.land/std@0.208.0/path/posix/format.ts": "b94876f77e61bfe1f147d5ccb46a920636cd3cef8be43df330f0052b03875968", + "https://deno.land/std@0.208.0/path/posix/from_file_url.ts": "b97287a83e6407ac27bdf3ab621db3fccbf1c27df0a1b1f20e1e1b5acf38a379", + "https://deno.land/std@0.208.0/path/posix/glob_to_regexp.ts": "6ed00c71fbfe0ccc35977c35444f94e82200b721905a60bd1278b1b768d68b1a", + "https://deno.land/std@0.208.0/path/posix/is_absolute.ts": "159900a3422d11069d48395568217eb7fc105ceda2683d03d9b7c0f0769e01b8", + "https://deno.land/std@0.208.0/path/posix/is_glob.ts": "ec4fbc604b9db8487f7b56ab0e759b24a971ab6a45f7b0b698bc39b8b9f9680f", + "https://deno.land/std@0.208.0/path/posix/join.ts": "0c0d84bdc344876930126640011ec1b888e6facf74153ffad9ef26813aa2a076", + "https://deno.land/std@0.208.0/path/posix/join_globs.ts": "f4838d54b1f60a34a40625a3293f6e583135348be1b2974341ac04743cb26121", + "https://deno.land/std@0.208.0/path/posix/mod.ts": "f1b08a7f64294b7de87fc37190d63b6ce5b02889af9290c9703afe01951360ae", + "https://deno.land/std@0.208.0/path/posix/normalize.ts": "11de90a94ab7148cc46e5a288f7d732aade1d616bc8c862f5560fa18ff987b4b", + "https://deno.land/std@0.208.0/path/posix/normalize_glob.ts": "10a1840c628ebbab679254d5fa1c20e59106102354fb648a1765aed72eb9f3f9", + "https://deno.land/std@0.208.0/path/posix/parse.ts": "199208f373dd93a792e9c585352bfc73a6293411bed6da6d3bc4f4ef90b04c8e", + "https://deno.land/std@0.208.0/path/posix/relative.ts": "e2f230608b0f083e6deaa06e063943e5accb3320c28aef8d87528fbb7fe6504c", + "https://deno.land/std@0.208.0/path/posix/resolve.ts": "51579d83159d5c719518c9ae50812a63959bbcb7561d79acbdb2c3682236e285", + "https://deno.land/std@0.208.0/path/posix/separator.ts": "0b6573b5f3269a3164d8edc9cefc33a02dd51003731c561008c8bb60220ebac1", + "https://deno.land/std@0.208.0/path/posix/to_file_url.ts": "08d43ea839ee75e9b8b1538376cfe95911070a655cd312bc9a00f88ef14967b6", + "https://deno.land/std@0.208.0/path/posix/to_namespaced_path.ts": "c9228a0e74fd37e76622cd7b142b8416663a9b87db643302fa0926b5a5c83bdc", + "https://deno.land/std@0.208.0/path/relative.ts": "23d45ede8b7ac464a8299663a43488aad6b561414e7cbbe4790775590db6349c", + "https://deno.land/std@0.208.0/path/resolve.ts": "5b184efc87155a0af9fa305ff68a109e28de9aee81fc3e77cd01380f19daf867", + "https://deno.land/std@0.208.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", + "https://deno.land/std@0.208.0/path/to_file_url.ts": "edaafa089e0bce386e1b2d47afe7c72e379ff93b28a5829a5885e4b6c626d864", + "https://deno.land/std@0.208.0/path/to_namespaced_path.ts": "cf8734848aac3c7527d1689d2adf82132b1618eff3cc523a775068847416b22a", + "https://deno.land/std@0.208.0/path/windows/_util.ts": "f32b9444554c8863b9b4814025c700492a2b57ff2369d015360970a1b1099d54", + "https://deno.land/std@0.208.0/path/windows/basename.ts": "8a9dbf7353d50afbc5b221af36c02a72c2d1b2b5b9f7c65bf6a5a2a0baf88ad3", + "https://deno.land/std@0.208.0/path/windows/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b", + "https://deno.land/std@0.208.0/path/windows/dirname.ts": "5c2aa541384bf0bd9aca821275d2a8690e8238fa846198ef5c7515ce31a01a94", + "https://deno.land/std@0.208.0/path/windows/extname.ts": "07f4fa1b40d06a827446b3e3bcc8d619c5546b079b8ed0c77040bbef716c7614", + "https://deno.land/std@0.208.0/path/windows/format.ts": "343019130d78f172a5c49fdc7e64686a7faf41553268961e7b6c92a6d6548edf", + "https://deno.land/std@0.208.0/path/windows/from_file_url.ts": "d53335c12b0725893d768be3ac6bf0112cc5b639d2deb0171b35988493b46199", + "https://deno.land/std@0.208.0/path/windows/glob_to_regexp.ts": "290755e18ec6c1a4f4d711c3390537358e8e3179581e66261a0cf348b1a13395", + "https://deno.land/std@0.208.0/path/windows/is_absolute.ts": "245b56b5f355ede8664bd7f080c910a97e2169972d23075554ae14d73722c53c", + "https://deno.land/std@0.208.0/path/windows/is_glob.ts": "ec4fbc604b9db8487f7b56ab0e759b24a971ab6a45f7b0b698bc39b8b9f9680f", + "https://deno.land/std@0.208.0/path/windows/join.ts": "e6600bf88edeeef4e2276e155b8de1d5dec0435fd526ba2dc4d37986b2882f16", + "https://deno.land/std@0.208.0/path/windows/join_globs.ts": "f4838d54b1f60a34a40625a3293f6e583135348be1b2974341ac04743cb26121", + "https://deno.land/std@0.208.0/path/windows/mod.ts": "d7040f461465c2c21c1c68fc988ef0bdddd499912138cde3abf6ad60c7fb3814", + "https://deno.land/std@0.208.0/path/windows/normalize.ts": "9deebbf40c81ef540b7b945d4ccd7a6a2c5a5992f791e6d3377043031e164e69", + "https://deno.land/std@0.208.0/path/windows/normalize_glob.ts": "344ff5ed45430495b9a3d695567291e50e00b1b3b04ea56712a2acf07ab5c128", + "https://deno.land/std@0.208.0/path/windows/parse.ts": "120faf778fe1f22056f33ded069b68e12447668fcfa19540c0129561428d3ae5", + "https://deno.land/std@0.208.0/path/windows/relative.ts": "026855cd2c36c8f28f1df3c6fbd8f2449a2aa21f48797a74700c5d872b86d649", + "https://deno.land/std@0.208.0/path/windows/resolve.ts": "5ff441ab18a2346abadf778121128ee71bda4d0898513d4639a6ca04edca366b", + "https://deno.land/std@0.208.0/path/windows/separator.ts": "ae21f27015f10510ed1ac4a0ba9c4c9c967cbdd9d9e776a3e4967553c397bd5d", + "https://deno.land/std@0.208.0/path/windows/to_file_url.ts": "8e9ea9e1ff364aa06fa72999204229952d0a279dbb876b7b838b2b2fea55cce3", + "https://deno.land/std@0.208.0/path/windows/to_namespaced_path.ts": "e0f4d4a5e77f28a5708c1a33ff24360f35637ba6d8f103d19661255ef7bfd50d", + "https://deno.land/std@0.214.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", + "https://deno.land/std@0.214.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", + "https://deno.land/std@0.214.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad", + "https://deno.land/std@0.214.0/bytes/copy.ts": "f29c03168853720dfe82eaa57793d0b9e3543ebfe5306684182f0f1e3bfd422a", + "https://deno.land/std@0.214.0/crypto/_fnv/fnv32.ts": "ba2c5ef976b9f047d7ce2d33dfe18671afc75154bcf20ef89d932b2fe8820535", + "https://deno.land/std@0.214.0/crypto/_fnv/fnv64.ts": "580cadfe2ff333fe253d15df450f927c8ac7e408b704547be26aab41b5772558", + "https://deno.land/std@0.214.0/crypto/_fnv/mod.ts": "8dbb60f062a6e77b82f7a62ac11fabfba52c3cd408c21916b130d8f57a880f96", + "https://deno.land/std@0.214.0/crypto/_fnv/util.ts": "27b36ce3440d0a180af6bf1cfc2c326f68823288540a354dc1d636b781b9b75f", + "https://deno.land/std@0.214.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "76c727912539737def4549bb62a96897f37eb334b979f49c57b8af7a1617635e", + "https://deno.land/std@0.214.0/crypto/_wasm/mod.ts": "c55f91473846827f077dfd7e5fc6e2726dee5003b6a5747610707cdc638a22ba", + "https://deno.land/std@0.214.0/crypto/crypto.ts": "4448f8461c797adba8d70a2c60f7795a546d7a0926e96366391bffdd06491c16", + "https://deno.land/std@0.214.0/datetime/_common.ts": "a62214c1924766e008e27d3d843ceba4b545dc2aa9880de0ecdef9966d5736b6", + "https://deno.land/std@0.214.0/datetime/parse.ts": "bb248bbcb3cd54bcaf504a1ee670fc4695e429d9019c06af954bbe2bcb8f1d02", + "https://deno.land/std@0.214.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", + "https://deno.land/std@0.214.0/encoding/base64.ts": "96e61a556d933201266fea84ae500453293f2aff130057b579baafda096a96bc", + "https://deno.land/std@0.214.0/encoding/hex.ts": "4d47d3b25103cf81a2ed38f54b394d39a77b63338e1eaa04b70c614cb45ec2e6", + "https://deno.land/std@0.214.0/fmt/colors.ts": "aeaee795471b56fc62a3cb2e174ed33e91551b535f44677f6320336aabb54fbb", + "https://deno.land/std@0.214.0/io/buf_reader.ts": "c73aad99491ee6db3d6b001fa4a780e9245c67b9296f5bad9c0fa7384e35d47a", + "https://deno.land/std@0.214.0/io/buf_writer.ts": "f82f640c8b3a820f600a8da429ad0537037c7d6a78426bbca2396fb1f75d3ef4", + "https://deno.land/std@0.214.0/io/types.ts": "748bbb3ac96abda03594ef5a0db15ce5450dcc6c0d841c8906f8b10ac8d32c96", + "https://deno.land/std@0.214.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297", + "https://deno.land/std@0.214.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", + "https://deno.land/std@0.214.0/path/_common/common.ts": "6157c7ec1f4db2b4a9a187efd6ce76dcaf1e61cfd49f87e40d4ea102818df031", + "https://deno.land/std@0.214.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", + "https://deno.land/std@0.214.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.214.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", + "https://deno.land/std@0.214.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", + "https://deno.land/std@0.214.0/path/_common/glob_to_reg_exp.ts": "2007aa87bed6eb2c8ae8381adcc3125027543d9ec347713c1ad2c68427330770", + "https://deno.land/std@0.214.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.214.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", + "https://deno.land/std@0.214.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", + "https://deno.land/std@0.214.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", + "https://deno.land/std@0.214.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", + "https://deno.land/std@0.214.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600", + "https://deno.land/std@0.214.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", + "https://deno.land/std@0.214.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668", + "https://deno.land/std@0.214.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", + "https://deno.land/std@0.214.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", + "https://deno.land/std@0.214.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", + "https://deno.land/std@0.214.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", + "https://deno.land/std@0.214.0/path/format.ts": "98fad25f1af7b96a48efb5b67378fcc8ed77be895df8b9c733b86411632162af", + "https://deno.land/std@0.214.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", + "https://deno.land/std@0.214.0/path/glob_to_regexp.ts": "83c5fd36a8c86f5e72df9d0f45317f9546afa2ce39acaafe079d43a865aced08", + "https://deno.land/std@0.214.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", + "https://deno.land/std@0.214.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", + "https://deno.land/std@0.214.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", + "https://deno.land/std@0.214.0/path/join_globs.ts": "e9589869a33dc3982101898ee50903db918ca00ad2614dbe3934d597d7b1fbea", + "https://deno.land/std@0.214.0/path/mod.ts": "ffeaccb713dbe6c72e015b7c767f753f8ec5fbc3b621ff5eeee486ffc2c0ddda", + "https://deno.land/std@0.214.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", + "https://deno.land/std@0.214.0/path/normalize_glob.ts": "98ee8268fad271193603271c203ae973280b5abfbdd2cbca1053fd2af71869ca", + "https://deno.land/std@0.214.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb", + "https://deno.land/std@0.214.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", + "https://deno.land/std@0.214.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843", + "https://deno.land/std@0.214.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.214.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", + "https://deno.land/std@0.214.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b", + "https://deno.land/std@0.214.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", + "https://deno.land/std@0.214.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", + "https://deno.land/std@0.214.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", + "https://deno.land/std@0.214.0/path/posix/glob_to_regexp.ts": "54d3ff40f309e3732ab6e5b19d7111d2d415248bcd35b67a99defcbc1972e697", + "https://deno.land/std@0.214.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", + "https://deno.land/std@0.214.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.214.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3", + "https://deno.land/std@0.214.0/path/posix/join_globs.ts": "ee2f4676c5b8a0dfa519da58b8ade4d1c4aa8dd3fe35619edec883ae9df1f8c9", + "https://deno.land/std@0.214.0/path/posix/mod.ts": "563a18c2b3ddc62f3e4a324ff0f583e819b8602a72ad880cb98c9e2e34f8db5b", + "https://deno.land/std@0.214.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", + "https://deno.land/std@0.214.0/path/posix/normalize_glob.ts": "65f0138fa518ef9ece354f32889783fc38cdf985fb02dcf1c3b14fa47d665640", + "https://deno.land/std@0.214.0/path/posix/parse.ts": "d5bac4eb21262ab168eead7e2196cb862940c84cee572eafedd12a0d34adc8fb", + "https://deno.land/std@0.214.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", + "https://deno.land/std@0.214.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a", + "https://deno.land/std@0.214.0/path/posix/separator.ts": "c9ecae5c843170118156ac5d12dc53e9caf6a1a4c96fc8b1a0ab02dff5c847b0", + "https://deno.land/std@0.214.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", + "https://deno.land/std@0.214.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", + "https://deno.land/std@0.214.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", + "https://deno.land/std@0.214.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", + "https://deno.land/std@0.214.0/path/separator.ts": "c6c890507f944a1f5cb7d53b8d638d6ce3cf0f34609c8d84a10c1eaa400b77a9", + "https://deno.land/std@0.214.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", + "https://deno.land/std@0.214.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", + "https://deno.land/std@0.214.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", + "https://deno.land/std@0.214.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe", + "https://deno.land/std@0.214.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.214.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", + "https://deno.land/std@0.214.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", + "https://deno.land/std@0.214.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", + "https://deno.land/std@0.214.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", + "https://deno.land/std@0.214.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", + "https://deno.land/std@0.214.0/path/windows/glob_to_regexp.ts": "6dcd1242bd8907aa9660cbdd7c93446e6927b201112b0cba37ca5d80f81be51b", + "https://deno.land/std@0.214.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", + "https://deno.land/std@0.214.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.214.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3", + "https://deno.land/std@0.214.0/path/windows/join_globs.ts": "ee2f4676c5b8a0dfa519da58b8ade4d1c4aa8dd3fe35619edec883ae9df1f8c9", + "https://deno.land/std@0.214.0/path/windows/mod.ts": "7d6062927bda47c47847ffb55d8f1a37b0383840aee5c7dfc93984005819689c", + "https://deno.land/std@0.214.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", + "https://deno.land/std@0.214.0/path/windows/normalize_glob.ts": "179c86ba89f4d3fe283d2addbe0607341f79ee9b1ae663abcfb3439db2e97810", + "https://deno.land/std@0.214.0/path/windows/parse.ts": "b9239edd892a06a06625c1b58425e199f018ce5649ace024d144495c984da734", + "https://deno.land/std@0.214.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", + "https://deno.land/std@0.214.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3", + "https://deno.land/std@0.214.0/path/windows/separator.ts": "e51c5522140eff4f8402617c5c68a201fdfa3a1a8b28dc23587cff931b665e43", + "https://deno.land/std@0.214.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484", + "https://deno.land/std@0.214.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", + "https://deno.land/std@0.216.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975", + "https://deno.land/std@0.216.0/assert/_diff.ts": "dcc63d94ca289aec80644030cf88ccbf7acaa6fbd7b0f22add93616b36593840", + "https://deno.land/std@0.216.0/assert/_format.ts": "0ba808961bf678437fb486b56405b6fefad2cf87b5809667c781ddee8c32aff4", + "https://deno.land/std@0.216.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5", + "https://deno.land/std@0.216.0/assert/assert_almost_equals.ts": "8b96b7385cc117668b0720115eb6ee73d04c9bcb2f5d2344d674918c9113688f", + "https://deno.land/std@0.216.0/assert/assert_array_includes.ts": "1688d76317fd45b7e93ef9e2765f112fdf2b7c9821016cdfb380b9445374aed1", + "https://deno.land/std@0.216.0/assert/assert_equals.ts": "4497c56fe7d2993b0d447926702802fc0becb44e319079e8eca39b482ee01b4e", + "https://deno.land/std@0.216.0/assert/assert_exists.ts": "24a7bf965e634f909242cd09fbaf38bde6b791128ece08e33ab08586a7cc55c9", + "https://deno.land/std@0.216.0/assert/assert_false.ts": "6f382568e5128c0f855e5f7dbda8624c1ed9af4fcc33ef4a9afeeedcdce99769", + "https://deno.land/std@0.216.0/assert/assert_greater.ts": "4945cf5729f1a38874d7e589e0fe5cc5cd5abe5573ca2ddca9d3791aa891856c", + "https://deno.land/std@0.216.0/assert/assert_greater_or_equal.ts": "573ed8823283b8d94b7443eb69a849a3c369a8eb9666b2d1db50c33763a5d219", + "https://deno.land/std@0.216.0/assert/assert_instance_of.ts": "72dc1faff1e248692d873c89382fa1579dd7b53b56d52f37f9874a75b11ba444", + "https://deno.land/std@0.216.0/assert/assert_is_error.ts": "6596f2b5ba89ba2fe9b074f75e9318cda97a2381e59d476812e30077fbdb6ed2", + "https://deno.land/std@0.216.0/assert/assert_less.ts": "2b4b3fe7910f65f7be52212f19c3977ecb8ba5b2d6d0a296c83cde42920bb005", + "https://deno.land/std@0.216.0/assert/assert_less_or_equal.ts": "b93d212fe669fbde959e35b3437ac9a4468f2e6b77377e7b6ea2cfdd825d38a0", + "https://deno.land/std@0.216.0/assert/assert_match.ts": "ec2d9680ed3e7b9746ec57ec923a17eef6d476202f339ad91d22277d7f1d16e1", + "https://deno.land/std@0.216.0/assert/assert_not_equals.ts": "ac86413ab70ffb14fdfc41740ba579a983fe355ba0ce4a9ab685e6b8e7f6a250", + "https://deno.land/std@0.216.0/assert/assert_not_instance_of.ts": "8f720d92d83775c40b2542a8d76c60c2d4aeddaf8713c8d11df8984af2604931", + "https://deno.land/std@0.216.0/assert/assert_not_match.ts": "b4b7c77f146963e2b673c1ce4846473703409eb93f5ab0eb60f6e6f8aeffe39f", + "https://deno.land/std@0.216.0/assert/assert_not_strict_equals.ts": "da0b8ab60a45d5a9371088378e5313f624799470c3b54c76e8b8abeec40a77be", + "https://deno.land/std@0.216.0/assert/assert_object_match.ts": "e85e5eef62a56ce364c3afdd27978ccab979288a3e772e6855c270a7b118fa49", + "https://deno.land/std@0.216.0/assert/assert_rejects.ts": "e9e0c8d9c3e164c7ac962c37b3be50577c5a2010db107ed272c4c1afb1269f54", + "https://deno.land/std@0.216.0/assert/assert_strict_equals.ts": "0425a98f70badccb151644c902384c12771a93e65f8ff610244b8147b03a2366", + "https://deno.land/std@0.216.0/assert/assert_string_includes.ts": "dfb072a890167146f8e5bdd6fde887ce4657098e9f71f12716ef37f35fb6f4a7", + "https://deno.land/std@0.216.0/assert/assert_throws.ts": "edddd86b39606c342164b49ad88dd39a26e72a26655e07545d172f164b617fa7", + "https://deno.land/std@0.216.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8", + "https://deno.land/std@0.216.0/assert/equal.ts": "fae5e8a52a11d3ac694bbe1a53e13a7969e3f60791262312e91a3e741ae519e2", + "https://deno.land/std@0.216.0/assert/fail.ts": "f310e51992bac8e54f5fd8e44d098638434b2edb802383690e0d7a9be1979f1c", + "https://deno.land/std@0.216.0/assert/mod.ts": "325df8c0683ad83a873b9691aa66b812d6275fc9fec0b2d180ac68a2c5efed3b", + "https://deno.land/std@0.216.0/assert/unimplemented.ts": "47ca67d1c6dc53abd0bd729b71a31e0825fc452dbcd4fde4ca06789d5644e7fd", + "https://deno.land/std@0.216.0/assert/unreachable.ts": "38cfecb95d8b06906022d2f9474794fca4161a994f83354fd079cac9032b5145", + "https://deno.land/std@0.216.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad", + "https://deno.land/std@0.216.0/datetime/constants.ts": "5c198b3b47fbcc4d913e61dcae1c37e053937affc2c9a6a5ad7e5473bab3e4a6", + "https://deno.land/std@0.216.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", + "https://deno.land/std@0.216.0/encoding/hex.ts": "4d47d3b25103cf81a2ed38f54b394d39a77b63338e1eaa04b70c614cb45ec2e6", + "https://deno.land/std@0.216.0/flags/mod.ts": "9f13f3a49c54618277ac49195af934f1c7d235731bcf80fd33b8b234e6839ce9", + "https://deno.land/std@0.216.0/fmt/colors.ts": "d239d84620b921ea520125d778947881f62c50e78deef2657073840b8af9559a", + "https://deno.land/std@0.216.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412", + "https://deno.land/std@0.216.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", + "https://deno.land/std@0.216.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f", + "https://deno.land/std@0.216.0/fs/_is_subdir.ts": "c68b309d46cc8568ed83c000f608a61bbdba0943b7524e7a30f9e450cf67eecd", + "https://deno.land/std@0.216.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", + "https://deno.land/std@0.216.0/fs/copy.ts": "dc0f68c4b6c3b090bfdb909387e309f6169b746bd713927c9507c9ef545d71f6", + "https://deno.land/std@0.216.0/fs/empty_dir.ts": "4f01e6d56e2aa8d90ad60f20bc25601f516b00f6c3044cdf6863a058791d91aa", + "https://deno.land/std@0.216.0/fs/ensure_dir.ts": "dffff68de0d10799b5aa9e39dec4e327e12bbd29e762292193684542648c4aeb", + "https://deno.land/std@0.216.0/fs/ensure_file.ts": "ac5cfde94786b0284d2c8e9f7f9425269bea1b2140612b4aea1f20b508870f59", + "https://deno.land/std@0.216.0/fs/ensure_link.ts": "d42af2edefeaa9817873ec6e46dc5d209ac4d744f8c69c5ecc2dffade78465b6", + "https://deno.land/std@0.216.0/fs/ensure_symlink.ts": "aee3f1655700f60090b4a3037f5b6c07ab37c36807cccad746ce89987719e6d2", + "https://deno.land/std@0.216.0/fs/eol.ts": "c9807291f78361d49fd986a9be04654610c615c5e2ec63d748976197d30ff206", + "https://deno.land/std@0.216.0/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5", + "https://deno.land/std@0.216.0/fs/expand_glob.ts": "a1ce02b05ed7b96985b0665067c9f1018f3f2ade7ee0fb0d629231050260b158", + "https://deno.land/std@0.216.0/fs/mod.ts": "107f5afa4424c2d3ce2f7e9266173198da30302c69af662c720115fe504dc5ee", + "https://deno.land/std@0.216.0/fs/move.ts": "39e0d7ccb88a566d20b949712020e766b15ef1ec19159573d11f949bd677909c", + "https://deno.land/std@0.216.0/fs/walk.ts": "78e1d01a9f75715614bf8d6e58bd77d9fafb1222c41194e607cd3849d7a0e771", + "https://deno.land/std@0.216.0/http/server.ts": "6dce295abc169d0956ae00432441331b3425afad4d79e8b3475739be2f04d614", + "https://deno.land/std@0.216.0/http/status.ts": "ed61b4882af2514a81aefd3245e8df4c47b9a8e54929a903577643d2d1ebf514", + "https://deno.land/std@0.216.0/json/common.ts": "33f1a4f39a45e2f9f357823fd0b5cf88b63fb4784b8c9a28f8120f70a20b23e9", + "https://deno.land/std@0.216.0/jsonc/mod.ts": "82722888823e1af5a8f7918bf810ea581f68081064d529218533acad6cb7c2bc", + "https://deno.land/std@0.216.0/jsonc/parse.ts": "747a0753289fdbfcb9cb86b709b56348c98abc107fbb0a7f350b87af4425a76a", + "https://deno.land/std@0.216.0/media_types/_db.ts": "1d695d9fe1c785e523d6de7191b33f33ecc7866db77358a4f966221cca56e2f9", + "https://deno.land/std@0.216.0/media_types/_util.ts": "afd54920a8a81add64248897898d3f30ca414a8803fe0c4e6d2893a3f6bd32b0", + "https://deno.land/std@0.216.0/media_types/content_type.ts": "ed3f2e1f243b418ad3f441edc95fd92efbadb0f9bde36219c7564c67f9639513", + "https://deno.land/std@0.216.0/media_types/format_media_type.ts": "ffef4718afa2489530cb94021bb865a466eb02037609f7e82899c017959d288a", + "https://deno.land/std@0.216.0/media_types/get_charset.ts": "bce5c0343c14590516cbfa1a3e80891d9a7a53bc9b4a9010061cc4f879e18f6c", + "https://deno.land/std@0.216.0/media_types/parse_media_type.ts": "487f000a38c230ccbac25420a50f600862e06796d0eee19d19631b9e84ee9654", + "https://deno.land/std@0.216.0/media_types/type_by_extension.ts": "bf4e3f5d6b58b624d5daa01cbb8b1e86d9939940a77e7c26e796a075b60ec73b", + "https://deno.land/std@0.216.0/media_types/vendor/mime-db.v1.52.0.ts": "0218d2c7d900e8cd6fa4a866e0c387712af4af9a1bae55d6b2546c73d273a1e6", + "https://deno.land/std@0.216.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297", + "https://deno.land/std@0.216.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2", + "https://deno.land/std@0.216.0/path/_common/common.ts": "6157c7ec1f4db2b4a9a187efd6ce76dcaf1e61cfd49f87e40d4ea102818df031", + "https://deno.land/std@0.216.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", + "https://deno.land/std@0.216.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.216.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b", + "https://deno.land/std@0.216.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", + "https://deno.land/std@0.216.0/path/_common/glob_to_reg_exp.ts": "2007aa87bed6eb2c8ae8381adcc3125027543d9ec347713c1ad2c68427330770", + "https://deno.land/std@0.216.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.216.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965", + "https://deno.land/std@0.216.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607", + "https://deno.land/std@0.216.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", + "https://deno.land/std@0.216.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", + "https://deno.land/std@0.216.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600", + "https://deno.land/std@0.216.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", + "https://deno.land/std@0.216.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668", + "https://deno.land/std@0.216.0/path/common.ts": "03e52e22882402c986fe97ca3b5bb4263c2aa811c515ce84584b23bac4cc2643", + "https://deno.land/std@0.216.0/path/constants.ts": "0c206169ca104938ede9da48ac952de288f23343304a1c3cb6ec7625e7325f36", + "https://deno.land/std@0.216.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", + "https://deno.land/std@0.216.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441", + "https://deno.land/std@0.216.0/path/format.ts": "98fad25f1af7b96a48efb5b67378fcc8ed77be895df8b9c733b86411632162af", + "https://deno.land/std@0.216.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", + "https://deno.land/std@0.216.0/path/glob_to_regexp.ts": "5e51f78a0248c75464bf1d49173de3ec2c032880a530578e56b3fed2a57e69d3", + "https://deno.land/std@0.216.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7", + "https://deno.land/std@0.216.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141", + "https://deno.land/std@0.216.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a", + "https://deno.land/std@0.216.0/path/join_globs.ts": "5b3bf248b93247194f94fa6947b612ab9d3abd571ca8386cf7789038545e54a0", + "https://deno.land/std@0.216.0/path/mod.ts": "6f856db94f6a72fc2cf69e0a85eb523aee6a3cd274470717e96f4bee0c9fe329", + "https://deno.land/std@0.216.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352", + "https://deno.land/std@0.216.0/path/normalize_glob.ts": "cc89a77a7d3b1d01053b9dcd59462b75482b11e9068ae6c754b5cf5d794b374f", + "https://deno.land/std@0.216.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb", + "https://deno.land/std@0.216.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", + "https://deno.land/std@0.216.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843", + "https://deno.land/std@0.216.0/path/posix/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.216.0/path/posix/constants.ts": "93481efb98cdffa4c719c22a0182b994e5a6aed3047e1962f6c2c75b7592bef1", + "https://deno.land/std@0.216.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b", + "https://deno.land/std@0.216.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427", + "https://deno.land/std@0.216.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1", + "https://deno.land/std@0.216.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", + "https://deno.land/std@0.216.0/path/posix/glob_to_regexp.ts": "54d3ff40f309e3732ab6e5b19d7111d2d415248bcd35b67a99defcbc1972e697", + "https://deno.land/std@0.216.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", + "https://deno.land/std@0.216.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.216.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3", + "https://deno.land/std@0.216.0/path/posix/join_globs.ts": "f6e2619c196b82d8fd67ba2cf680e5b44461f38bdfeec26d7b3f55bd92a85988", + "https://deno.land/std@0.216.0/path/posix/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", + "https://deno.land/std@0.216.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91", + "https://deno.land/std@0.216.0/path/posix/normalize_glob.ts": "41b477068deb832df7f51d6e2b3c0bc274d20919e20c5240d785ba535572d3d0", + "https://deno.land/std@0.216.0/path/posix/parse.ts": "d5bac4eb21262ab168eead7e2196cb862940c84cee572eafedd12a0d34adc8fb", + "https://deno.land/std@0.216.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c", + "https://deno.land/std@0.216.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a", + "https://deno.land/std@0.216.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", + "https://deno.land/std@0.216.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0", + "https://deno.land/std@0.216.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add", + "https://deno.land/std@0.216.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", + "https://deno.land/std@0.216.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", + "https://deno.land/std@0.216.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40", + "https://deno.land/std@0.216.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", + "https://deno.land/std@0.216.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe", + "https://deno.land/std@0.216.0/path/windows/common.ts": "26f60ccc8b2cac3e1613000c23ac5a7d392715d479e5be413473a37903a2b5d4", + "https://deno.land/std@0.216.0/path/windows/constants.ts": "5afaac0a1f67b68b0a380a4ef391bf59feb55856aa8c60dfc01bd3b6abb813f5", + "https://deno.land/std@0.216.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", + "https://deno.land/std@0.216.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef", + "https://deno.land/std@0.216.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6", + "https://deno.land/std@0.216.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", + "https://deno.land/std@0.216.0/path/windows/glob_to_regexp.ts": "6dcd1242bd8907aa9660cbdd7c93446e6927b201112b0cba37ca5d80f81be51b", + "https://deno.land/std@0.216.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", + "https://deno.land/std@0.216.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9", + "https://deno.land/std@0.216.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3", + "https://deno.land/std@0.216.0/path/windows/join_globs.ts": "f6e2619c196b82d8fd67ba2cf680e5b44461f38bdfeec26d7b3f55bd92a85988", + "https://deno.land/std@0.216.0/path/windows/mod.ts": "2301fc1c54a28b349e20656f68a85f75befa0ee9b6cd75bfac3da5aca9c3f604", + "https://deno.land/std@0.216.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780", + "https://deno.land/std@0.216.0/path/windows/normalize_glob.ts": "c57c186b0785ba5320a85e573c264f42c46eb1d0a4a78611f4791a7083baaa17", + "https://deno.land/std@0.216.0/path/windows/parse.ts": "b9239edd892a06a06625c1b58425e199f018ce5649ace024d144495c984da734", + "https://deno.land/std@0.216.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7", + "https://deno.land/std@0.216.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3", + "https://deno.land/std@0.216.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484", + "https://deno.land/std@0.216.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c", + "https://deno.land/std@0.216.0/regexp/escape.ts": "57303d6c9c6aa058d9a79a3c70113c545391639a87e9a18428220c1bad407549", + "https://deno.land/std@0.216.0/semver/_comparator_format.ts": "b5a56b999670c0b3a3e8ad437ca0fafbfce0e973bba6769979d7665e318e8b6c", + "https://deno.land/std@0.216.0/semver/_comparator_intersects.ts": "65b744d76b3be4ed91afd149754f530681032890d32fd65d02faf8ef96491cb7", + "https://deno.land/std@0.216.0/semver/_comparator_max.ts": "c3a97d5b43b9104afa3687780500ef79b69ae5107cee2359004f80ea48969c7d", + "https://deno.land/std@0.216.0/semver/_comparator_min.ts": "080a9939b177d64904e1772da02dc4673f9cd1b3c9ae1a5c534cfdf4bb3ee9af", + "https://deno.land/std@0.216.0/semver/_constants.ts": "90879e4ea94a34c49c8ecea3d9c06e13e61ecb7caca80c8f289139440ca9835a", + "https://deno.land/std@0.216.0/semver/_is_comparator.ts": "d032762a6993b7cd3e4243cbeded0eeab70773dff960d4e92af8770550eea7b6", + "https://deno.land/std@0.216.0/semver/_parse_comparator.ts": "2dfa7f08da84038f8e2c50d629a329b2870a096791fd1f299a00de3bb547c34a", + "https://deno.land/std@0.216.0/semver/_shared.ts": "8d44684775cde4a64bd6bdb99b51f3bc59ed65f10af78ca136cc2eab3f6716f1", + "https://deno.land/std@0.216.0/semver/can_parse.ts": "d4a26f74be078f3ab10293b07bf022021a2f362b3e21b58422c214e7268110b2", + "https://deno.land/std@0.216.0/semver/compare.ts": "e8871844a35cc8fe16e883c16e5237e06a93aa4830ae10d06501abe63586fc57", + "https://deno.land/std@0.216.0/semver/constants.ts": "04c8625428552e967c85c59e80766441418839f7a94c50c652c6a9d83b0f3ef1", + "https://deno.land/std@0.216.0/semver/difference.ts": "be4f01b7745406408a16b708185a48c1c652cc87e0244b12a5ca75c5585db668", + "https://deno.land/std@0.216.0/semver/equals.ts": "8b9b18260c9a55feee9d3f9250fba345be922380f2e8f8009e455c394ce5e81d", + "https://deno.land/std@0.216.0/semver/format.ts": "26d3a357ac5abd73dee0fe7dbbac6107fbdce0a844370c7b1bcb673c92e46bf6", + "https://deno.land/std@0.216.0/semver/format_range.ts": "ee96cc1f3002cfb62b821477f1a90374e6c021ec13045c34a0620021b1d862af", + "https://deno.land/std@0.216.0/semver/greater_or_equal.ts": "89c26f68070896944676eb9704cbb617febc6ed693720282741d6859c3d1fe80", + "https://deno.land/std@0.216.0/semver/greater_than.ts": "d8c4a227cd28ea80a1de9c80215d7f3f95786fe1b196f0cb5ec91d6567adad27", + "https://deno.land/std@0.216.0/semver/gtr.ts": "1101ecf6f427de9ba6348860f312c15b55f9301f97d2e34bd9e57957184574e9", + "https://deno.land/std@0.216.0/semver/increment.ts": "427a043be71d6481e45c1a3939b955e800924d70779cb297b872d9cbf9f0e46d", + "https://deno.land/std@0.216.0/semver/is_range.ts": "4cea4096436ea02555d38cc758effd978ca77d8ae63d8db15f2910b1ff04aec2", + "https://deno.land/std@0.216.0/semver/is_semver.ts": "57914027d6141e593eb04418aaabbfd6f4562a1c53c6c33a1743fa50ada8d849", + "https://deno.land/std@0.216.0/semver/less_or_equal.ts": "7dbf8190f37f3281048c30cf11e072a7af18685534ae88d295baa170b485bd90", + "https://deno.land/std@0.216.0/semver/less_than.ts": "b0c7902c54cecadcc7c1c80afc2f6a0f1bf0b3f53c8d2bfd11f01a3a414cccfe", + "https://deno.land/std@0.216.0/semver/ltr.ts": "4c147830444c9020eccc17cd8d4d9aced5b0f6cfb3c8b99fb9cdcca8fe90356f", + "https://deno.land/std@0.216.0/semver/max_satisfying.ts": "03e5182a7424c308ddbb410e4b927da0dabc4e07d4b5a72f7e9b26fb18a02152", + "https://deno.land/std@0.216.0/semver/min_satisfying.ts": "b6fadc9af17278289481c416e1eb135614f88063f4fc2b7b72b43eb3baa2f08f", + "https://deno.land/std@0.216.0/semver/mod.ts": "6fcb9531909763993c70e1278b898cc9dd1373d6f4cbcdc41be4fc629e9e2052", + "https://deno.land/std@0.216.0/semver/not_equals.ts": "17147a6f68b9d14f4643c1e2150378ccf6954710309f9618f75b411752a8e13d", + "https://deno.land/std@0.216.0/semver/parse.ts": "2ba215c9aa3c71be753570724cfad75cc81972f0026dc81836ea3d1986112066", + "https://deno.land/std@0.216.0/semver/parse_range.ts": "7ce841031e14af27c9abcc10878efe60135de59c935e311d671a91ffc48bbc46", + "https://deno.land/std@0.216.0/semver/range_intersects.ts": "28de545143652cffa447e859ad087d75e74c009762df0ebc2f03cca2eed9831d", + "https://deno.land/std@0.216.0/semver/range_max.ts": "b994695e885045518e1655a2c519d726003c7381b3e64be2090663378a6bfe20", + "https://deno.land/std@0.216.0/semver/range_min.ts": "269ace0521e055fe10ef8c3d342ddf2cf3eb9c53a8efb2eecac198085cc789c3", + "https://deno.land/std@0.216.0/semver/reverse_sort.ts": "98316b5c960cb0608df949d563328c7696d6b4f76ccea22a08974d27c1969893", + "https://deno.land/std@0.216.0/semver/test_range.ts": "6262307357a8b413dc34546c8401392ed2bc7a5e4ddd999195a56a0fe4fc1d4a", + "https://deno.land/std@0.216.0/semver/try_parse.ts": "a2639ec588c374331d5f655bfbdf8d5a2f2cc704c8b56ac94cd077944de150c7", + "https://deno.land/std@0.216.0/semver/try_parse_range.ts": "239e0d711c5745da8c4dcda3c0797b4b5a83bfe494a51d3a0f005472cdc7b016", + "https://deno.land/std@0.216.0/semver/types.ts": "8ed52c8cfc59e249a0dbab597d8c31bcf10405dcbe9714585055ea02252ae0d0", + "https://deno.land/std@0.216.0/testing/snapshot.ts": "35ca1c8e8bfb98d7b7e794f1b7be8d992483fcff572540e41396f22a5bddb944", + "https://deno.land/std@0.224.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975", + "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834", + "https://deno.land/std@0.224.0/assert/assert_almost_equals.ts": "9e416114322012c9a21fa68e187637ce2d7df25bcbdbfd957cd639e65d3cf293", + "https://deno.land/std@0.224.0/assert/assert_equals.ts": "3bbca947d85b9d374a108687b1a8ba3785a7850436b5a8930d81f34a32cb8c74", + "https://deno.land/std@0.224.0/assert/assert_false.ts": "3e9be8e33275db00d952e9acb0cd29481a44fa0a4af6d37239ff58d79e8edeff", + "https://deno.land/std@0.224.0/assert/assert_instance_of.ts": "e22343c1fdcacfaea8f37784ad782683ec1cf599ae9b1b618954e9c22f376f2c", + "https://deno.land/std@0.224.0/assert/assert_is_error.ts": "f856b3bc978a7aa6a601f3fec6603491ab6255118afa6baa84b04426dd3cc491", + "https://deno.land/std@0.224.0/assert/assert_not_equals.ts": "78d45dd46133d76ce624b2c6c09392f6110f0df9b73f911d20208a68dee2ef29", + "https://deno.land/std@0.224.0/assert/assert_rejects.ts": "4bee1d6d565a5b623146a14668da8f9eb1f026a4f338bbf92b37e43e0aa53c31", + "https://deno.land/std@0.224.0/assert/assert_throws.ts": "c6508b2879d465898dab2798009299867e67c570d7d34c90a2d235e4553906eb", + "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917", + "https://deno.land/std@0.224.0/assert/equal.ts": "bddf07bb5fc718e10bb72d5dc2c36c1ce5a8bdd3b647069b6319e07af181ac47", + "https://deno.land/std@0.224.0/assert/unreachable.ts": "5ae3dbf63ef988615b93eb08d395dda771c96546565f9e521ed86f6510c29e19", + "https://deno.land/std@0.224.0/async/delay.ts": "f90dd685b97c2f142b8069082993e437b1602b8e2561134827eeb7c12b95c499", + "https://deno.land/std@0.224.0/bytes/concat.ts": "86161274b5546a02bdb3154652418efe7af8c9310e8d54107a68aaa148e0f5ed", + "https://deno.land/std@0.224.0/crypto/timing_safe_equal.ts": "bc3622b5aec05e2d8b735bf60633425c34333c06cfb6c4a9f102e4a0f3931ced", + "https://deno.land/std@0.224.0/data_structures/_binary_search_node.ts": "ce1da11601fef0638df4d1e53c377f791f96913383277389286b390685d76c07", + "https://deno.land/std@0.224.0/data_structures/_red_black_node.ts": "4af8d3c5ac5f119d8058269259c46ea22ead567246cacde04584a83e43a9d2ea", + "https://deno.land/std@0.224.0/data_structures/binary_search_tree.ts": "2dd43d97ce5f5a4bdba11b075eb458db33e9143f50997b0eebf02912cb44f5d5", + "https://deno.land/std@0.224.0/data_structures/comparators.ts": "17dfa68bf1550edadbfdd453a06f9819290bcb534c9945b5cec4b30242cff475", + "https://deno.land/std@0.224.0/data_structures/red_black_tree.ts": "2222be0c46842fc932e2c8589a66dced9e6eae180914807c5c55d1aa4c8c1b9b", + "https://deno.land/std@0.224.0/datetime/constants.ts": "5df80a84e301da6db5793804122c034d2d090da31f1e1c5fdaa831fc70a45da7", + "https://deno.land/std@0.224.0/dotenv/mod.ts": "0180eaeedaaf88647318811cdaa418cc64dc51fb08354f91f5f480d0a1309f7d", + "https://deno.land/std@0.224.0/dotenv/parse.ts": "09977ff88dfd1f24f9973a338f0f91bbdb9307eb5ff6085446e7c423e4c7ba0c", + "https://deno.land/std@0.224.0/dotenv/stringify.ts": "275da322c409170160440836342eaa7cf012a1d11a7e700d8ca4e7f2f8aa4615", + "https://deno.land/std@0.224.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376", + "https://deno.land/std@0.224.0/encoding/base58.ts": "fec1fd3d9926860e3082359de9046fca816e33378ab58071619224b4dd5b9038", + "https://deno.land/std@0.224.0/encoding/base64.ts": "dd59695391584c8ffc5a296ba82bcdba6dd8a84d41a6a539fbee8e5075286eaf", + "https://deno.land/std@0.224.0/encoding/base64url.ts": "ef40e0f18315ab539f17cebcc32839779e018d86dea9df39d94d302f342a1713", + "https://deno.land/std@0.224.0/fmt/colors.ts": "508563c0659dd7198ba4bbf87e97f654af3c34eb56ba790260f252ad8012e1c5", + "https://deno.land/std@0.224.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd", + "https://deno.land/std@0.224.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e", + "https://deno.land/std@0.224.0/fs/ensure_dir.ts": "51a6279016c65d2985f8803c848e2888e206d1b510686a509fa7cc34ce59d29f", + "https://deno.land/std@0.224.0/fs/ensure_file.ts": "67608cf550529f3d4aa1f8b6b36bf817bdc40b14487bf8f60e61cbf68f507cf3", + "https://deno.land/std@0.224.0/http/cookie.ts": "a377fa60175ba5f61dd4b8a70b34f2bbfbc70782dfd5faf36d314c42e4306006", + "https://deno.land/std@0.224.0/internal/diff.ts": "6234a4b493ebe65dc67a18a0eb97ef683626a1166a1906232ce186ae9f65f4e6", + "https://deno.land/std@0.224.0/internal/format.ts": "0a98ee226fd3d43450245b1844b47003419d34d210fa989900861c79820d21c2", + "https://deno.land/std@0.224.0/internal/mod.ts": "534125398c8e7426183e12dc255bb635d94e06d0f93c60a297723abe69d3b22e", + "https://deno.land/std@0.224.0/msgpack/decode.ts": "e2b458dcc217faa1c49f4feb4854ebbc2a44cf154a026726a4ef6d86728d528a", + "https://deno.land/std@0.224.0/msgpack/encode.ts": "6e79f235b528cba2dd52dc99f4d4b7996808379eea4d342a560d7cf25d62d7e3", + "https://deno.land/std@0.224.0/msgpack/mod.ts": "f061a74b20780e8fd46cb19d6d2c05f12d2ca8636f1216a1912dfbcfce308bfc", + "https://deno.land/std@0.224.0/path/_common/assert_path.ts": "dbdd757a465b690b2cc72fc5fb7698c51507dec6bfafce4ca500c46b76ff7bd8", + "https://deno.land/std@0.224.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c", + "https://deno.land/std@0.224.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8", + "https://deno.land/std@0.224.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf", + "https://deno.land/std@0.224.0/path/_common/normalize_string.ts": "33edef773c2a8e242761f731adeb2bd6d683e9c69e4e3d0092985bede74f4ac3", + "https://deno.land/std@0.224.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a", + "https://deno.land/std@0.224.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883", + "https://deno.land/std@0.224.0/path/_interface.ts": "8dfeb930ca4a772c458a8c7bbe1e33216fe91c253411338ad80c5b6fa93ddba0", + "https://deno.land/std@0.224.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15", + "https://deno.land/std@0.224.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c", + "https://deno.land/std@0.224.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069", + "https://deno.land/std@0.224.0/path/parse.ts": "77ad91dcb235a66c6f504df83087ce2a5471e67d79c402014f6e847389108d5a", + "https://deno.land/std@0.224.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d", + "https://deno.land/std@0.224.0/path/posix/dirname.ts": "76cd348ffe92345711409f88d4d8561d8645353ac215c8e9c80140069bf42f00", + "https://deno.land/std@0.224.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40", + "https://deno.land/std@0.224.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede", + "https://deno.land/std@0.224.0/path/posix/parse.ts": "09dfad0cae530f93627202f28c1befa78ea6e751f92f478ca2cc3b56be2cbb6a", + "https://deno.land/std@0.224.0/path/posix/resolve.ts": "08b699cfeee10cb6857ccab38fa4b2ec703b0ea33e8e69964f29d02a2d5257cf", + "https://deno.land/std@0.224.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf", + "https://deno.land/std@0.224.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d", + "https://deno.land/std@0.224.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b", + "https://deno.land/std@0.224.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808", + "https://deno.land/std@0.224.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9", + "https://deno.land/std@0.224.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01", + "https://deno.land/std@0.224.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a", + "https://deno.land/std@0.224.0/path/windows/parse.ts": "08804327b0484d18ab4d6781742bf374976de662f8642e62a67e93346e759707", + "https://deno.land/std@0.224.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972", + "https://deno.land/std@0.224.0/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e", + "https://deno.land/std@0.224.0/streams/to_text.ts": "6f93593bdfc2cea5cca39755ea5caf0d4092580c0a713dfe04a1e85c60df331f", + "https://deno.land/std@0.224.0/testing/_test_suite.ts": "f10a8a6338b60c403f07a76f3f46bdc9f1e1a820c0a1decddeb2949f7a8a0546", + "https://deno.land/std@0.224.0/testing/_time.ts": "fefd1ff35b50a410db9b0e7227e05163e1b172c88afd0d2071df0125958c3ff3", + "https://deno.land/std@0.224.0/testing/bdd.ts": "3e4de4ff6d8f348b5574661cef9501b442046a59079e201b849d0e74120d476b", + "https://deno.land/std@0.224.0/testing/mock.ts": "a963181c2860b6ba3eb60e08b62c164d33cf5da7cd445893499b2efda20074db", + "https://deno.land/std@0.224.0/testing/snapshot.ts": "35ca1c8e8bfb98d7b7e794f1b7be8d992483fcff572540e41396f22a5bddb944", + "https://deno.land/std@0.224.0/testing/time.ts": "7119072a198e9913da0d21106b1f05a90a4c05b07075529770ff0e2a9eb5eaba", + "https://deno.land/std@0.224.0/uuid/v4.ts": "1319a2eeff7259adda416ec5f7997ded80d3165ef0787012793fc8621c18c493", + "https://deno.land/std@0.77.0/fmt/colors.ts": "c5665c66f1a67228f21c5989bbb04b36d369b98dd7ceac06f5e26856c81c2531", + "https://deno.land/std@0.81.0/_util/assert.ts": "e1f76e77c5ccb5a8e0dbbbe6cce3a56d2556c8cb5a9a8802fc9565af72462149", + "https://deno.land/std@0.81.0/bytes/mod.ts": "e4f91c6473fe13e3cf1a23649137f87f49135c10bc08fc0f83382a0fb0b03744", + "https://deno.land/std@0.81.0/encoding/utf8.ts": "1b7e77db9a12363c67872f8a208886ca1329f160c1ca9133b13d2ed399688b99", + "https://deno.land/std@0.81.0/io/bufio.ts": "3cbbe1f761c1c636d1e7128ed4e7fdca6bf21d9199aa3cae71e69972a6ae8f93", + "https://deno.land/std@0.81.0/textproto/mod.ts": "4c378eda3cb6216608bb4c3a34201761c65f6980c4669455ca224c330cd5b790", + "https://deno.land/x/bytes_formater@v1.4.0/deps.ts": "4f98f74e21145423b873a5ca6ead66dc3e674fa81e230a0a395f9b86aafeceea", + "https://deno.land/x/bytes_formater@v1.4.0/format.ts": "657c41b9f180c3ed0f934dcf75f77b09b6a610be98bb07525bffe2acfd5af4d5", + "https://deno.land/x/bytes_formater@v1.4.0/mod.ts": "c6bf35303f53d74e9134eb13f666fb388fb4c62c6b12b17542bbadade250a864", + "https://deno.land/x/cliffy@v0.25.7/_utils/distance.ts": "02af166952c7c358ac83beae397aa2fbca4ad630aecfcd38d92edb1ea429f004", + "https://deno.land/x/cliffy@v0.25.7/ansi/ansi.ts": "7f43d07d31dd7c24b721bb434c39cbb5132029fa4be3dd8938873065f65e5810", + "https://deno.land/x/cliffy@v0.25.7/ansi/ansi_escapes.ts": "885f61f343223f27b8ec69cc138a54bea30542924eacd0f290cd84edcf691387", + "https://deno.land/x/cliffy@v0.25.7/ansi/chain.ts": "31fb9fcbf72fed9f3eb9b9487270d2042ccd46a612d07dd5271b1a80ae2140a0", + "https://deno.land/x/cliffy@v0.25.7/ansi/colors.ts": "5f71993af5bd1aa0a795b15f41692d556d7c89584a601fed75997df844b832c9", + "https://deno.land/x/cliffy@v0.25.7/ansi/cursor_position.ts": "d537491e31d9c254b208277448eff92ff7f55978c4928dea363df92c0df0813f", + "https://deno.land/x/cliffy@v0.25.7/ansi/deps.ts": "0f35cb7e91868ce81561f6a77426ea8bc55dc15e13f84c7352f211023af79053", + "https://deno.land/x/cliffy@v0.25.7/ansi/mod.ts": "bb4e6588e6704949766205709463c8c33b30fec66c0b1846bc84a3db04a4e075", + "https://deno.land/x/cliffy@v0.25.7/ansi/tty.ts": "8fb064c17ead6cdf00c2d3bc87a9fd17b1167f2daa575c42b516f38bdb604673", + "https://deno.land/x/cliffy@v0.25.7/command/_errors.ts": "a9bd23dc816b32ec96c9b8f3057218241778d8c40333b43341138191450965e5", + "https://deno.land/x/cliffy@v0.25.7/command/_utils.ts": "9ab3d69fabab6c335b881b8a5229cbd5db0c68f630a1c307aff988b6396d9baf", + "https://deno.land/x/cliffy@v0.25.7/command/command.ts": "a2b83c612acd65c69116f70dec872f6da383699b83874b70fcf38cddf790443f", + "https://deno.land/x/cliffy@v0.25.7/command/completions/_bash_completions_generator.ts": "43b4abb543d4dc60233620d51e69d82d3b7c44e274e723681e0dce2a124f69f9", + "https://deno.land/x/cliffy@v0.25.7/command/completions/_fish_completions_generator.ts": "d0289985f5cf0bd288c05273bfa286b24c27feb40822eb7fd9d7fee64e6580e8", + "https://deno.land/x/cliffy@v0.25.7/command/completions/_zsh_completions_generator.ts": "14461eb274954fea4953ee75938821f721da7da607dc49bcc7db1e3f33a207bd", + "https://deno.land/x/cliffy@v0.25.7/command/completions/bash.ts": "053aa2006ec327ccecacb00ba28e5eb836300e5c1bec1b3cfaee9ddcf8189756", + "https://deno.land/x/cliffy@v0.25.7/command/completions/complete.ts": "58df61caa5e6220ff2768636a69337923ad9d4b8c1932aeb27165081c4d07d8b", + "https://deno.land/x/cliffy@v0.25.7/command/completions/fish.ts": "9938beaa6458c6cf9e2eeda46a09e8cd362d4f8c6c9efe87d3cd8ca7477402a5", + "https://deno.land/x/cliffy@v0.25.7/command/completions/mod.ts": "aeef7ec8e319bb157c39a4bab8030c9fe8fa327b4c1e94c9c1025077b45b40c0", + "https://deno.land/x/cliffy@v0.25.7/command/completions/zsh.ts": "8b04ab244a0b582f7927d405e17b38602428eeb347a9968a657e7ea9f40e721a", + "https://deno.land/x/cliffy@v0.25.7/command/deprecated.ts": "bbe6670f1d645b773d04b725b8b8e7814c862c9f1afba460c4d599ffe9d4983c", + "https://deno.land/x/cliffy@v0.25.7/command/deps.ts": "275b964ce173770bae65f6b8ebe9d2fd557dc10292cdd1ed3db1735f0d77fa1d", + "https://deno.land/x/cliffy@v0.25.7/command/help/_help_generator.ts": "f7c349cb2ddb737e70dc1f89bcb1943ca9017a53506be0d4138e0aadb9970a49", + "https://deno.land/x/cliffy@v0.25.7/command/help/mod.ts": "09d74d3eb42d21285407cda688074c29595d9c927b69aedf9d05ff3f215820d3", + "https://deno.land/x/cliffy@v0.25.7/command/mod.ts": "d0a32df6b14028e43bb2d41fa87d24bc00f9662a44e5a177b3db02f93e473209", + "https://deno.land/x/cliffy@v0.25.7/command/type.ts": "24e88e3085e1574662b856ccce70d589959648817135d4469fab67b9cce1b364", + "https://deno.land/x/cliffy@v0.25.7/command/types.ts": "ae02eec0ed7a769f7dba2dd5d3a931a61724b3021271b1b565cf189d9adfd4a0", + "https://deno.land/x/cliffy@v0.25.7/command/types/action_list.ts": "33c98d449617c7a563a535c9ceb3741bde9f6363353fd492f90a74570c611c27", + "https://deno.land/x/cliffy@v0.25.7/command/types/boolean.ts": "3879ec16092b4b5b1a0acb8675f8c9250c0b8a972e1e4c7adfba8335bd2263ed", + "https://deno.land/x/cliffy@v0.25.7/command/types/child_command.ts": "f1fca390c7fbfa7a713ca15ef55c2c7656bcbb394d50e8ef54085bdf6dc22559", + "https://deno.land/x/cliffy@v0.25.7/command/types/command.ts": "325d0382e383b725fd8d0ef34ebaeae082c5b76a1f6f2e843fee5dbb1a4fe3ac", + "https://deno.land/x/cliffy@v0.25.7/command/types/enum.ts": "2178345972adf7129a47e5f02856ca3e6852a91442a1c78307dffb8a6a3c6c9f", + "https://deno.land/x/cliffy@v0.25.7/command/types/file.ts": "8618f16ac9015c8589cbd946b3de1988cc4899b90ea251f3325c93c46745140e", + "https://deno.land/x/cliffy@v0.25.7/command/types/integer.ts": "29864725fd48738579d18123d7ee78fed37515e6dc62146c7544c98a82f1778d", + "https://deno.land/x/cliffy@v0.25.7/command/types/number.ts": "aeba96e6f470309317a16b308c82e0e4138a830ec79c9877e4622c682012bc1f", + "https://deno.land/x/cliffy@v0.25.7/command/types/string.ts": "e4dadb08a11795474871c7967beab954593813bb53d9f69ea5f9b734e43dc0e0", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/mod.ts": "17e2df3b620905583256684415e6c4a31e8de5c59066eb6d6c9c133919292dc4", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider.ts": "d6fb846043232cbd23c57d257100c7fc92274984d75a5fead0f3e4266dc76ab8", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider/deno_land.ts": "24f8d82e38c51e09be989f30f8ad21f9dd41ac1bb1973b443a13883e8ba06d6d", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider/github.ts": "99e1b133dd446c6aa79f69e69c46eb8bc1c968dd331c2a7d4064514a317c7b59", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/provider/nest_land.ts": "0e07936cea04fa41ac9297f32d87f39152ea873970c54cb5b4934b12fee1885e", + "https://deno.land/x/cliffy@v0.25.7/command/upgrade/upgrade_command.ts": "3640a287d914190241ea1e636774b1b4b0e1828fa75119971dd5304784061e05", + "https://deno.land/x/cliffy@v0.25.7/flags/_errors.ts": "f1fbb6bfa009e7950508c9d491cfb4a5551027d9f453389606adb3f2327d048f", + "https://deno.land/x/cliffy@v0.25.7/flags/_utils.ts": "340d3ecab43cde9489187e1f176504d2c58485df6652d1cdd907c0e9c3ce4cc2", + "https://deno.land/x/cliffy@v0.25.7/flags/_validate_flags.ts": "16eb5837986c6f6f7620817820161a78d66ce92d690e3697068726bbef067452", + "https://deno.land/x/cliffy@v0.25.7/flags/deprecated.ts": "a72a35de3cc7314e5ebea605ca23d08385b218ef171c32a3f135fb4318b08126", + "https://deno.land/x/cliffy@v0.25.7/flags/flags.ts": "68a9dfcacc4983a84c07ba19b66e5e9fccd04389fad215210c60fb414cc62576", + "https://deno.land/x/cliffy@v0.25.7/flags/mod.ts": "b21c2c135cd2437cc16245c5f168a626091631d6d4907ad10db61c96c93bdb25", + "https://deno.land/x/cliffy@v0.25.7/flags/types.ts": "7452ea5296758fb7af89930349ce40d8eb9a43b24b3f5759283e1cb5113075fd", + "https://deno.land/x/cliffy@v0.25.7/flags/types/boolean.ts": "4c026dd66ec9c5436860dc6d0241427bdb8d8e07337ad71b33c08193428a2236", + "https://deno.land/x/cliffy@v0.25.7/flags/types/integer.ts": "b60d4d590f309ddddf066782d43e4dc3799f0e7d08e5ede7dc62a5ee94b9a6d9", + "https://deno.land/x/cliffy@v0.25.7/flags/types/number.ts": "610936e2d29de7c8c304b65489a75ebae17b005c6122c24e791fbed12444d51e", + "https://deno.land/x/cliffy@v0.25.7/flags/types/string.ts": "e89b6a5ce322f65a894edecdc48b44956ec246a1d881f03e97bbda90dd8638c5", + "https://deno.land/x/cliffy@v0.25.7/keycode/key_code.ts": "c4ab0ffd102c2534962b765ded6d8d254631821bf568143d9352c1cdcf7a24be", + "https://deno.land/x/cliffy@v0.25.7/keycode/key_codes.ts": "917f0a2da0dbace08cf29bcfdaaa2257da9fe7e705fff8867d86ed69dfb08cfe", + "https://deno.land/x/cliffy@v0.25.7/keycode/mod.ts": "292d2f295316c6e0da6955042a7b31ab2968ff09f2300541d00f05ed6c2aa2d4", + "https://deno.land/x/cliffy@v0.25.7/mod.ts": "e3515ccf6bd4e4ac89322034e07e2332ed71901e4467ee5bc9d72851893e167b", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_input.ts": "737cff2de02c8ce35250f5dd79c67b5fc176423191a2abd1f471a90dd725659e", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_list.ts": "79b301bf09eb19f0d070d897f613f78d4e9f93100d7e9a26349ef0bfaa7408d2", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_prompt.ts": "8630ce89a66d83e695922df41721cada52900b515385d86def597dea35971bb2", + "https://deno.land/x/cliffy@v0.25.7/prompt/_generic_suggestions.ts": "2a8b619f91e8f9a270811eff557f10f1343a444a527b5fc22c94de832939920c", + "https://deno.land/x/cliffy@v0.25.7/prompt/_utils.ts": "676cca30762656ed1a9bcb21a7254244278a23ffc591750e98a501644b6d2df3", + "https://deno.land/x/cliffy@v0.25.7/prompt/checkbox.ts": "e5a5a9adbb86835dffa2afbd23c6f7a8fe25a9d166485388ef25aba5dc3fbf9e", + "https://deno.land/x/cliffy@v0.25.7/prompt/confirm.ts": "94c8e55de3bbcd53732804420935c432eab29945497d1c47c357d236a89cb5f6", + "https://deno.land/x/cliffy@v0.25.7/prompt/deps.ts": "4c38ab18e55a792c9a136c1c29b2b6e21ea4820c45de7ef4cf517ce94012c57d", + "https://deno.land/x/cliffy@v0.25.7/prompt/figures.ts": "26af0fbfe21497220e4b887bb550fab997498cde14703b98e78faf370fbb4b94", + "https://deno.land/x/cliffy@v0.25.7/prompt/input.ts": "ee45532e0a30c2463e436e08ae291d79d1c2c40872e17364c96d2b97c279bf4d", + "https://deno.land/x/cliffy@v0.25.7/prompt/list.ts": "6780427ff2a932a48c9b882d173c64802081d6cdce9ff618d66ba6504b6abc50", + "https://deno.land/x/cliffy@v0.25.7/prompt/mod.ts": "195aed14d10d279914eaa28c696dec404d576ca424c097a5bc2b4a7a13b66c89", + "https://deno.land/x/cliffy@v0.25.7/prompt/number.ts": "015305a76b50138234dde4fd50eb886c6c7c0baa1b314caf811484644acdc2cf", + "https://deno.land/x/cliffy@v0.25.7/prompt/prompt.ts": "0e7f6a1d43475ee33fb25f7d50749b2f07fc0bcddd9579f3f9af12d05b4a4412", + "https://deno.land/x/cliffy@v0.25.7/prompt/secret.ts": "58745f5231fb2c44294c4acf2511f8c5bfddfa1e12f259580ff90dedea2703d6", + "https://deno.land/x/cliffy@v0.25.7/prompt/select.ts": "1e982eae85718e4e15a3ee10a5ae2233e532d7977d55888f3a309e8e3982b784", + "https://deno.land/x/cliffy@v0.25.7/prompt/toggle.ts": "842c3754a40732f2e80bcd4670098713e402e64bd930e6cab2b787f7ad4d931a", + "https://deno.land/x/cliffy@v0.25.7/table/border.ts": "2514abae4e4f51eda60a5f8c927ba24efd464a590027e900926b38f68e01253c", + "https://deno.land/x/cliffy@v0.25.7/table/cell.ts": "1d787d8006ac8302020d18ec39f8d7f1113612c20801b973e3839de9c3f8b7b3", + "https://deno.land/x/cliffy@v0.25.7/table/deps.ts": "5b05fa56c1a5e2af34f2103fd199e5f87f0507549963019563eae519271819d2", + "https://deno.land/x/cliffy@v0.25.7/table/layout.ts": "46bf10ae5430cf4fbb92f23d588230e9c6336edbdb154e5c9581290562b169f4", + "https://deno.land/x/cliffy@v0.25.7/table/mod.ts": "e74f69f38810ee6139a71132783765feb94436a6619c07474ada45b465189834", + "https://deno.land/x/cliffy@v0.25.7/table/row.ts": "5f519ba7488d2ef76cbbf50527f10f7957bfd668ce5b9169abbc44ec88302645", + "https://deno.land/x/cliffy@v0.25.7/table/table.ts": "ec204c9d08bb3ff1939c5ac7412a4c9ed7d00925d4fc92aff9bfe07bd269258d", + "https://deno.land/x/cliffy@v0.25.7/table/utils.ts": "187bb7dcbcfb16199a5d906113f584740901dfca1007400cba0df7dcd341bc29", + "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5", + "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff", + "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4", + "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d", + "https://deno.land/x/dotenv@v3.2.2/load.ts": "cbd76a0aee01aad8d09222afaa1dd04b84d9d3e44637503b01bf77a91df9e041", + "https://deno.land/x/dotenv@v3.2.2/mod.ts": "077b48773de9205266a0b44c3c3a3c3083449ed64bb0b6cc461b95720678d38e", + "https://deno.land/x/dotenv@v3.2.2/util.ts": "693730877b13f8ead2b79b2aa31e2a0652862f7dc0c5f6d2f313f4d39c7b7670", + "https://deno.land/x/esbuild@v0.20.2/mod.js": "67c608ee283233f5d0faa322b887356857c547a8e6a00981f798b2cd38e02436", + "https://deno.land/x/esbuild@v0.20.2/wasm.js": "5a887c1e38ad1056af11c58d45b6084d33bd33a62afa480d805801739370eed0", + "https://deno.land/x/fresh@1.6.8/dev.ts": "720dd3a64b62b852db7b6ae471c246c5c605cf4a3091c4cbc802790f36d43e4c", + "https://deno.land/x/fresh@1.6.8/server.ts": "d5817615a3ac822d422627f2cd6f850a31e11f7e73b328a79807f722e6519bac", + "https://deno.land/x/fresh@1.6.8/src/build/aot_snapshot.ts": "4ac6330e5325dd9411fa2a46e97bb289f910fde4be82dc349d3e2b4bb1a7c07d", + "https://deno.land/x/fresh@1.6.8/src/build/deps.ts": "5a0d934a2e66d61e675d3c48e7db83b3d9d01cd4e13eca05ca8145acf26ea991", + "https://deno.land/x/fresh@1.6.8/src/build/esbuild.ts": "fdad9cc58f0ead0f954faad4a3c6b07da312acbe3306da742ba083ddb666d4b3", + "https://deno.land/x/fresh@1.6.8/src/build/mod.ts": "b9d1695a86746ac3a1c52f0e07e723faa2310d1dfd109b9a2eebab6727c4702b", + "https://deno.land/x/fresh@1.6.8/src/constants.ts": "4795d194b6c6b95f0e876c0a997fbaf57f94cfe253442c5819f95410870b79b3", + "https://deno.land/x/fresh@1.6.8/src/dev/build.ts": "9aaf84a781ee4d11d73ec549425f273fe8339812fdd8f726e1ec1ba61bdf0e9d", + "https://deno.land/x/fresh@1.6.8/src/dev/deps.ts": "93af624becfb2d8497e3d7ef0cf5ef48df61495dc5951b5f922c6a129a9fb75c", + "https://deno.land/x/fresh@1.6.8/src/dev/dev_command.ts": "3e3dcc80180faf8868d44d892ddfa8c5ad06033e4d94c0934302e157db1de63d", + "https://deno.land/x/fresh@1.6.8/src/dev/error.ts": "21a38d240c00279662e6adde41367f1da0ae7e2836d993f818ea94aabab53e7b", + "https://deno.land/x/fresh@1.6.8/src/dev/manifest.ts": "156fb0ce3f77b9fdac18f8798eee36283c2fb440795c6024b6b6ab938e91f9cb", + "https://deno.land/x/fresh@1.6.8/src/dev/mod.ts": "d44f3063d157bce53ba534d37b7ff8f262c379ab75229bc63d06c47c67b6b7e6", + "https://deno.land/x/fresh@1.6.8/src/dev/update_check.ts": "0b8e4659b49e3a951c684b7faf66be7428948c3e7d492d37397f9a485874515a", + "https://deno.land/x/fresh@1.6.8/src/runtime/Partial.tsx": "92e16fa7edf37dc8e254024a5410ea2c8986804a6ddf911af4d30209dff80a22", + "https://deno.land/x/fresh@1.6.8/src/runtime/active_url.ts": "c718797b11189c7e2c86569355d55056148907121e958e00f71c56593aecc329", + "https://deno.land/x/fresh@1.6.8/src/runtime/build_id.ts": "8376e70e42ce456dfa6932c638409d2ef1bca4833b4ceba0bf74510080a7f976", + "https://deno.land/x/fresh@1.6.8/src/runtime/csp.ts": "9ee900e9b0b786057b1009da5976298c202d1b86d1f1e4d2510bde5f06530ac9", + "https://deno.land/x/fresh@1.6.8/src/runtime/deserializer.ts": "1b83e75fa61c48b074ea121f33647d1ed15c68fa2f2a11b0a7f7a12cd38af627", + "https://deno.land/x/fresh@1.6.8/src/runtime/entrypoints/client.ts": "a9224606e41bc58d81f37b7125650432920a7d136bdf416051e925ac9bbd1f05", + "https://deno.land/x/fresh@1.6.8/src/runtime/entrypoints/deserializer.ts": "e836f44c454e1f67c86eab30f108eb9be05a38489604a24e418b564b77058b96", + "https://deno.land/x/fresh@1.6.8/src/runtime/entrypoints/main.ts": "de3aa5cbd9b3abfa825939b58bc8df088ab183e042c0447b37180f4ea31c613c", + "https://deno.land/x/fresh@1.6.8/src/runtime/entrypoints/main_dev.ts": "d2960e339119e45017954c7cf6798b9e0a3110d173cc378e1e3e7bc84bd68c34", + "https://deno.land/x/fresh@1.6.8/src/runtime/entrypoints/signals.ts": "782c81f97d125ad4f92aa0160dad3a2e8b6ea7a61cec7fdab87bbbbd8c0d215c", + "https://deno.land/x/fresh@1.6.8/src/runtime/head.ts": "0f9932874497ab6e57ed1ba01d549e843523df4a5d36ef97460e7a43e3132fdc", + "https://deno.land/x/fresh@1.6.8/src/runtime/polyfills.ts": "c3de932b2f23df9a4ade1ab4f8890730c0db0a71bf85faa41742a1763631e917", + "https://deno.land/x/fresh@1.6.8/src/runtime/utils.ts": "4f40630c308e8ea7d53860687905caf1a2f2a46ad8692f24e905a8e996b584c3", + "https://deno.land/x/fresh@1.6.8/src/server/boot.ts": "969da650e882adba6559af3784b90473d357201345d4e5b24a0cf5e582882d6b", + "https://deno.land/x/fresh@1.6.8/src/server/build_id.ts": "82d9cb985de6b1e38c3108e5a00667b16e80eedc145d73835d6b44349ebe6389", + "https://deno.land/x/fresh@1.6.8/src/server/code_frame.ts": "fac505f138fbd1bb260030122b87aeb2f5b5e54018e3066e105c669c686cc373", + "https://deno.land/x/fresh@1.6.8/src/server/compose.ts": "490aa1a7d540cc02bd4a184bea03eb2370aa34d93fe5a6ae1f31e2086eef4e76", + "https://deno.land/x/fresh@1.6.8/src/server/config.ts": "a5d0545d18c68d01770a4eb321d2fc85081ad7992ae63b1497f0b92ee122410a", + "https://deno.land/x/fresh@1.6.8/src/server/constants.ts": "e75a7f7b14185b6f85747613591348313200fe8e218cb473b1da9db941ee68d1", + "https://deno.land/x/fresh@1.6.8/src/server/context.ts": "fbfcb0e0c6377ea0a6b11063705c07daedb75bcf2845b31c3794345c40aeb1b4", + "https://deno.land/x/fresh@1.6.8/src/server/default_error_page.tsx": "094ad8d52d31f99172a606d0a0d8236604a1f9bb6d1f928d0d466d55b36dae70", + "https://deno.land/x/fresh@1.6.8/src/server/defines.ts": "f518ff10e499d4543bb9231f55026f26be2507eaccb072aafab93c8cc0bc3adc", + "https://deno.land/x/fresh@1.6.8/src/server/deps.ts": "efa2ddf6a21457839e42b6a69eca0c12a22a0bf3a6dd140b58abfe54e66328e8", + "https://deno.land/x/fresh@1.6.8/src/server/error_overlay.tsx": "e6ab4cef0ea812a1e1f32ee9116c61f64db8466d46e228acbb953215f4517d9c", + "https://deno.land/x/fresh@1.6.8/src/server/fs_extract.ts": "4dda675f03f0397310e4e6d4a57f3bf907db8a61a1a65423e67855daf5b9b36e", + "https://deno.land/x/fresh@1.6.8/src/server/htmlescape.ts": "834ac7d0caa9fc38dffd9b8613fb47aeecd4f22d5d70c51d4b20a310c085835c", + "https://deno.land/x/fresh@1.6.8/src/server/init_safe_deps.ts": "8c74d8708986d156126355b0935a1915069bfdc389ccabd3d2d72d1c9e04025c", + "https://deno.land/x/fresh@1.6.8/src/server/mod.ts": "6cee56e234f6bc19f62f3b6c0d287dc7b9632fcbfb8f56dde1d81423532d65c4", + "https://deno.land/x/fresh@1.6.8/src/server/render.ts": "b89387eb20c91969ace2de27b6c462f4e42c040d37b68440fe374e5cea9ea794", + "https://deno.land/x/fresh@1.6.8/src/server/rendering/fresh_tags.tsx": "5f1238e465d9ad94aebdf5e3701f2b9da3c944d8c5cc4dc8005ff1418b164989", + "https://deno.land/x/fresh@1.6.8/src/server/rendering/preact_hooks.ts": "db1a1ad7e4fbdac19b0758789ba7700531c214d531e1d03264b81a73beab05b5", + "https://deno.land/x/fresh@1.6.8/src/server/rendering/state.ts": "5e0c3a60964596cc28c1804545eae323cbc92eec9ce8cb0932d5168a6d1f33e9", + "https://deno.land/x/fresh@1.6.8/src/server/rendering/template.tsx": "bd1bc8edb054caac22043117f254927e8413e04cd1897009a2214ab374a1be19", + "https://deno.land/x/fresh@1.6.8/src/server/router.ts": "257a293776ee682937b8abb6d803971a6863a2f161b1e079b57c013589d0ed0b", + "https://deno.land/x/fresh@1.6.8/src/server/serializer.ts": "f0cffb863bbdbac6ed53fefe181e415d6aefc2101f2dc92a562b364088809e44", + "https://deno.land/x/fresh@1.6.8/src/server/tailwind_aot_error_page.tsx": "7265b66dc76a2e54b40774bbeb3cc7d4deb2eac537e08712e90e9c7b9399e53a", + "https://deno.land/x/fresh@1.6.8/src/server/types.ts": "f5911c9eef864df8ef58fe5bd353ebd22267b35ef2ef8b21def825fd274d05a6", + "https://deno.land/x/fresh@1.6.8/src/types.ts": "05169e3389979d8283de0ec1db3a765324ffd730b6af29ffe02752f341ae7d35", + "https://deno.land/x/fresh@1.6.8/versions.json": "c6cc2d0d2bff47425e59f953b8a237a6523dcf8e10f02e7ad92d50f2c5f2552c", + "https://deno.land/x/mysql@v2.12.1/deps.ts": "68635959a41bb08bc87db007679fb8449febc55d48202dff20b93cc23ef5820d", + "https://deno.land/x/mysql@v2.12.1/src/auth.ts": "129ea08b180d3e90e567c3f71e60432bb266304c224e17ea39d604bbcc1160d8", + "https://deno.land/x/mysql@v2.12.1/src/buffer.ts": "59f7e08e196f1b7e58cf5c3cf8ae8f4d0d47d1ae31430076fc468d974d3b59e7", + "https://deno.land/x/mysql@v2.12.1/src/util.ts": "83d38e87cc3901da00ac44bfcd53c0e8d24525262f5c7647c912dccf3ed2dbb5", + "https://deno.land/x/postgres@v0.19.3/client.ts": "d141c65c20484c545a1119c9af7a52dcc24f75c1a5633de2b9617b0f4b2ed5c1", + "https://deno.land/x/postgres@v0.19.3/client/error.ts": "05b0e35d65caf0ba21f7f6fab28c0811da83cd8b4897995a2f411c2c83391036", + "https://deno.land/x/postgres@v0.19.3/connection/auth.ts": "db15c1659742ef4d2791b32834950278dc7a40cb931f8e434e6569298e58df51", + "https://deno.land/x/postgres@v0.19.3/connection/connection.ts": "198a0ecf92a0d2aa72db3bb88b8f412d3b1f6b87d464d5f7bff9aa3b6aff8370", + "https://deno.land/x/postgres@v0.19.3/connection/connection_params.ts": "463d7a9ed559f537a55d6928cab62e1c31b808d08cd0411b6ae461d0c0183c93", + "https://deno.land/x/postgres@v0.19.3/connection/mapper.ts": "db15c1659742ef4d2791b32834950278dc7a40cb931f8e434e6569298e58df51", + "https://deno.land/x/postgres@v0.19.3/connection/message.ts": "20da5d80fc4d7ddb7b850083e0b3fa8734eb26642221dad89c62e27d78e57a4d", + "https://deno.land/x/postgres@v0.19.3/connection/message_code.ts": "12bcb110df6945152f9f6c63128786558d7ad1e61006920daaa16ef85b3bab7d", + "https://deno.land/x/postgres@v0.19.3/connection/packet.ts": "050aeff1fc13c9349e89451a155ffcd0b1343dc313a51f84439e3e45f64b56c8", + "https://deno.land/x/postgres@v0.19.3/connection/scram.ts": "532d4d58b565a2ab48fb5e1e14dc9bfb3bb283d535011e371e698eb4a89dd994", + "https://deno.land/x/postgres@v0.19.3/debug.ts": "8add17699191f11e6830b8c95d9de25857d221bb2cf6c4ae22254d395895c1f9", + "https://deno.land/x/postgres@v0.19.3/deps.ts": "c312038fe64b8368f8a294119f11d8f235fe67de84d7c3b0ef67b3a56628171a", + "https://deno.land/x/postgres@v0.19.3/mod.ts": "4930c7b44f8d16ea71026f7e3ef22a2322d84655edceacd55f7461a9218d8560", + "https://deno.land/x/postgres@v0.19.3/pool.ts": "2289f029e7a3bd3d460d4faa71399a920b7406c92a97c0715d6e31dbf1380ec3", + "https://deno.land/x/postgres@v0.19.3/query/array_parser.ts": "ff72d3e026e3022a1a223a6530be5663f8ebbd911ed978291314e7fe6c2f2464", + "https://deno.land/x/postgres@v0.19.3/query/decode.ts": "3e89ad2a662eab66a4f4e195ff0924d71d199af3c2f5637d1ae650301a03fa9b", + "https://deno.land/x/postgres@v0.19.3/query/decoders.ts": "6a73da1024086ab91e233648c850dccbde59248b90d87054bbbd7f0bf4a50681", + "https://deno.land/x/postgres@v0.19.3/query/encode.ts": "5b1c305bc7352a6f9fe37f235dddfc23e26419c77a133b4eaea42cf136481aa6", + "https://deno.land/x/postgres@v0.19.3/query/oid.ts": "21fc714ac212350ba7df496f88ea9e01a4ee0458911d0f2b6a81498e12e7af4c", + "https://deno.land/x/postgres@v0.19.3/query/query.ts": "510f9a27da87ed7b31b5cbcd14bf3028b441ac2ddc368483679d0b86a9d9f213", + "https://deno.land/x/postgres@v0.19.3/query/transaction.ts": "8f4eef68f8e9b4be216199404315e6e08fe1fe98afb2e640bffd077662f79678", + "https://deno.land/x/postgres@v0.19.3/query/types.ts": "540f6f973d493d63f2c0059a09f3368071f57931bba68bea408a635a3e0565d6", + "https://deno.land/x/postgres@v0.19.3/utils/deferred.ts": "5420531adb6c3ea29ca8aac57b9b59bd3e4b9a938a4996bbd0947a858f611080", + "https://deno.land/x/postgres@v0.19.3/utils/utils.ts": "ca47193ea03ff5b585e487a06f106d367e509263a960b787197ce0c03113a738", + "https://deno.land/x/smtp@v0.7.0/code.ts": "f388fae4995b4d35d99fb6b8bfded522f5a3e7e7d63babdf318a059d6db43baf", + "https://deno.land/x/smtp@v0.7.0/config.ts": "683a6fa684e5ef3705e809b203abea7804a90afde7b534d66c182ea3d17902d3", + "https://deno.land/x/smtp@v0.7.0/deps.ts": "5e2a437e3ae35f0e83719fd2e707858dcb750c1111ff5bebc729522a1380b53d", + "https://deno.land/x/smtp@v0.7.0/mod.ts": "9b0d8fbdacc184d1af10f727980e51486e0ddf9d2ec7227c8dfce90db5bfbcf5", + "https://deno.land/x/smtp@v0.7.0/smtp.ts": "47c72a99925ad07f3174037f9325dbb8b703dc1177277b9161dc6209c7fa4f90", + "https://deno.land/x/sodium@0.2.0/basic.ts": "458ec1e8e90b5df3c0d8a7a7e4747dbbbd35e3ee776ac4dc7c44d3ec70784de9", + "https://deno.land/x/sodium@0.2.0/basic_types.ts": "49e32fd3d239e183d71e2509def40a70ce0308f4d9f0552dd355be8094e2fe5f", + "https://deno.land/x/sodium@0.2.0/dist/browsers/sodium.js": "169e09bb1d056fd4700c95edbdb399d8050d685ce44b40f520e35a021167d520", + "https://deno.land/x/sql_builder@v1.9.1/util.ts": "b9855dc435972704cf82655019f4ec168ac83550ab4db596c5f6b6d201466384", + "https://deno.land/x/ts_morph@21.0.1/common/DenoRuntime.ts": "a505f1feae9a77c8f6ab1c18c55d694719e96573f68e9c36463b243e1bef4c3e", + "https://deno.land/x/ts_morph@21.0.1/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed", + "https://deno.land/x/ts_morph@21.0.1/common/ts_morph_common.js": "236475fb18476307e07b3a97dc92fe8fb69e4a9df4ca59aa098dd6430bae7237", + "https://deno.land/x/ts_morph@21.0.1/common/typescript.js": "d72ba73c3eb625ff755075dbde78df2a844d22190ef1ad74d0c5dcd7005ba85e", + "https://deno.land/x/ts_morph@21.0.1/mod.ts": "adba9b82f24865d15d2c78ef6074b9a7457011719056c9928c800f130a617c93", + "https://deno.land/x/ts_morph@21.0.1/ts_morph.js": "fddb96abdf0cb0ac427d52757c4ffa6ff7fe9a772846d9bf6167518b7b276cad", + "https://deno.land/x/valita@v0.3.8/mod.ts": "8950f261c03b03d1474eb7a092ca892fd7b11f84d8e1d9ff6facb7844d685779", + "https://deno.land/x/valita@v0.3.8/src/index.ts": "bf833a5edaebf9d7141913b660053fb4cb616ef51d3ee488a4a2e73dd3edeee1", + "https://esm.sh/*@preact/signals-core@1.5.1": "de8dffabec1aab92430087751f0c451af2853ee5163fe7761fd94d70263b7ea6", + "https://esm.sh/*@preact/signals@1.2.2": "8b174b406f1c00fdf3930fbb4ddc556162e6fd0dfe84a5ec300e9ac1776cbf42", + "https://esm.sh/*preact-render-to-string@6.3.1": "07807f027acf54b994b630bbb2a923f5a835f9544e01144f67ab292e90a431e4", + "https://esm.sh/@babel/helper-validator-identifier@7.22.20": "daace34e028130297fddf97f3ef6deb4b05ec3eb46f5c5cacd6eaa43d6323b0a", + "https://esm.sh/fast-check@3.18.0": "45912542bf44ac372bd92a7c07f2581f502d2a9b32d385844b7a8ff21c04eba3", + "https://esm.sh/google-libphonenumber@3.2.34": "c92f5790bb66f830a0ca09acbde9b9f1beb3bfaf90171efde635d00acb2e2aa8", + "https://esm.sh/libsodium-wrappers-sumo@0.7.13": "db996299a500ab1bb820dc9116d1428180e4f99de89d85c6cdf3acb62aad7a44", + "https://esm.sh/mrz@4.1.0": "e38738624ec18ffd9c17568fc217353a59eddc985ca64879c6f7fba16e0aee2f", + "https://esm.sh/preact@10.19.6": "281b115a9b79918c6b73382b4e818d6f9e48db9064b7fd4f75a45a4edee54145", + "https://esm.sh/preact@10.19.6/debug": "0e16b3e9f45372501b91ecf69b1bcaf2b2dad3ac470ce75113d957acbd5e277d", + "https://esm.sh/preact@10.19.6/hooks": "3037d71a7794c70bacb2da5dd9520334c6a24b3a7a75a2eeec9f025f8dc549f1", + "https://esm.sh/preact@10.19.6/jsx-runtime": "f4c9e5f72ef18435eab846ae02e315a63da724f64fb08d806d2ddeaf08d99bd8", + "https://esm.sh/stable/preact@10.19.6/denonext/debug.js": "a0a13b66504bd149d6f0e1facde5a610f029be9c6b5539008934badfe0d87ed5", + "https://esm.sh/stable/preact@10.19.6/denonext/devtools.js": "662746ca22e50eb0db3356f936c891b465aea20d8f4d809262f612e66b3d705e", + "https://esm.sh/stable/preact@10.19.6/denonext/hooks.js": "60270845e547f2e2c8d94cdb0bf9a0376e5b02bd6bb2b8694720274c2378890e", + "https://esm.sh/stable/preact@10.19.6/denonext/hooks/src.js": "5248a73c4958dab167c5730e6db866a027140005d47f14dca3f1dad66c449b60", + "https://esm.sh/stable/preact@10.19.6/denonext/jsx-runtime.js": "97e9eeb40443de53a8cb3b70f264d04db2bbfc5c2298fdb15d1c471283ccd6aa", + "https://esm.sh/stable/preact@10.19.6/denonext/preact.mjs": "68491395d287895f4d697e403ded5b0ebb8fed0494f9e870c422bc017e5e52f5", + "https://esm.sh/stable/preact@10.19.6/denonext/src.js": "d9bdddf125df0aa46055e8385cbc0bd4d978fb90b1254aadaedd14ff039081ff", + "https://esm.sh/v128/preact@10.19.6/hooks/src/index.js": "23bb052c9c71fcf09888b90667b222017b505ef62e5706ba2bef1d3211aeb793", + "https://esm.sh/v128/preact@10.19.6/src/index.js": "af3df2e29418f2ea80e68c4e10ebd0ca5e7daadbd840fe70529353c71484e72f", + "https://esm.sh/v135/@babel/helper-validator-identifier@7.22.20/denonext/helper-validator-identifier.mjs": "1ad312a9040d1f3b096e90a3e6a9da7ecfc99662140852fe3862a316c2591c93", + "https://esm.sh/v135/@preact/signals-core@1.5.1/denonext/signals-core.mjs": "dc36965311a6fda182378c0b3aec418ffe60fb2bb6020d9948d105862a27ddf8", + "https://esm.sh/v135/@preact/signals@1.2.2/X-ZS8q/denonext/dist/signals.js": "14cde4fdaf6f5d640c3f05baa082a9a09904a0763aead439f676789d50bfb3ca", + "https://esm.sh/v135/@preact/signals@1.2.2/X-ZS8q/denonext/signals.mjs": "f2cb7b0335f75be2827049bf6a1ce3c6bd35e74c7a922a1eeb338b0312d61556", + "https://esm.sh/v135/@preact/signals@1.2.2/X-ZS8q/dist/signals.js": "b1568c0454dd20419e3d0ade0fcbf7d49fb4e66e5c073420a881cb75704c5253", + "https://esm.sh/v135/fast-check@3.18.0/denonext/fast-check.mjs": "c55fcafe2338efd0f8b0e6fb87a4b8e7ffe84571a2b52e1212d4d3bee620d40f", + "https://esm.sh/v135/google-libphonenumber@3.2.34/denonext/google-libphonenumber.mjs": "e99d6ee3609530a310aac5122452fb08835f7e7c69ca68f06e7beda551052067", + "https://esm.sh/v135/libsodium-sumo@0.7.13/denonext/libsodium-sumo.mjs": "7c58270b7a35a8996ca88136708abe20ecddf062576fcf56a42ae9a07373959c", + "https://esm.sh/v135/libsodium-wrappers-sumo@0.7.13/denonext/libsodium-wrappers-sumo.mjs": "db5a833adbe9e8ea2716a5492309aa19e190d576abb623acda4c49cb55c606c8", + "https://esm.sh/v135/mrz@4.1.0/denonext/mrz.mjs": "d6bd949013751150d1fc5f1ca1b9adb2a0ecf979d841dbcc750aeef88e369390", + "https://esm.sh/v135/preact-render-to-string@6.3.1/X-ZS8q/denonext/preact-render-to-string.mjs": "bcaceb8c3938310aee3dd4f7b6f2136cf0b2b890988c2e6679485e052e76e920", + "https://esm.sh/v135/pure-rand@6.1.0/denonext/pure-rand.mjs": "d4df69c8974dd9b4aa40f2ff91f9149a4e3f2dd4c7b432622d15a3623653aba3" + } +} diff --git a/docs/.gitignore b/docs/.gitignore @@ -0,0 +1,3 @@ +# LaTeX +build/* +!build/*.pdf +\ No newline at end of file diff --git a/docs/build/defense.pdf b/docs/build/defense.pdf Binary files differ. diff --git a/docs/build/thesis.pdf b/docs/build/thesis.pdf Binary files differ. diff --git a/docs/contents/1.introduction.tex b/docs/contents/1.introduction.tex @@ -0,0 +1,157 @@ +\chapter{Introduction} + +In order to comply with legal requirements, certain industries must verify the identity +of their users. For instance, the banking industry is subject to anti-money +laundering/terrorist financing laws. Similarly, casinos must ensure that their +customers are of an appropriate age, as do shops selling alcohol. + +All these practices and mechanisms put in place by these industries are collectively known as \textbf{\gls{KYC}}, +an acronym for \textit{Know Your Customer} This work will focus more specifically on the IT version of \gls{KYC}, +known as \textbf{\gls{eKYC}} for \textit{electronic KYC}. + +To successfully complete an eKYC, three key challenges must be addressed: the first is user authentication, +the second is the authentication of identity information, and the third is non-usurpation of identity, +which ensures that the identity in question belongs to the user. + +In order to facilitate the provision of the \gls{eKYC} procedure by third parties and to avoid the repetition +of the same process in each project, this work introduces the creation of an eKYC-as-a-Service platform. + +\section{Problematics} + +In recent years, the development of remote tools has made it necessary to use \gls{eKYC} +on a larger scale than was previously necessary for face-to-face identity verification. + +The emergence of Twint \cite{TWINT}, a financial intermediary subject to Swiss anti-money +laundering laws \cite{LEFin}, is a case in point. Twint offers its users the possibility of +opening an account without tying it to a bank, which means that anyone in Switzerland +can open an account anywhere. + +The same can be said of telephone operators, which are subject to regulation \cite{LTC}, and +which also allow users to open an account themselves without going anywhere, thanks +to eKYC. + +The market is developing, but there is no open-source service using a standard +protocol, such as \gls{OAuth2} (see section \ref{OAuth2-API}), to simplify its use with the ecosystem of +tools needed for interoperability. + +\section{Roles} + +The project encompasses a number of user/machine roles, which are defined below. + +\begin{table}[H] + \centering + \setupBfhTabular + \begin{tabular}{llp{.7\textwidth}} + \rowcolor{BFH-tablehead} + \textbf{Role}&\textbf{Type}&\textbf{Description}\\\hline + \gls{KYCID} & Machine & Authorization and Resource Server developed in this work performing \gls{eKYC} procedure\\\hline + Client & Machine & Third party application delegating its Customer's \gls{eKYC} procedure to \gls{KYCID}\\\hline + Customers & Human & Any user who needs to be authenticated during an \gls{eKYC} procedure\\\hline + Operator & Human & Person responsible for installing/maintaining the \gls{KYCID} application (see section)\\\hline + Admin & Human & Person responsible for validating customer profiles + \end{tabular} + \caption{Project Roles} +\end{table} + +\section{OAuth2} \label{OAuth2-API} + +OAuth2 is a network communication protocol based on HTTP (Web) that allows resources +(scopes) to be authorised for access to a third-party client application. + +OAuth2 is also a framework (see section \ref{OAuth2-Framework}) which defines a security model. + +OAuth2 is the second iteration of OAuth, which has therefore been able to mature technically +and become more robust thanks to this test of time because, since its creation, +it has been particularly attacked. + +\section{SMS Challenge for eKYC} \label{EKYC-SMSChallenge} + +To perform an identity verification (\gls{eKYC}), this work has proposed 2 methods: + +Firstly, the indirect method, which consists in delegating the verification to a telecom operator and in verifying only 2 things: +that the user is in control of the number and that the number is Swiss. +Thanks to this, we can indirectly verify the identity of the user. + +\begin{figure}[H] + \centering + \includegraphics[width=0.6\textwidth]{phone-ekyc} + \caption{\gls{eKYC} by SMS challenge} + \label{fig:PhoneNumber-EKYC} +\end{figure} + +The process is in 3 steps: The customer enters his telephone number; Then, +a secret code will be sent by SMS to this number; Finally, the customer can enter +the code received to complete the challenge. + +\begin{figure}[H] + \centering + \includegraphics[width=0.75\textwidth]{phone-ekyc-process} + \caption{Process of SMS Challenge for eKYC} + \label{fig:PhoneNumber-EKYC-Process} +\end{figure} + +\section{Document and Face challenge for eKYC} \label{EKYC-DocumentAndFaceChallenge} + +The second method is more direct. It consists of verifying the identity card or passport directly. +To do this, we will use the user's webcam/camera to scan the ID card or passport. + +On the back of the card or passport, there is a zone called \gls{MRZ} for machine-readable zone. +This is a standard used in particular in aviation to scan via \gls{OCR} (optical character recognition) and +thus extract all the information electronically. + +\begin{figure}[H] + \centering + \includegraphics[width=0.75\textwidth]{mrz} + \caption{Specimen Machine Readable Zone (MRZ)} + \label{fig:MRZ} +\end{figure} + +However, there is a potential issue: the images of cards or the cards themselves could be stolen. +Therefore, it is necessary to implement measures to mitigate this risk of theft. +To address this, we utilise a face challenge, which requires users to submit selfies in three +different positions (head to the left, to the front, and to the right). + +\begin{figure}[H] + \centering + \includegraphics[width=0.75\textwidth]{face-challenge} + \caption{Face challenge exemple} + \label{fig:MRZ} +\end{figure} + +Consequently, an administrator can verify the photos to ascertain the legitimacy of the document and +ascertain that all photos (document and face challenge) were taken with the same camera at the same time, +among other criteria. If all criteria are met, the profile will be approved. + +This method provides direct information on the identity of the customer, in contrast +to the indirect method. However, it is a deferred method that necessitates human intervention. + +\section{Product vision} + +This work concerns the creation of a product designed to address the problem. +The product is a web service, named \gls{KYCID}, which stands for Know Your Customer's ID. +It allows third-party applications (clients) to carry out their eKYC procedures by delegating +the work to the service. + +From the customer's perspective, using the service will be like a simple \gls{OAuth2} authorisation code flow +connection. Once the \gls{access token} has been granted, it will be possible to +request an \gls{endpoint} with identity-related information. + +From the customer's perspective, the process will be straightforward: they will simply click on button in client app +to be redirected to web page on the platform's website, where they will carry out the eKYC procedure. +Once completed, they will be redirected back to the customer and will have all the necessary information. + +The eKYC procedure will be a linear process with optional steps listed below: + +\begin{enumerate} +\item Obtain the user's consent for the client to access the requested \gls{scopes}. +\item Enter the email address. +\item Register if an account does not exist. +\item Verify the email address (a code will be sent by email) if the account is not verified. +\item Perform eKYC SMS Challenge procedure (see section \ref{EKYC-SMSChallenge}) if it has been requested in the \gls{scopes} by the client. +\item Should the client request it, the eKYC document and face challenge procedure (see section \ref{EKYC-DocumentAndFaceChallenge}) must be performed. +\end{enumerate} + +The registration of customers will be carried out by an operator with a technical profile (typically Mr Emanuel BENOIST) and does not necessarily require a graphical interface to perform this task. + +In order to export a CSV file for the purpose of invoicing the service, the service provider must keep track of authorisation +requests made by each client. +\ No newline at end of file diff --git a/docs/contents/2.architecture.tex b/docs/contents/2.architecture.tex @@ -0,0 +1,64 @@ +\chapter{Architecture} + +\section{Top-level overview} + +\begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{toplevel} + \caption{Top-level project overview} + \label{fig:arch-toplevel} +\end{figure} + +The diagram above illustrates the three primary actors in the project: +\begin{enumerate} + \item \textbf{Customer}: the end user who wishes to deposit liquidity on the GNU Taler Exchange + \item \textbf{GNU Taler Exchange}: the payment service subject to AML, which delegates the eKYC process to the KYCID service + \item \textbf{KYCID}: the web service responsible for executing the eKYC process for GNU Taler Exchange +\end{enumerate} + +\pagebreak + +The following diagram is a model of the project's planned money deposit sequence. + +\begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{toplevel-sequence} + \caption{Top-level project sequence flow} + \label{fig:arch-toplevel-sequence} +\end{figure} + +The following steps are involved in the process: +\begin{enumerate} + \item \textbf{Deposits}: The customer deposits liquidity on a GNU Taler exchange. + \item \textbf{Initiation of eKYC process}: As the exchange is subject to the AML, it initiates a KYC process using the KYCID service (delegation via OAuth2 authorisation flow). The customer's browser is redirected to the KYCID. + \item \textbf{OAuth front channel, eKYC}: comprises a series of round trips between the customer's browser and the KYCID, during which the KYC process is performed. This process requires interaction with the customer, as illustrated in figure. + \item \textbf{OAuth back channel}: Once the KYC process has been completed, the user's browser is redirected to the exchange with an authorisation code that allows it to retrieve an access token from the KYCID. This is the OAuth back channel. + \item \textbf{Retrieve eKYC information}: the exchange can retrieve the information from the eKYC process thanks to the access token previously granted. + \item \textbf{Release}: once verified, if the exchange criteria are satisfied. It can release the deposits. +\end{enumerate} + +The process described above is a case study of an OAuth authorisation code flow application for GNU Taler that performs an eKYC procedure to release money. +you can find more details on how OAuth2 works in section \ref{OAuth2-Framework}. + +\section{System architecture} + +\begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{system} + \caption{System architecture} + \label{fig:arch-system} +\end{figure} + +The figure above on the left shows the \textbf{primary actors} in the system (listed below). +\begin{itemize} + \item \textbf{Client}: The client is the service that delegates the KYC process to the system. An example of this is the GNU Taler exchange. + \item \textbf{Customer}: The user whose identity is being verified. +\end{itemize} + +And on the right shows the \textbf{secondary actors} in the system (listed below). +\begin{itemize} + \item \textbf{SMS Provider}: The system must send SMS messages to verify the phone number. \\ + Swisscom is the SMS provider via the text messaging product, which allows SMS to be sent via a REST API. + \item \textbf{Mail sending server}: The system must also send an email to verify the address and notify the user. An SMTP server (such as Microsoft Exchange) is required. + \item \textbf{Persistence}: A postgres sql database to store system status. +\end{itemize} +\ No newline at end of file diff --git a/docs/contents/3.security.tex b/docs/contents/3.security.tex @@ -0,0 +1,102 @@ +\chapter{Security} + +\section{Cryptography} + +The security of this application is contingent upon the implementation of cryptographic primitives. +In this instance, we will utilise the robust \textbf{libsodium} library. + +The first primitive employed is the hashing of passwords utilising Argon2id, which is particularly +slow and therefore mitigates brute-force offline attacks. +The result of this process, along with the salt and algorithm used, is encoded according to +the standard PHC string format. + +\begin{bfhWarnBox} +The slowness of Argon2id provides protection against offline attacks, but it is necessary to implement additional protection against online brute force attacks. +The number of attempts over a period of time must therefore be limited. +\end{bfhWarnBox} + +The second primitive used is an AEAD (authenticated encryption with additional data), which is used +to seal contextual data injected into an HTML form in order to implement workflow +(succession of forms + navigation). + +\begin{bfhNoteBox} +The AEAD used to create a crypto token utility to convey information between forms. +The implementation is analogous to that of Branca \cite{Branca}. +\end{bfhNoteBox} + +The last primitive employed is the \gls{CSPRNG} generator, which is used to generate non-guessable random code. + +\section{OAuth2 Framework} \label{OAuth2-Framework} + +This project takes place in the context of the OAuth2 framework, which defines a model +(notably for security) as well as a set of protections required to comply +with the standard \cite{rfc6749}. OAuth2 allows a third-party application (client) to access a set of resources (scope) +belonging to a resource owner (RO) on a remote server. + +OAuth2 defines 4 roles: +\begin{table}[H] + \centering + \setupBfhTabular + \begin{tabular}{llp{.58\textwidth}} + \rowcolor{BFH-tablehead} + \textbf{Role}&\textbf{Type}&\textbf{Description}\\\hline + Resource & Data & The resource in question is to be accessed. In KYCID its an human identity \\\hline + Resource owner (RO) & Person & Customer in KYCID. He own his ID \\\hline + Client & Machine & Third party should perform and delegate to KYCID an eKYC process. \\\hline + Authorization server & Machine & OAuth2 server. it's KYCID.\\\hline + Resource server & Machine & Server provide resource access. it's KYCID.\\\hline + \end{tabular} + \caption{Roles in OAuth2 Framework} +\end{table} + +To describe the different security features, we first need to describe the different steps in an authorisation flow sequence, as shown in the figure below: +\begin{figure}[H] + \centering + \includegraphics[width=.95\textwidth]{oauth2-flow} + \caption{OAuth2 authorization flow sequence} + \label{fig:OAuth2-flow} +\end{figure} + +The figure above shows a sequence of steps in an authorisation code flow. The steps are explained below: + +\begin{enumerate} + \item the resource owner initiates the flow. + \item the client redirects the user via the HTTP redirection mechanism. However, the client is susceptible to a \gls{CSRF} attack due to the fact that initialising the flow is merely a URL to which the user is redirected. This URL is therefore susceptible to guessing, and therefore the attack can be carried out (see section \ref{csrf}). + \item The RO interacts with the authorization server in a front channel call phase due to the presence of a web app that allows interaction. + + In this case, it is the authorization server that is vulnerable to the RO attempting to circumvent the established procedures. Consequently, it is imperative to never trust any input originating from the user (systematic validation) and to implement measures to protect against CSRF (see section \ref{csrf}). + + The purpose of server authorisation is to determine whether to grant access to the requested resource (scopes). To achieve this, the server can implement any application logic (within the web app) to perform this action. + + \item If the previous step has been authorised, the RO will be redirected to the client with an authorisation code and the csrf protection token from step 2 (this information is conveyed by query parameters called \textit{code} and \textit{state}). + + With this code we can make a so-called back channel request (as opposed to the front channel of step 3), because it is an http request from server to server and therefore there is no WebUI. This request is sent from the client to the authentication server with the received authentication code and something that authenticates the client to the authentication server (see section \ref{client-authn}). + + This request retrieves an access token. The reason for having 2 tokens (authorisation code and access token) instead of a direct access token is related to the fact that the token returned by the front channel can only be passed in url (query parameter), which is not a secure means of transport for information as sensitive as an access token, as url can be logged in several places (proxy server, cache, history, intercepted by the application on Android, log server). Therefore, the authorisation code can only be used once to obtain the access token. +\end{enumerate} + +\section{Cross-site request forgery} \label{csrf} + +A CSRF attack may occur when an application contains actions that are linked to one another. It is possible for another site to forge a request for a given action, thus bypassing the intended steps and processes. This could result in the hijacking of the originally planned process by a hacker. Additionally, the request could be made on another site, leading to the recovery of the cookie at the time of the request. +To mitigate this issue, two methods can be employed: + +The first method involves setting the "Same-Site" attribute to "Lax" on the cookie. This prevents the cookie from being added if the request is made on another site or domain. This avoids recovering the session. + +The second method is to add a CSRF token (which must not be forgeable anywhere other than on the server) in a hidden field. When the request is processed, the token is checked to ensure its validity. In KYCID, the CSRF token is implemented by an AEAD (see section A), which encrypts the contextual data of the action, thus securing it. In addition, the action and session are used as additional data to ensure that the AEAD signature is unique for each action and session, thus avoiding reusing a token twice. Furthermore, the token has a defined lifetime. + +\section{Client authentification} \label{client-authn} + +Two methods exist for authenticating the client. The first and simplest method involves recording a secret that is known only to the client and the authorisation server. By sending this secret, the authorisation server can verify the client's authenticity. + +However, this method can cause problems in the event of a leak or if the client is not executed on a server but directly in JavaScript in the browser or in an application on a smartphone. This is referred to as a non-confidential client. This client is unable to safeguard this secret. + +In response to this problem, OAuth2 has introduced a second method of client authentication called PKCE (Proof Key for Code Exchange) which does not authenticate the client but rather authenticates that the Back Channel request was made by the same instance as the Front Channel request. To achieve this, the client generates a secret, named \textit{code\_verifier}, at random and hashes it with SHA256. The result of this process is called \textit{code\_challenge}. The authentication server is able to verify the authenticity of the client by repeating the process of hashing the \textit{code\_verifier} and comparing the result with the \textit{code\_challenge} sent in the front-channel request. + +\begin{bfhWarnBox} +In OAuth 2.1, it is imperative to utilise PKCE, regardless of whether the client possesses a secret. This is to mitigate the risk of an attack in the event of a leak of this secret. +\end{bfhWarnBox} + +\begin{bfhNoteBox} +In the field of cryptography, PKCE represents a commitment scheme. +\end{bfhNoteBox} + +\ No newline at end of file diff --git a/docs/contents/4.design.tex b/docs/contents/4.design.tex @@ -0,0 +1,72 @@ +\chapter{Design} + +\section{Approach} + +In this project, the approach used is Domain Driven Design (here after DDD). This approach, originally introduced by Eric EVANS in an over-rated book called BlueBook, considers that the domain/business of the application is far more valuable than the technique and should therefore be put first. + +There are 2 aspects to this theory: strategy and tactics. + +\begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{strategical-vs-tactical} + \caption{DDD Strategical concept vs Tactical concept} + \label{fig:design-strategical-vs-tactical} +\end{figure} + +The figure above lists the main patterns used in the project, both strategic and tactical. The strategic patterns are more conceptual and mainly used for modelling, whereas the tactical patterns are standard design patterns. + +\section{Technologies} + +The technologies used are listed below: +\begin{itemize} + \item \textbf{Typescript}: superset of ecmascript (JS) allowing to devéloppé in JS with a powerful system of verification of type. + \item \textbf{Libsodium}: serious library written in C that allows to perform various cryptographic tasks. Used for encryption / token authentication (see Token Security section) as well as password hashing (see Password Security section). Has a JS/TS port/module for use in Typescript. + \item \textbf{PostgreSQL}: database engine. Chosen because already used by M. Emanuelle BENOIST to be used after the thesis. + \item \textbf{Deno fresh}: Small HTTP/HTTPS framework developed in Typescript (modification compared to Adonis previously used by Mr Loïc Fauchière). + \item \textbf{Valita}: Small library allowing to make verification / validation of data and allowing to make correspond the Typescript types defined at compilation, but with a runtime verification (validation). + \item \textbf{Tesseract}: ORC Engine to scan MRZ on ID Document + \item \textbf{Deno}: Secure runtime (change from node used before). +\end{itemize} + +\section{Clean architecture} \label{clean-arch} + +The KYCID server software is designed on a "clean architecture" model, as described in reference \cite{CleanArch}. +This model is a layered model, but where the domain is the base layer rather than the persistence layer. + +\begin{figure}[H] + \centering + \includegraphics[width=0.9\textwidth]{software-layer} + \caption{Software Layer architecture} + \label{fig:arch-software-layer} +\end{figure} + +The design comprises three layers: the domain layer, the application layer and the infrastructure and presentation layer. The domain and application layers constitute the core layer. + +\section{Domain layer} + +This is the most elementary layer of the system, so it depends only on itself. There will only be simple classes that model the domain (hence the name) and raise exceptions if invariants are not respected. + +\begin{bfhWarnBox} + It is important to distinguish between the domain model and the database persistence model. For instance, in a database, the objective is to avoid duplication. In the domain, it is possible to have two distinct classes representing a user in two different contexts. However, in the database, the aim is to merge these into a single table. +\end{bfhWarnBox} + +\section{Application layer} + +This layer constitutes the core of the domain and is dependent on both itself and the domain layer situated directly below. The role of the application layer is to connect the domain with the external environment. In order to fulfil this function, it is necessary to invert control using the port/adapter pattern. This involves creating an interface (port) in the application layer which can be used by the layer but placing the implementation (adapter) in the layer above. It is preferable to place as little business code as possible in this layer and to instead place it in the domain layer. + +It is also necessary for the application layer to prevent the infrastructure layer from depending indirectly on the application layer. For example, exceptions raised in the domain layer must be handled by the application layer. Similarly, it is important to avoid raising exceptions in the application layer. However, exceptions that are raised by adapters should not be handled by the application layer. + +It is not advisable for the application layer to raise exceptions, as this should be the domain layer's responsibility. However, any exception raised in an adapter in the infrastructure layer that is not a domain exception (for example, a connection failure exception) should not be handled by the application layer. + +\begin{bfhWarnBox} + The application layer must not depend on infrastructure or technical code that you have not written yourself (avoid complex libraries). +\end{bfhWarnBox} + +\section{Infrastructure and presentation layer} + +This layer is responsible for encapsulating all the technical complexity associated with infrastructure and user presentation. It will contain the most direct code to implement the application layer adapter. +Not any business logic is included. + +\begin{bfhWarnBox} + This layer should be independent of the domain, as it is not directly below it. This principle is linked to the fact that we do not want a change in the domain to imply a change in the infrastructure, nor vice versa. +\end{bfhWarnBox} +\ No newline at end of file diff --git a/docs/contents/5.testing.tex b/docs/contents/5.testing.tex @@ -0,0 +1,68 @@ +\chapter{Testing} + +KYCID uses a TDD \cite{Fowler_TDD} approach which consists of writing the tests before the code and following the cycle below. + +\begin{figure}[H] + \centering + \includegraphics[width=0.75\textwidth]{tdd-cycle} + \caption{TDD Developpment Cycle} + \label{fig:TDD-Cycle} +\end{figure} + +Cycle steps: +\begin{enumerate} + \item write the test, run it and then fail it (to check the test's ability to detect) + \item have the tests taken as directly as possible + \item refactor the code + \item repeat the cycle as many times as necessary +\end{enumerate} + +\begin{bfhNoteBox} + The following narrative scheme \cite{Fowler_GWT} is particularly useful for writing tests: + \begin{enumerate} + \item \textbf{Given}: a certain situation (arrange) + \item \textbf{When}: trigger action (act) + \item \textbf{Then}: verify result of action (assert) + \end{enumerate} +\end{bfhNoteBox} + +\section{Strategy} \label{test-strategy} + +It is important to note that not all tests are equally useful or even cost the same. +In our case, we can list four types of test: unit tests, acceptance tests, integration tests and end-to-end tests. +These can be hierarchised in a diamond below: + +\begin{figure}[H] + \centering + \includegraphics[width=0.45\textwidth]{DiamondTesting} + \caption{Diamond testing strategy} + \label{fig:DiamondTesting} +\end{figure} + +The subsequent section will provide detailed information regarding the specific nature of each test. + +\section{Unit tests} + +These tests are designed to assess a single unit of code, hence the name. They are relatively simple and quick to write. + +However, they tend to focus on minor technical details that may not be directly relevant to the final project. Consequently, we only use unit tests when necessary and not as a systematic approach. This is in contrast to pyramid testing \cite{Fowler_TPyramid}, which relies on them as a fundamental basis. + + +\section{Acceptance tests} \label{acceptance-tests} + +The purpose of acceptance testing is to validate/accept the existence of a given use case. + +They are more interesting because they verify functionality, which is the most valuable thing in software (at least in terms of agility). + +These tests are more difficult to write. However, with a clean architecture (see section \ref{clean-arch}), these tests are greatly simplified because we are testing the core layer (domain and application layer). This layer does not depend on the infrastructure, but on ports that have been specially designed for this case. There is therefore no technical code, only business code, which means that the acceptance test becomes a kind of large unit acceptance test. + +\section{Integration tests} + +The objective of integration tests is not to be exhaustive but to verify the communication (integration) between components. These tests are necessary to ensure the overall functionality of the application, but they are complex to write. Consequently, the strategy in diamand is to write the minimum necessary and no more. + +\section{End-to-end tests} + +In end-to-end testing, the objective is to test from the perspective of the end user. This makes these tests the most challenging to write, as they require the control of a significant amount of code, which introduces a high degree of complexity and technical detail. Unlike integration tests (see section A), they must also simulate the entire application and its infrastructure, which contributes to the high cost. + +However, these tests, which verify the user's point of view, are considered the most valuable according to the principles of agility. Consequently, there will be few end-to-end tests in the diamond strategy. + diff --git a/docs/contents/6.results.tex b/docs/contents/6.results.tex @@ -0,0 +1,15 @@ +\chapter{Results} \label{result} + +Following a significant investment of time and effort, I was able to develop KYCID with a clean code structure (in accordance with the principles of clean architecture), which allows the code to evolve and be maintained. + +In addition, the testing strategy has been followed more closely, with the implementation of unit, acceptance and integration tests that are relatively comprehensive. However, due to a lack of time and the necessary setup to get started, no end-to-end tests could be set up and were replaced by manual tests. + +In terms of operational functionality, the system can be readily configured via the variable environment, as detailed in the user manual (see section \ref{configuration}). The configuration options allow the user to select and configure various aspects of the system, including persistence, email and SMS sending, and HTTPS server configuration. + +Persistence has two modes: the first is in-memory, where all data is stored in memory (a useful feature for testing and development purposes), and the second is postgres, where all data is stored in the database with the same name. In terms of email transmission, there are two modes: a "fake mode," which logs the email to the console (used for testing and development), and an SMTP mode, which sends an email using this protocol. + +With regard to SMS transmission, there are also two modes: a "fake mode," which is similar to sending email, and a Swisscom mode, which uses the Text Messaging (SMS) service to send SMS. + +In terms of functionality, the main features are present, namely a connection system with email verification, a brute force protection system for passwords and codes entered, and a procedure for sending emails and text messages. Additionally, a session system, as well as user verification by SMS, identity verification with ID card/passport scanning, document MRZ with validation by admin, and connection via OAuth2 authorisation flow are included. + +Nevertheless, certain functionalities are absent, including PKCE security, password reset, request to forget, and a CSV export system for billing the service to the customer. +\ No newline at end of file diff --git a/docs/contents/7.conclusion.tex b/docs/contents/7.conclusion.tex @@ -0,0 +1,17 @@ +\chapter{Conclusion} + +KYCID is a pre-production prototype. There are numerous avenues for further development. In particular, we may cite the non-implemented functionalities mentioned in the results (see results \ref{result}). + +The potential enhancements may be found in the AI, which would permit the human to be assisted in his task of detecting fraud in the verification of identity documents. This would permit the process to be enhanced and industrialised, for instance, to pre-filter the profile for human validation. + +Similarly, to ascertain that it is indeed the holder’s identity card, we utilise a face-challenge. We can envisage more complex face-challenges, such as live actions (using a video stream instead of photos). + +Another area for improvement is the operational aspect, in particular the introduction of an observability/monitoring system with security audit logs. In addition, an administration system should be implemented to enable the client application to register, and a billing and payment system should be developed. This project has considerable potential for further development. + +To conclude on a more personal note and to draw some experience from this project, it can be observed that even a project that seems simple because it’s an idea that can be quickly explained can reveal unexpected complexities and workloads. + +This is particularly evident in terms of planning, where the tasks may not seem complicated at first sight, but they are very numerous and, furthermore, the number of tasks is underestimated due to poor identification. It is therefore of great importance to utilise planning tools in order to ensure that the project remains on track. The project management issues encountered in this thesis can be categorised into two distinct categories. + +The first of these is that when a project is behind schedule, the necessity to catch up tends to result in a reduction in the rigour of maintenance for documentation, schedules and tests. This reduction in quality will ultimately lead to a loss of work efficiency, which will accentuate the delay (negative cycle). The challenging aspect of this is that the loss of efficiency is only visible weeks later. + +Secondly, experience plays a crucial role, particularly in terms of taking a step back and not wanting to go too fast on certain tasks while not dragging your feet. This is not a simple balance to achieve. +\ No newline at end of file diff --git a/docs/contents/_abstract.tex b/docs/contents/_abstract.tex @@ -0,0 +1,17 @@ +\addchap{Abstract} + +This bachelor's thesis, carried out by Mr Yann Mickael DOY and advised by Mr Emanuel BENOIST with the expertise of Mr Daniel VOISARD, explores the creation of an identity verification service platform (Know your customer, eKYC) called KYCID for "Know your customer's ID". + +The service enables third-party applications (client apps), such as GNU Taler, a payment platform, to perform eKYC procedures, which verify either the telephone number via a code sent by SMS, or by checking identity papers, or both. + +ID papers verification is carried out by taking a photograph of the ID card or passport and other images of the person in different positions using his camera or webcam. This enables an administrator to verify that the documents in question belong to the individual in question and to validate their account. + +In light of the aforementioned considerations, it is clear that security is of paramount importance. This is why the integration between the client app and KYCID is done with OAuth2. OAuth2 is a protocol and a set of specialised practices for delegating authorisation over HTTPS. In its version 2, it is technically mature and widely used in the industry. + +OAuth2 enables third parties (client applications) to request access to a protected resource on a service. In this case, the resource is the user's identity, and the service is KYCID. OAuth2 is not merely a protocol; it is also a framework that provides the technical knowledge to enable its implementation in a secure manner. + +Furthermore, KYCID incorporates a comprehensive array of security measures, including password protection, an anti-brute force system, and filters to prevent SMS plumping, which involves the use of premium rate numbers to extort money from the service. + +The KYCID functionality enables customers to register with an email address and verify it (to prevent the use of fake emails), verify a phone number and verify identity documents. Furthermore, KYCID allows customers to carry out an eKYC procedure without first creating an account. This account will be created automatically at the end of the eKYC procedure. + +The code has been developed in accordance with the principles of clean architecture, which facilitates scalability and testability. This has been achieved by implementing a comprehensive suite of automated unit, acceptance, and integration tests. +\ No newline at end of file diff --git a/docs/contents/_acknowledgement.tex b/docs/contents/_acknowledgement.tex @@ -0,0 +1,17 @@ +\addchap{Acknowledgement} + +Prior to commencing this thesis, it is necessary to acknowledge the individuals and resources that have contributed to the completion of this work. \\ + +Firstly, the thesis draws upon a previous thesis project conducted by Mr Loïc Fauchère in 2023, under the supervision of +Mr Emanuel BENOIST as advisor and Mr Daniel VOISARD as expert \cite{KYCPAAS}. \\ + +This work concerns the drafting of a service platform allowing third parties to carry out KYC procedures by manually verifying identity documents taken in photographs as well as different selfies of users in different positions. +Thus, this thesis, which follows this work, will be supervised by the same people in the same roles (M. BENOIST and M. VOISARD). \\ + +Initially, the report and source code were used directly, but then they were progressively replaced. The technology influence (initially Adonis JS and Typescript) was retained and subsequently replaced with Deno and Typescript. \\ + +Secondly, as a tangible application of this service platform developed at work, I integrated the service into GNU Taler, a privacy-friendly payment platform \cite{GNUTaler}. +As such, I was able to benefit from the assistance of Mr Christian GROTHOFF, who is a core developer on this project as well as a lecturer at the BFH. +In particular, he provided a presentation on the KYC process in Taler via OAuth2 (see section \ref{OAuth2-API}). \\ + +Finally, the work is also based on a set of tools derived from artificial intelligence. These include ChatGPT, which was initially employed in the thesis but was subsequently superseded by other AI, including the two models from DeepL (Translate and Write) \cite{DeepLTranslate,DeepLWrite}. +\ No newline at end of file diff --git a/docs/contents/_glossary.tex b/docs/contents/_glossary.tex @@ -0,0 +1,60 @@ +\newglossaryentry{KYCID} +{ + name=KYCID, + description={eKYC-as-a-Service web platform developed in this thesis and acronym of \textit{Know your customer's ID}} +} +\newglossaryentry{KYC} +{ + name=KYC, + description={acronym for Know your Customer is a set of practices aimed at verifying user identity} +} +\newglossaryentry{eKYC} +{ + name={eKYC}, + description={electronic \gls{KYC}} +} +\newglossaryentry{OAuth2} +{ + name={OAuth2}, + description={An HTTP-based communication protocol and framework for granting third-party access to resources} +} +\newglossaryentry{MRZ} +{ + name={MRZ}, + description={Zone on an identity card or passport where all the information on the document is encoded and easily scannable} +} +\newglossaryentry{OCR} +{ + name={OCR}, + description={Optical character recognition is an algorithm / process for extracting text from an image / scan} +} +\newglossaryentry{access token} +{ + name={Access Token}, + description={An authorization token allowing access to a resource} +} +\newglossaryentry{endpoint} +{ + name={Endpoint}, + description={URL on which we can access from machine to machine (API)} +} +\newglossaryentry{scopes} +{ + name={Scopes}, + description={List of strings specifying the resources the client wants to access} +} +\newglossaryentry{CSRF} +{ + name={CSRF}, + description={Cross-site request forgery is well-know HTTP vulnerability} +} +\newglossaryentry{CSPRNG} +{ + name={CSPRNG}, + description={Cryptographically-safe pseudo random generator} +} +\newglossaryentry{PKCE} +{ + name={PKCE}, + description={Proof Key for Code Exchange is a OAuth2 security to authenticate client} +} +\ No newline at end of file diff --git a/docs/contents/appendix-user-manual.tex b/docs/contents/appendix-user-manual.tex @@ -0,0 +1,156 @@ +\chapter{User Manual} + +\section{Requirement}\label{software-requirement} + +The following software is required for the deployment of KYCID: +\begin{table}[H] + \centering + \setupBfhTabular + \begin{tabular}{lll} + \rowcolor{BFH-tablehead} + \textbf{Dependencies}&\textbf{Version}&\textbf{Comment}\\\hline + Deno&>= 1.43&KYCID Runtime environement\\\hline + Postgres&compatible with 15&database\\\hline + Tesseract&compatible with 5.3&OCR Engine for Card or Passport Scanning\\\hline + Nix&any with flake feature&Environement manager, optional\\\hline + Mailcatcher&any&fake SMTP server with webUI, only for dev\\\hline + TexLive&with BFH template&only for compiling documentation + \end{tabular} + \caption{KYCID Software Dependencies} +\end{table} + +It is possible to install these dependencies independently, in accordance with the usual installation procedure. In this case, it is not necessary to install Nix. Alternatively, the guide below provides instructions on how to install Nix and use it to set up the environment. + +\section{Nix setup} + +Nix is a packet manager \cite{NIX}, which allows the user to create immutable and reproducible builds. +\begin{bfhWarnBox} +It is important to note that Nix, as a packet manager, is distinct from NixOS, a Linux distribution that employs Nix as a general packet manager. +\end{bfhWarnBox} + +To install nix you can just run install with following command: +\captionof{lstlisting}{Multi-user nix install on Linux} +\setupLinuxPrompt{student} +\begin{ubuntu} +sh <(curl -L https://nixos.org/nix/install) --daemon +\end{ubuntu} + +The installer will run interactively and pose a series of questions. Once the installation process is complete, it is necessary to restart the terminal. +If the user is using a Mac, the following command should be executed: +\captionof{lstlisting}{Nix install on MacOS} +\setupOSXPrompt{student} +\begin{macos} +sh <(curl -L https://nixos.org/nix/install) +\end{macos} + +In addition, should you wish to avoid installing the Nix system for all users, you may opt to install it in single user mode via the following command: +\captionof{lstlisting}{Single-user nix install on Linux} +\setupLinuxPrompt{student} +\begin{ubuntu} +sh <(curl -L https://nixos.org/nix/install) --no-daemon +\end{ubuntu} + +It should be noted that, in order to utilise the Flake feature, which has been designated as experimental, it is necessary to perform the requisite activation procedure. +\begin{bfhNoteBox} +Despite the note on the flake functionality as experimental, this is not the case. It is a significant change, and the features are named as such for the sake of Nix retro-compatibility. The functionality is widely stable and used. +\end{bfhNoteBox} + +Run the following command to enabled NIX Flake feature (the same on Linux and MacOS): +\captionof{lstlisting}{Enabled Nix Flake feature} +\setupOSXPrompt{student} +\begin{macos} +mkdir -p ~/.config/nix # to be sure that folder exists +echo 'experimental-features = nix-command flakes' > ~/.config/nix/nix.conf +\end{macos} + +\section{Environment setup} + + + +To set up the environment for execution, simply install the various dependencies listed in the software requirement section. +With NIX, the following command will suffice: +\captionof{lstlisting}{Disposable dev environment shell} +\setupOSXPrompt{student} +\begin{macos} +cd /path/to/projet +nix develop + +# without TexLive +nix shell .#deno .#tesseract .#postgresql .#mailcatcher +\end{macos} + +This command will start a shell in which the dependencies will be available. This will ensure that they do not conflict with the rest of the system. Once the shell is closed, the applications will still be stored in the Nix cache, but they will not be accessible in the PATH. + +\begin{bfhWarnBox} +Please note that this shell will have ALL the dependencies, including those used only in development such as TexLive (> 4GB), Mailcatcher or Postgres (as long as you already have a Postgres server elsewhere). +\end{bfhWarnBox} + +\begin{bfhNoteBox} +Please be aware that only the binaries and the library are installed, and no configuration file will be generated on your system or any daemon started. +\end{bfhNoteBox} + +In order to install only the dependencies in production, the following commands must be executed: +\setupOSXPrompt{student} +\begin{macos} +cd /path/to/projet +## Global install on system +nix profile install ".#deno" ".#tesseract" ".#postgresql" +## Local install on current shell +nix shell ".#deno" ".#tesseract" ".#postgresql" +\end{macos} +\captionof{lstlisting}{Production environment install} + +\section{Configuration}\label{configuration} + +The configuration of all elements takes place via environment variables. It is possible to log these variables in a file with the extension \texttt{.env}. +\lstinputlisting[ + language=bash, + caption={All Environment Variable and \texttt{.env.sample}} +]{../../.env.sample} + +\section{Postgres} + +\setupOSXPrompt{student} +\begin{macos} +initdb -D pgdata # pgdata is path to a folder that hold server files +postgres -D $PWD/pgdata --listen_addresses='127.0.0.1' & +export PGHOST=127.0.0.1 +export PGUSER=<your user> +export PGDATABASE=<database name> +export PGAPPNAME=kycid +createdb $PGDATABASE +cd /path/to/project +deno task nessie migrate # to run migration +\end{macos} +\captionof{lstlisting}{Setup local postgres server} + +\section{SMTP} + +\setupOSXPrompt{student} +\begin{macos} +mailcatcher --ip 127.0.0.1 --smtp-port 1025 --http-port 1080 --foreground +\end{macos} +\captionof{lstlisting}{Fake SMTP Server for developpment} + +\begin{bfhNoteBox} +Access to the email messages sent via this fake SMTP server is available via a web interface at the following address: \texttt{http://127.0.0.1:1080}. +\end{bfhNoteBox} + +\section{Usage} + +\setupOSXPrompt{student} +\begin{macos} +# MIGRATE POSTGRES SCHEMA +deno task nessie migrate + +# RUN DEV SERVER (AUTO RELOAD ON FILE CHANGE) +deno task dev + +# RUN PRODUCTION SERVER +deno run --allow-all src/http/main.ts + +# COMPILE LaTeX thesis (only on dev env) +cd docs +bfhlatex thesis +\end{macos} +\captionof{lstlisting}{Usage command cheatsheet} diff --git a/docs/defense.ltx b/docs/defense.ltx @@ -0,0 +1,324 @@ +\documentclass[ + nenglish, + authorontitle=true, +]{bfhbeamer} + + +\usepackage{iftex} +\ifPDFTeX +\usepackage[utf8]{inputenc} +\fi + +% FIGURES +\graphicspath{{figures/}} + +\let\code\texttt + +\title{KYCID} +\subtitle{An operational oauth2 integration of eKYC} +\author[M. Doy]{Yann Mickael DOY} +\institute{Technik und Informatik} +\titlegraphic*{\includegraphics{wallpaper}} + +%Activate the output of a frame number: +\setbeamertemplate{page number in head/foot}[framenumber] + +\begin{document} + +\setbeamertemplate{title page}[BFH-fullgraphic] +\maketitle + +\begin{frame}{Summary} + \tableofcontents[pausesections] +\end{frame} + +\setbeamertemplate{section page}[BFH-ruled] +\AtBeginSection{\sectionpage} + +% 5min max +\section{Introduction} + +\usebackgroundtemplate{\includegraphics[width=\paperwidth]{kyc-exemple-aviation}} +\setbeamercolor{frametitle}{fg=white} +\begin{frame} + \setbeamercolor{frametitle}{fg=white} + \frametitle{Take a plan} +\end{frame} + +\usebackgroundtemplate{\includegraphics[width=\paperwidth]{kyc-exemple-casino}} +\begin{frame} + \frametitle{Play in casino} +\end{frame} + +\usebackgroundtemplate{\includegraphics[width=\paperwidth]{kyc-exemple-alcohol}} + +\begin{frame} + \frametitle{Buy alcohol} +\end{frame} + +\usebackgroundtemplate{} +\setbeamercolor{frametitle}{fg=BFH-Gray} + +\begin{frame}{\textit{e}KYC} + \vfill\center + \huge \visible<2>{\textit{Electronic}} Know you customer + \vfill +\end{frame} + +\begin{frame}{Application of eKYC} + \begin{itemize}[<+->] + \item \large Online casino\vfill + \item \large Online shop\vfill + \item \large Public wifi access point\vfill + \item \large Online bank / financial intermediary + \end{itemize} +\end{frame} + +\begin{frame}{Authentication subject} + \begin{columns} + \begin{column}{0.5\textwidth} + \begin{center} + \huge Authority + \end{center} + \end{column} + \begin{column}{0.5\textwidth} + \pause + \begin{center} + \huge Owner + \end{center} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{Authority authentication} + \begin{itemize}[<+->] + \setlength\itemsep{3em} + \item \large Passport + \item \large ID Card + \item \large Driving license + \item \large Telecom operator (indirect) + \end{itemize} +\end{frame} + +\begin{frame}{Telecom owner authentication} + \begin{columns} + \begin{column}{0.265\textwidth} + \center + \includegraphics[width=\textwidth]{phone-ekyc-step-1}\pause + \end{column} + \begin{column}{0.367\textwidth} + \center + \includegraphics[width=\textwidth]{phone-ekyc-step-2}\pause + \end{column} + \begin{column}{0.367\textwidth} + \center + \includegraphics[width=\textwidth]{phone-ekyc-step-3} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{ID Document check} + \begin{columns} + \begin{column}{0.5\textwidth} + \center + \includegraphics[height=0.85\textheight]{id-doc-ekyc-doc-front}\pause + \end{column} + \begin{column}{0.6\textwidth} + \center + \includegraphics[height=0.85\textheight]{id-doc-ekyc-doc-back} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{Machine Readable Zone} + \center + \includegraphics[width=0.95\textwidth]{mrz} +\end{frame} + +\begin{frame}{ID Document owner authentication} + \begin{columns} + \begin{column}{0.333\textwidth} + \center + \includegraphics[height=0.75\textheight]{id-doc-ekyc-face-left}\pause + \end{column} + \begin{column}{0.334\textwidth} + \center + \includegraphics[height=0.75\textheight]{id-doc-ekyc-face-front}\pause + \end{column} + \begin{column}{0.333\textwidth} + \center + \includegraphics[height=0.75\textheight]{id-doc-ekyc-face-right} + \end{column} + \end{columns} +\end{frame} + +\section{Product} + +\begin{frame}{Idea} + \vfill + \begin{center} + \Huge Open-source eKYC-as-a-Service + \end{center} + \vfill +\end{frame} + +\begin{frame}{Motivations} + \begin{itemize}[<+->] + \setlength\itemsep{3em} + \item \large Specialized service + \item \large eKYC is a market + \item \large No open-source solution + \item \large Use of standard \textit{OAuth2} + \end{itemize} +\end{frame} + +\begin{frame}{OAuth2} + \begin{columns} + \begin{column}{0.5\textwidth} + \begin{itemize} + \setlength\itemsep{2em} + \item<1-> \large Authorization distributed + \item<3-> \large Normative + \item<4-> \large Widely deployed + \item<5-> \large Mature (security knowledge) + \item<6-> \large Framework \textit{OAuth2} + \end{itemize} + \end{column} + \begin{column}{0.5\textwidth} + \center + \visible<2->{\includegraphics[height=0.85\textheight]{oauth2-example}} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{OAuth2 Authorization Code Flow} + \center + \includegraphics[width=0.95\textwidth]{oauth2-flow} +\end{frame} + +\begin{frame}{OAuth2 Security} + \begin{columns} + \begin{column}{0.5\textwidth} + \begin{itemize} + \setlength\itemsep{2em} + \item<1-> \large Password security + \item<2-> \large Brute force protection (limitation) + \item<3-> \large Email verification + \item<4-> \large Cross-site request forgery + \item<5-> \large Open redirection + \end{itemize} + \end{column} + \begin{column}{0.5\textwidth} + \begin{itemize} + \setlength\itemsep{2em} + \item<6-> \large Input validation + \item<7-> \large Spam/bot prevention + \item<8-> \large Transaction bypass + \item<9-> \large Client authentication + \end{itemize} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{Architecture} + \center + \includegraphics[width=0.85\textwidth]{system} +\end{frame} + +\begin{frame}{Workflow security} + \begin{columns} + \begin{column}{0.5\textwidth} + \large{\textbf{Problems}} + \begin{itemize} + \setlength\itemsep{2em} + \item<1-> \large HTML Form + \item<2-> \large Cross-site request forgery + \item<3-> \large Contextual as input + \item<4-> \large Open redirection + \end{itemize} + \end{column} + \begin{column}{0.5\textwidth} + \large{\textbf{Solution}} + \begin{itemize} + \setlength\itemsep{2em} + \item<5-> \large Encrypt (AEAD) + \item<6-> \large Context input + \item<7-> \large Action as AD + \item<8-> \large Session as AD + \end{itemize} + \end{column} + \end{columns} +\end{frame} + +\begin{frame}{Clean architecture (design)} + \center + \includegraphics[height=0.9\textheight]{software-layer} +\end{frame} + +\begin{frame}{Testing driven developpment (TDD)} + \center + \includegraphics[height=.85\textheight]{tdd-cycle} +\end{frame} + +\begin{frame}{Testing diamond strategy} + \center + \includegraphics[height=0.85\textheight]{DiamondTesting} +\end{frame} + +\begin{frame}{Writing test} + \begin{itemize} + \setlength\itemsep{3em} + \item<1-> \large Define \textit{system under test} (SUT) + \item<2-> \large Write an example (scenario) + \item<3-> \large \textit{Given}, \textit{when} and \textit{then} narative pattern + \item<4-> \large Don't mock what you don't own + \end{itemize} +\end{frame} + +\section{Demo} + +\section{Conclusion} + +\begin{frame}{Project management I} + \center + \huge Don't underestimate the workload +\end{frame} + +\begin{frame}{Project management II} + \center + \huge Task difficult to estimate = task poorly defined +\end{frame} + +\begin{frame}{Project management III} + \center + \huge Skipped work will cost later +\end{frame} + +\begin{frame}{Clean architecture and Acceptance test} + \center + \huge Use case is more important than domain +\end{frame} + +\begin{frame}{Perspective} + \begin{itemize} + \setlength\itemsep{2em} + \item<1-> \large Validation by video stream + \item<2-> \large Validation process + \item<3-> \large IA for validation + \item<4-> \large UI \& UX + \item<5-> \large Audit + \end{itemize} +\end{frame} + +\begin{frame} + \center + \Huge Thanks you! +\end{frame} + + +\begin{frame} + \center + \Huge Questions? +\end{frame} +\end{document} + diff --git a/docs/figures/DiamondTesting.png b/docs/figures/DiamondTesting.png Binary files differ. diff --git a/docs/figures/authorize-process.pdf b/docs/figures/authorize-process.pdf Binary files differ. diff --git a/docs/figures/connection-process.pdf b/docs/figures/connection-process.pdf Binary files differ. diff --git a/docs/figures/design.drawio b/docs/figures/design.drawio @@ -0,0 +1,67 @@ +<mxfile host="app.diagrams.net" modified="2024-06-06T09:06:42.244Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0" etag="LeoHrAGTSV2IeQJq2Knk" version="24.4.13" type="device"> + <diagram name="Page-1" id="p9Xagub4PCw6LYskljMy"> + <mxGraphModel dx="954" dy="582" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-1" value="Strategical" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=18;" vertex="1" parent="1"> + <mxGeometry x="50" y="10" width="270" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-2" value="<font style="font-size: 18px;">Tactical design pattern</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="320" y="10" width="320" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-3" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=4;" edge="1" parent="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="320" y="280" as="sourcePoint" /> + <mxPoint x="320" y="40" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-4" value="" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ZGGmiLNQrLl-iSOgsxLD-1" target="ZGGmiLNQrLl-iSOgsxLD-2"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="390" y="160" as="sourcePoint" /> + <mxPoint x="440" y="110" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-5" value="Bounded Context" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> + <mxGeometry x="50" y="120" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-6" value="Unambiquitous Language" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="180" y="150" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-7" value="Domain" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="90" y="60" width="80" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-8" value="Sub-Domain" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" vertex="1" parent="1"> + <mxGeometry x="190" y="80" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-9" value="Generic Sub-Domain" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="70" y="190" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-11" value="Context Map" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1"> + <mxGeometry x="170" y="230" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-13" value="<div>Dependencies</div><div>Injection<br></div>" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1"> + <mxGeometry x="425" y="160" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-14" value="Entites" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1"> + <mxGeometry x="335" y="70" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-15" value="Value Object" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1"> + <mxGeometry x="355" y="120" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-16" value="Port / Adapter" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" vertex="1" parent="1"> + <mxGeometry x="345" y="210" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-17" value="Factories" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="505" y="200" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-18" value="Repository" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;" vertex="1" parent="1"> + <mxGeometry x="465" y="70" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZGGmiLNQrLl-iSOgsxLD-19" value="Layer" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" vertex="1" parent="1"> + <mxGeometry x="495" y="110" width="120" height="30" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/figures/ekyc-process.pdf b/docs/figures/ekyc-process.pdf Binary files differ. diff --git a/docs/figures/ekyc.png b/docs/figures/ekyc.png Binary files differ. diff --git a/docs/figures/face-challenge.png b/docs/figures/face-challenge.png Binary files differ. diff --git a/docs/figures/id-doc-ekyc-doc-back.png b/docs/figures/id-doc-ekyc-doc-back.png Binary files differ. diff --git a/docs/figures/id-doc-ekyc-doc-front.png b/docs/figures/id-doc-ekyc-doc-front.png Binary files differ. diff --git a/docs/figures/id-doc-ekyc-face-front.png b/docs/figures/id-doc-ekyc-face-front.png Binary files differ. diff --git a/docs/figures/id-doc-ekyc-face-left.png b/docs/figures/id-doc-ekyc-face-left.png Binary files differ. diff --git a/docs/figures/id-doc-ekyc-face-right.png b/docs/figures/id-doc-ekyc-face-right.png Binary files differ. diff --git a/docs/figures/kyc-exemple-alcohol.png b/docs/figures/kyc-exemple-alcohol.png Binary files differ. diff --git a/docs/figures/kyc-exemple-aviation.png b/docs/figures/kyc-exemple-aviation.png Binary files differ. diff --git a/docs/figures/kyc-exemple-casino.png b/docs/figures/kyc-exemple-casino.png Binary files differ. diff --git a/docs/figures/mrz.png b/docs/figures/mrz.png Binary files differ. diff --git a/docs/figures/oauth2-example.pdf b/docs/figures/oauth2-example.pdf Binary files differ. diff --git a/docs/figures/oauth2-flow.pdf b/docs/figures/oauth2-flow.pdf Binary files differ. diff --git a/docs/figures/old/DepositWithKYC.bpmn b/docs/figures/old/DepositWithKYC.bpmn @@ -0,0 +1,2047 @@ +<?xml version="1.0" encoding="UTF-8"?> +<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:bioc="http://bpmn.io/schema/bpmn/biocolor/1.0" xmlns:color="http://www.omg.org/spec/BPMN/non-normative/color/1.0" xmlns:zeebe="http://camunda.org/schema/zeebe/1.0" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_17e93np" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.19.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.4.0"> + <bpmn:collaboration id="Collaboration_1oj2zj1"> + <bpmn:participant id="Participant_0a7y36t" name="Deposit with KYC" processRef="Taler" /> + <bpmn:group id="Group_1qjzvh5" /> + <bpmn:association id="Association_12jvq7f" associationDirection="None" sourceRef="Group_1qjzvh5" targetRef="TextAnnotation_0vi3gci" /> + </bpmn:collaboration> + <bpmn:process id="Taler" name="DepositWithKYC" isExecutable="false"> + <bpmn:laneSet id="LaneSet_1y0p8c1"> + <bpmn:lane id="Lane_147imgz" name="Taler Exchange"> + <bpmn:flowNodeRef>Event_0a4tk0g</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_0pet7qa</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_08kelwy</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Gateway_06o5rd8</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_00vx0tn</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Gateway_1f80x1z</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_1npb8xw</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Event_0p387kf</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_0nshow5</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_1wu7qa6</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Activity_0gg905v</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Event_11b0hh3</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Event_09tcsyw</bpmn:flowNodeRef> + </bpmn:lane> + <bpmn:lane id="Lane_1249v6j" name="KYCPaaS"> + <bpmn:flowNodeRef>Activity_0kto1mg</bpmn:flowNodeRef> + <bpmn:flowNodeRef>Event_0ysi3ui</bpmn:flowNodeRef> + </bpmn:lane> + </bpmn:laneSet> + <bpmn:sequenceFlow id="Flow_0hgmx63" sourceRef="Event_0a4tk0g" targetRef="Activity_0pet7qa" /> + <bpmn:sequenceFlow id="Flow_09moq56" sourceRef="Activity_0pet7qa" targetRef="Activity_08kelwy" /> + <bpmn:sequenceFlow id="Flow_17tzkt0" sourceRef="Activity_08kelwy" targetRef="Gateway_06o5rd8" /> + <bpmn:sequenceFlow id="Flow_12389zf" name="Yes" sourceRef="Gateway_06o5rd8" targetRef="Activity_0nshow5" /> + <bpmn:sequenceFlow id="Flow_1j4t1fh" sourceRef="Gateway_06o5rd8" targetRef="Event_09tcsyw" /> + <bpmn:sequenceFlow id="Flow_0gnvwnu" sourceRef="Activity_0kto1mg" targetRef="Activity_00vx0tn" /> + <bpmn:sequenceFlow id="Flow_1vg1vv5" sourceRef="Activity_00vx0tn" targetRef="Activity_1wu7qa6" /> + <bpmn:sequenceFlow id="Flow_1wkzy7u" sourceRef="Activity_0gg905v" targetRef="Gateway_1f80x1z" /> + <bpmn:sequenceFlow id="Flow_1e07wzn" sourceRef="Gateway_1f80x1z" targetRef="Activity_1npb8xw" /> + <bpmn:sequenceFlow id="Flow_1ds8qgw" sourceRef="Gateway_1f80x1z" targetRef="Event_09tcsyw" /> + <bpmn:sequenceFlow id="Flow_1neo3ds" sourceRef="Activity_1npb8xw" targetRef="Event_0p387kf" /> + <bpmn:sequenceFlow id="Flow_00m8c3m" sourceRef="Event_11b0hh3" targetRef="Event_09tcsyw" /> + <bpmn:sequenceFlow id="Flow_0lk8psr" sourceRef="Event_0ysi3ui" targetRef="Event_09tcsyw" /> + <bpmn:sequenceFlow id="Flow_07qsy83" sourceRef="Activity_0nshow5" targetRef="Activity_0kto1mg" /> + <bpmn:sequenceFlow id="Flow_1wudy9s" sourceRef="Activity_1wu7qa6" targetRef="Activity_0gg905v" /> + <bpmn:startEvent id="Event_0a4tk0g"> + <bpmn:outgoing>Flow_0hgmx63</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:userTask id="Activity_0pet7qa" name="Ask deposit release"> + <bpmn:incoming>Flow_0hgmx63</bpmn:incoming> + <bpmn:outgoing>Flow_09moq56</bpmn:outgoing> + </bpmn:userTask> + <bpmn:businessRuleTask id="Activity_08kelwy" name="KYC Need Decision"> + <bpmn:incoming>Flow_09moq56</bpmn:incoming> + <bpmn:outgoing>Flow_17tzkt0</bpmn:outgoing> + </bpmn:businessRuleTask> + <bpmn:exclusiveGateway id="Gateway_06o5rd8" name="Need KYCPaaS ?"> + <bpmn:incoming>Flow_17tzkt0</bpmn:incoming> + <bpmn:outgoing>Flow_12389zf</bpmn:outgoing> + <bpmn:outgoing>Flow_1j4t1fh</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:serviceTask id="Activity_00vx0tn" name="OAuth Token exchange"> + <bpmn:incoming>Flow_0gnvwnu</bpmn:incoming> + <bpmn:outgoing>Flow_1vg1vv5</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_1f80x1z" name="Is Identified?"> + <bpmn:incoming>Flow_1wkzy7u</bpmn:incoming> + <bpmn:outgoing>Flow_1e07wzn</bpmn:outgoing> + <bpmn:outgoing>Flow_1ds8qgw</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:serviceTask id="Activity_1npb8xw" name="Release Deposit"> + <bpmn:incoming>Flow_1e07wzn</bpmn:incoming> + <bpmn:outgoing>Flow_1neo3ds</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:endEvent id="Event_0p387kf"> + <bpmn:incoming>Flow_1neo3ds</bpmn:incoming> + </bpmn:endEvent> + <bpmn:subProcess id="Activity_0nshow5" name="Start OAuth"> + <bpmn:incoming>Flow_12389zf</bpmn:incoming> + <bpmn:outgoing>Flow_07qsy83</bpmn:outgoing> + <bpmn:startEvent id="Event_1lhllip"> + <bpmn:outgoing>Flow_044noki</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_044noki" sourceRef="Event_1lhllip" targetRef="Activity_0xyz10m" /> + <bpmn:serviceTask id="Activity_0xyz10m" name="Generate State Object"> + <bpmn:incoming>Flow_044noki</bpmn:incoming> + <bpmn:outgoing>Flow_1djw0g4</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_1djw0g4" sourceRef="Activity_0xyz10m" targetRef="Activity_15qtcnh" /> + <bpmn:serviceTask id="Activity_15qtcnh" name="Generate Code Challenge"> + <bpmn:incoming>Flow_1djw0g4</bpmn:incoming> + <bpmn:outgoing>Flow_1izs0rz</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_1izs0rz" sourceRef="Activity_15qtcnh" targetRef="Activity_0jk8n2w" /> + <bpmn:serviceTask id="Activity_0jk8n2w" name="Generate Auth URI"> + <bpmn:incoming>Flow_1izs0rz</bpmn:incoming> + <bpmn:outgoing>Flow_06wndv7</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_06wndv7" sourceRef="Activity_0jk8n2w" targetRef="Event_0iwxp63" /> + <bpmn:endEvent id="Event_0iwxp63" name="HTTP Redirect To Auth Endpoint (URI)"> + <bpmn:incoming>Flow_06wndv7</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_0b0rr6x" /> + </bpmn:endEvent> + </bpmn:subProcess> + <bpmn:subProcess id="Activity_0kto1mg" name="OAuth Front Channel"> + <bpmn:incoming>Flow_07qsy83</bpmn:incoming> + <bpmn:outgoing>Flow_0gnvwnu</bpmn:outgoing> + <bpmn:startEvent id="Event_1q3dk9v"> + <bpmn:outgoing>Flow_0bkanj8</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_0bkanj8" sourceRef="Event_1q3dk9v" targetRef="Activity_02hrlpt" /> + <bpmn:serviceTask id="Activity_02hrlpt" name="Validate OAuth Request"> + <bpmn:incoming>Flow_0bkanj8</bpmn:incoming> + <bpmn:outgoing>Flow_1ugycya</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_0ymdjps" name="Valid?"> + <bpmn:incoming>Flow_1ugycya</bpmn:incoming> + <bpmn:outgoing>Flow_0wxi5e5</bpmn:outgoing> + <bpmn:outgoing>Flow_04u6p8s</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1ugycya" sourceRef="Activity_02hrlpt" targetRef="Gateway_0ymdjps" /> + <bpmn:sequenceFlow id="Flow_0wxi5e5" name="Yes" sourceRef="Gateway_0ymdjps" targetRef="Activity_17cij2m" /> + <bpmn:subProcess id="Activity_17cij2m" name="Authorization Process"> + <bpmn:incoming>Flow_0wxi5e5</bpmn:incoming> + <bpmn:outgoing>Flow_1hcjw9j</bpmn:outgoing> + <bpmn:startEvent id="Event_0twcw9y"> + <bpmn:outgoing>Flow_1kodcnw</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_1kodcnw" sourceRef="Event_0twcw9y" targetRef="Activity_09amsjf" /> + <bpmn:dataStoreReference id="DataStoreReference_1q3tws7" name="Session store" /> + <bpmn:sequenceFlow id="Flow_14evrco" sourceRef="Activity_0huncl0" targetRef="Gateway_1j4d4xy" /> + <bpmn:serviceTask id="Activity_0huncl0" name="Start session"> + <bpmn:incoming>Flow_00n25at</bpmn:incoming> + <bpmn:outgoing>Flow_14evrco</bpmn:outgoing> + <bpmn:dataOutputAssociation id="DataOutputAssociation_19b2mch"> + <bpmn:targetRef>DataStoreReference_1q3tws7</bpmn:targetRef> + </bpmn:dataOutputAssociation> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_1j4d4xy" name="Authenticated?"> + <bpmn:incoming>Flow_14evrco</bpmn:incoming> + <bpmn:outgoing>Flow_1azzwv3</bpmn:outgoing> + <bpmn:outgoing>Flow_1v0kmvi</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1azzwv3" name="Yes" sourceRef="Gateway_1j4d4xy" targetRef="Gateway_1dbe65g" /> + <bpmn:sequenceFlow id="Flow_1v0kmvi" sourceRef="Gateway_1j4d4xy" targetRef="Activity_1lumdha" /> + <bpmn:subProcess id="Activity_1lumdha" name="Login"> + <bpmn:incoming>Flow_1v0kmvi</bpmn:incoming> + <bpmn:startEvent id="Event_0fibab5"> + <bpmn:outgoing>Flow_051f8xc</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_051f8xc" sourceRef="Event_0fibab5" targetRef="Activity_0ng08x2" /> + <bpmn:userTask id="Activity_0ng08x2" name="Prompt Email"> + <bpmn:incoming>Flow_051f8xc</bpmn:incoming> + <bpmn:outgoing>Flow_0j3d845</bpmn:outgoing> + </bpmn:userTask> + <bpmn:sequenceFlow id="Flow_0j3d845" sourceRef="Activity_0ng08x2" targetRef="Activity_1nf6nns" /> + <bpmn:serviceTask id="Activity_1nf6nns" name="Find account"> + <bpmn:incoming>Flow_0j3d845</bpmn:incoming> + <bpmn:outgoing>Flow_1yr0ecm</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_0is38ku" name="Found?"> + <bpmn:incoming>Flow_1yr0ecm</bpmn:incoming> + <bpmn:outgoing>Flow_0y8yhx3</bpmn:outgoing> + <bpmn:outgoing>Flow_1w4j4tr</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1yr0ecm" sourceRef="Activity_1nf6nns" targetRef="Gateway_0is38ku" /> + <bpmn:sequenceFlow id="Flow_0y8yhx3" name="Yes" sourceRef="Gateway_0is38ku" targetRef="Gateway_14wv7lo" /> + <bpmn:subProcess id="Activity_16cukyb" name="Check Credential"> + <bpmn:incoming>Flow_121xvas</bpmn:incoming> + <bpmn:outgoing>Flow_0xo6jrg</bpmn:outgoing> + <bpmn:standardLoopCharacteristics /> + <bpmn:startEvent id="Event_1ab8ehw"> + <bpmn:outgoing>Flow_0dtmupl</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_0dtmupl" sourceRef="Event_1ab8ehw" targetRef="Activity_15sltjm" /> + <bpmn:serviceTask id="Activity_15sltjm" name="Compute Delay (Ratelimit)"> + <bpmn:incoming>Flow_0dtmupl</bpmn:incoming> + <bpmn:outgoing>Flow_187j741</bpmn:outgoing> + <bpmn:property id="Property_0kjg55l" name="__targetRef_placeholder" /> + <bpmn:dataInputAssociation id="DataInputAssociation_1jmkied"> + <bpmn:sourceRef>DataStoreReference_0zf827n</bpmn:sourceRef> + <bpmn:targetRef>Property_0kjg55l</bpmn:targetRef> + </bpmn:dataInputAssociation> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_187j741" sourceRef="Activity_15sltjm" targetRef="Event_0qs1lli" /> + <bpmn:intermediateCatchEvent id="Event_0qs1lli" name="Wait delay"> + <bpmn:incoming>Flow_187j741</bpmn:incoming> + <bpmn:outgoing>Flow_0u4i98t</bpmn:outgoing> + <bpmn:timerEventDefinition id="TimerEventDefinition_1n4q1d0" /> + </bpmn:intermediateCatchEvent> + <bpmn:sequenceFlow id="Flow_0u4i98t" sourceRef="Event_0qs1lli" targetRef="Activity_1go6kqq" /> + <bpmn:userTask id="Activity_1go6kqq" name="Prompt Password"> + <bpmn:incoming>Flow_0u4i98t</bpmn:incoming> + <bpmn:outgoing>Flow_0wk2vi6</bpmn:outgoing> + </bpmn:userTask> + <bpmn:sequenceFlow id="Flow_0wk2vi6" sourceRef="Activity_1go6kqq" targetRef="Activity_0vsewf0" /> + <bpmn:serviceTask id="Activity_0vsewf0" name="Check password"> + <bpmn:incoming>Flow_0wk2vi6</bpmn:incoming> + <bpmn:outgoing>Flow_0jrxgl4</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_03ruqgf" name="Match?"> + <bpmn:incoming>Flow_0jrxgl4</bpmn:incoming> + <bpmn:outgoing>Flow_0fjtz1a</bpmn:outgoing> + <bpmn:outgoing>Flow_0717nwp</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0jrxgl4" sourceRef="Activity_0vsewf0" targetRef="Gateway_03ruqgf" /> + <bpmn:sequenceFlow id="Flow_0fjtz1a" name="Yes" sourceRef="Gateway_03ruqgf" targetRef="Event_0uiu28g" /> + <bpmn:endEvent id="Event_0uiu28g" name="Credential Authenticated"> + <bpmn:incoming>Flow_0fjtz1a</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_19es2rt" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_0717nwp" sourceRef="Gateway_03ruqgf" targetRef="Activity_0swvwe2" /> + <bpmn:endEvent id="Event_16ffdl6" name="Credential Fail"> + <bpmn:incoming>Flow_030vfui</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1i68fp0" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_030vfui" sourceRef="Activity_0swvwe2" targetRef="Event_16ffdl6" /> + <bpmn:serviceTask id="Activity_0swvwe2" name="Report Error"> + <bpmn:incoming>Flow_0717nwp</bpmn:incoming> + <bpmn:outgoing>Flow_030vfui</bpmn:outgoing> + <bpmn:property id="Property_0hp60gk" name="__targetRef_placeholder" /> + <bpmn:dataInputAssociation id="DataInputAssociation_0v62v65"> + <bpmn:sourceRef>DataStoreReference_0zf827n</bpmn:sourceRef> + <bpmn:targetRef>Property_0hp60gk</bpmn:targetRef> + </bpmn:dataInputAssociation> + </bpmn:serviceTask> + <bpmn:dataStoreReference id="DataStoreReference_0zf827n" name="Security Report" /> + </bpmn:subProcess> + <bpmn:sequenceFlow id="Flow_1w4j4tr" name="No" sourceRef="Gateway_0is38ku" targetRef="Activity_0vfbxjb" /> + <bpmn:subProcess id="Activity_0vfbxjb" name="Register"> + <bpmn:incoming>Flow_1w4j4tr</bpmn:incoming> + <bpmn:outgoing>Flow_100hxiz</bpmn:outgoing> + <bpmn:startEvent id="Event_1yshq5i"> + <bpmn:outgoing>Flow_1r7a1ke</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_1r7a1ke" sourceRef="Event_1yshq5i" targetRef="Activity_0g8r8cs" /> + <bpmn:sequenceFlow id="Flow_1n3uaow" sourceRef="Activity_0g8r8cs" targetRef="Activity_01hwvjz" /> + <bpmn:userTask id="Activity_0g8r8cs" name="Prompt Password"> + <bpmn:incoming>Flow_1r7a1ke</bpmn:incoming> + <bpmn:incoming>Flow_1j2fpks</bpmn:incoming> + <bpmn:outgoing>Flow_1n3uaow</bpmn:outgoing> + </bpmn:userTask> + <bpmn:serviceTask id="Activity_01hwvjz" name="Validate Security Constraint"> + <bpmn:incoming>Flow_1n3uaow</bpmn:incoming> + <bpmn:outgoing>Flow_048zyk3</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_096emro" name="Is safe password?"> + <bpmn:incoming>Flow_048zyk3</bpmn:incoming> + <bpmn:outgoing>Flow_05nhbqn</bpmn:outgoing> + <bpmn:outgoing>Flow_1h137d9</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_048zyk3" sourceRef="Activity_01hwvjz" targetRef="Gateway_096emro" /> + <bpmn:sequenceFlow id="Flow_05nhbqn" name="No" sourceRef="Gateway_096emro" targetRef="Event_0050zdz" /> + <bpmn:sequenceFlow id="Flow_1j2fpks" sourceRef="Event_0050zdz" targetRef="Activity_0g8r8cs" /> + <bpmn:intermediateThrowEvent id="Event_0050zdz" name="Password not safe"> + <bpmn:incoming>Flow_05nhbqn</bpmn:incoming> + <bpmn:outgoing>Flow_1j2fpks</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_16s0h1y" /> + </bpmn:intermediateThrowEvent> + <bpmn:sequenceFlow id="Flow_1h137d9" sourceRef="Gateway_096emro" targetRef="Activity_0slbnv5" /> + <bpmn:userTask id="Activity_0slbnv5" name="Confirm Password"> + <bpmn:incoming>Flow_1h137d9</bpmn:incoming> + <bpmn:incoming>Flow_10ivlzh</bpmn:incoming> + <bpmn:outgoing>Flow_05vw7yw</bpmn:outgoing> + </bpmn:userTask> + <bpmn:task id="Activity_1d8qf7b" name="Passwords Match"> + <bpmn:incoming>Flow_05vw7yw</bpmn:incoming> + <bpmn:outgoing>Flow_0h0f923</bpmn:outgoing> + </bpmn:task> + <bpmn:sequenceFlow id="Flow_05vw7yw" sourceRef="Activity_0slbnv5" targetRef="Activity_1d8qf7b" /> + <bpmn:exclusiveGateway id="Gateway_15yxov3" name="Match?"> + <bpmn:incoming>Flow_0h0f923</bpmn:incoming> + <bpmn:outgoing>Flow_1xnv48h</bpmn:outgoing> + <bpmn:outgoing>Flow_15q8ius</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0h0f923" sourceRef="Activity_1d8qf7b" targetRef="Gateway_15yxov3" /> + <bpmn:sequenceFlow id="Flow_1xnv48h" name="No" sourceRef="Gateway_15yxov3" targetRef="Event_02fl86a" /> + <bpmn:sequenceFlow id="Flow_10ivlzh" sourceRef="Event_02fl86a" targetRef="Activity_0slbnv5" /> + <bpmn:intermediateThrowEvent id="Event_02fl86a" name="Password Mismatch"> + <bpmn:incoming>Flow_1xnv48h</bpmn:incoming> + <bpmn:outgoing>Flow_10ivlzh</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_15ebxio" /> + </bpmn:intermediateThrowEvent> + <bpmn:sequenceFlow id="Flow_15q8ius" sourceRef="Gateway_15yxov3" targetRef="Activity_1imcwjz" /> + <bpmn:serviceTask id="Activity_1imcwjz" name="Confirme Email"> + <bpmn:incoming>Flow_15q8ius</bpmn:incoming> + <bpmn:outgoing>Flow_1ydzzt7</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_1ydzzt7" sourceRef="Activity_1imcwjz" targetRef="Event_0mp8x6q" /> + <bpmn:intermediateThrowEvent id="Event_0mp8x6q" name="Confirmation email"> + <bpmn:incoming>Flow_1ydzzt7</bpmn:incoming> + <bpmn:outgoing>Flow_1vuifsd</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_10xdwcq" /> + </bpmn:intermediateThrowEvent> + <bpmn:sequenceFlow id="Flow_1vuifsd" sourceRef="Event_0mp8x6q" targetRef="Activity_19rj33z" /> + <bpmn:userTask id="Activity_19rj33z" name="Prompt Confirmation Code"> + <bpmn:incoming>Flow_1vuifsd</bpmn:incoming> + <bpmn:incoming>Flow_1jc568l</bpmn:incoming> + <bpmn:outgoing>Flow_0igkyux</bpmn:outgoing> + </bpmn:userTask> + <bpmn:sequenceFlow id="Flow_0igkyux" sourceRef="Activity_19rj33z" targetRef="Activity_1patror" /> + <bpmn:serviceTask id="Activity_1patror" name="Validate Code"> + <bpmn:incoming>Flow_0igkyux</bpmn:incoming> + <bpmn:outgoing>Flow_1h8eq73</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_0w3wm4j" name="Validate?"> + <bpmn:incoming>Flow_1h8eq73</bpmn:incoming> + <bpmn:outgoing>Flow_1ys5rc6</bpmn:outgoing> + <bpmn:outgoing>Flow_1jc568l</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1h8eq73" sourceRef="Activity_1patror" targetRef="Gateway_0w3wm4j" /> + <bpmn:sequenceFlow id="Flow_1ys5rc6" name="Yes" sourceRef="Gateway_0w3wm4j" targetRef="Event_0xfjgpy" /> + <bpmn:endEvent id="Event_0xfjgpy" name="Registered"> + <bpmn:incoming>Flow_1ys5rc6</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_18j8fbm" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_1jc568l" name="No" sourceRef="Gateway_0w3wm4j" targetRef="Activity_19rj33z" /> + </bpmn:subProcess> + <bpmn:exclusiveGateway id="Gateway_14wv7lo"> + <bpmn:incoming>Flow_100hxiz</bpmn:incoming> + <bpmn:incoming>Flow_0y8yhx3</bpmn:incoming> + <bpmn:outgoing>Flow_121xvas</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_100hxiz" sourceRef="Activity_0vfbxjb" targetRef="Gateway_14wv7lo" /> + <bpmn:sequenceFlow id="Flow_121xvas" sourceRef="Gateway_14wv7lo" targetRef="Activity_16cukyb" /> + <bpmn:sequenceFlow id="Flow_0xo6jrg" sourceRef="Activity_16cukyb" targetRef="Event_03eoc9g" /> + <bpmn:intermediateThrowEvent id="Event_03eoc9g" name="Logged"> + <bpmn:incoming>Flow_0xo6jrg</bpmn:incoming> + <bpmn:property id="Property_1pdcqcv" name="__targetRef_placeholder" /> + <bpmn:dataInputAssociation id="DataInputAssociation_1axcoun"> + <bpmn:sourceRef>DataStoreReference_1dazcw0</bpmn:sourceRef> + <bpmn:targetRef>Property_1pdcqcv</bpmn:targetRef> + </bpmn:dataInputAssociation> + <bpmn:messageEventDefinition id="MessageEventDefinition_18qmfb3" /> + </bpmn:intermediateThrowEvent> + <bpmn:dataStoreReference id="DataStoreReference_1dazcw0" name="Session store" /> + </bpmn:subProcess> + <bpmn:exclusiveGateway id="Gateway_1dbe65g"> + <bpmn:incoming>Flow_1azzwv3</bpmn:incoming> + <bpmn:incoming>Flow_1t5q2d1</bpmn:incoming> + <bpmn:outgoing>Flow_0vuyjxm</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0vuyjxm" sourceRef="Gateway_1dbe65g" targetRef="Activity_15huvzg" /> + <bpmn:exclusiveGateway id="Gateway_125frj1" name="Consent?"> + <bpmn:incoming>Flow_0gohdib</bpmn:incoming> + <bpmn:outgoing>Flow_08r5cic</bpmn:outgoing> + <bpmn:outgoing>Flow_0szqqpj</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:serviceTask id="Activity_1y71cx1" name="Issue Auth Code"> + <bpmn:incoming>Flow_1ou0y2x</bpmn:incoming> + <bpmn:outgoing>Flow_1xx4532</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_1xx4532" sourceRef="Activity_1y71cx1" targetRef="Activity_0f1svfw" /> + <bpmn:serviceTask id="Activity_0f1svfw" name="Persist OAuth Request"> + <bpmn:incoming>Flow_1xx4532</bpmn:incoming> + <bpmn:outgoing>Flow_17ezik1</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_17ezik1" sourceRef="Activity_0f1svfw" targetRef="Event_10rxoox" /> + <bpmn:sequenceFlow id="Flow_08r5cic" name="No" sourceRef="Gateway_125frj1" targetRef="Event_1g4p48y" /> + <bpmn:endEvent id="Event_1g4p48y"> + <bpmn:incoming>Flow_08r5cic</bpmn:incoming> + <bpmn:incoming>Flow_1aruwtj</bpmn:incoming> + <bpmn:incoming>Flow_00oxyqy</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1hxffu1" /> + </bpmn:endEvent> + <bpmn:exclusiveGateway id="Gateway_0nndzmg" name="Spam?"> + <bpmn:incoming>Flow_1v0qy3b</bpmn:incoming> + <bpmn:outgoing>Flow_00n25at</bpmn:outgoing> + <bpmn:outgoing>Flow_1aruwtj</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_00n25at" name="No" sourceRef="Gateway_0nndzmg" targetRef="Activity_0huncl0" /> + <bpmn:task id="Activity_09amsjf" name="IP Spam Check"> + <bpmn:incoming>Flow_1kodcnw</bpmn:incoming> + <bpmn:outgoing>Flow_1v0qy3b</bpmn:outgoing> + </bpmn:task> + <bpmn:sequenceFlow id="Flow_1v0qy3b" sourceRef="Activity_09amsjf" targetRef="Gateway_0nndzmg" /> + <bpmn:sequenceFlow id="Flow_1aruwtj" name="Yes" sourceRef="Gateway_0nndzmg" targetRef="Event_1g4p48y" /> + <bpmn:boundaryEvent id="Event_0bwsrc6" attachedToRef="Activity_1lumdha"> + <bpmn:outgoing>Flow_1t5q2d1</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_1xntprp" /> + </bpmn:boundaryEvent> + <bpmn:sequenceFlow id="Flow_1t5q2d1" sourceRef="Event_0bwsrc6" targetRef="Gateway_1dbe65g" /> + <bpmn:sequenceFlow id="Flow_0gohdib" sourceRef="Activity_15huvzg" targetRef="Gateway_125frj1" /> + <bpmn:subProcess id="Activity_1t48mzy" name="Verify scope attributes"> + <bpmn:incoming>Flow_0szqqpj</bpmn:incoming> + <bpmn:outgoing>Flow_1il0yc3</bpmn:outgoing> + <bpmn:startEvent id="Event_0fhlmze"> + <bpmn:outgoing>Flow_1a4n82m</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_1a4n82m" sourceRef="Event_0fhlmze" targetRef="Activity_1p3rlbs" /> + <bpmn:sequenceFlow id="Flow_1deqt80" sourceRef="Activity_1p3rlbs" targetRef="Activity_1fk0vjq" /> + <bpmn:subProcess id="Activity_1p3rlbs" name="Verify Phone Number scope"> + <bpmn:incoming>Flow_1a4n82m</bpmn:incoming> + <bpmn:outgoing>Flow_1deqt80</bpmn:outgoing> + <bpmn:startEvent id="Event_0bqqfvt"> + <bpmn:outgoing>Flow_0fjdi0g</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_0fjdi0g" sourceRef="Event_0bqqfvt" targetRef="Activity_0h26l95" /> + <bpmn:serviceTask id="Activity_0h26l95" name="Check phone in Scope"> + <bpmn:incoming>Flow_0fjdi0g</bpmn:incoming> + <bpmn:outgoing>Flow_16t8foj</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_10216oy" name="Need?"> + <bpmn:incoming>Flow_16t8foj</bpmn:incoming> + <bpmn:outgoing>Flow_1jm8xy5</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_16t8foj" sourceRef="Activity_0h26l95" targetRef="Gateway_10216oy" /> + <bpmn:sequenceFlow id="Flow_1jm8xy5" sourceRef="Gateway_10216oy" targetRef="Activity_1l7dn1c" /> + <bpmn:serviceTask id="Activity_1l7dn1c" name="Send Code"> + <bpmn:incoming>Flow_1jm8xy5</bpmn:incoming> + <bpmn:incoming>Flow_16ju5wj</bpmn:incoming> + <bpmn:incoming>Flow_09xggk3</bpmn:incoming> + <bpmn:outgoing>Flow_1snpj0t</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_1snpj0t" sourceRef="Activity_1l7dn1c" targetRef="Event_07uvg80" /> + <bpmn:intermediateThrowEvent id="Event_07uvg80" name="SMS Send"> + <bpmn:incoming>Flow_1snpj0t</bpmn:incoming> + <bpmn:outgoing>Flow_0fl304d</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_0xmvvdk" /> + </bpmn:intermediateThrowEvent> + <bpmn:sequenceFlow id="Flow_0fl304d" sourceRef="Event_07uvg80" targetRef="Gateway_0b21uvv" /> + <bpmn:eventBasedGateway id="Gateway_0b21uvv"> + <bpmn:incoming>Flow_0fl304d</bpmn:incoming> + <bpmn:outgoing>Flow_0j2dm4a</bpmn:outgoing> + <bpmn:outgoing>Flow_1ndnjyd</bpmn:outgoing> + </bpmn:eventBasedGateway> + <bpmn:sequenceFlow id="Flow_0j2dm4a" sourceRef="Gateway_0b21uvv" targetRef="Event_15gd4sd" /> + <bpmn:intermediateCatchEvent id="Event_15gd4sd" name="SMS Receive"> + <bpmn:incoming>Flow_0j2dm4a</bpmn:incoming> + <bpmn:outgoing>Flow_0o0uqqu</bpmn:outgoing> + <bpmn:messageEventDefinition id="MessageEventDefinition_0h3s3fr" /> + </bpmn:intermediateCatchEvent> + <bpmn:sequenceFlow id="Flow_0o0uqqu" sourceRef="Event_15gd4sd" targetRef="Activity_04lnwd9" /> + <bpmn:userTask id="Activity_04lnwd9" name="Prompt Code"> + <bpmn:incoming>Flow_0o0uqqu</bpmn:incoming> + <bpmn:incoming>Flow_0jjx1zt</bpmn:incoming> + <bpmn:outgoing>Flow_0oeaihe</bpmn:outgoing> + </bpmn:userTask> + <bpmn:intermediateCatchEvent id="Event_0ob0fr5" name="Timeout 5min"> + <bpmn:incoming>Flow_1ndnjyd</bpmn:incoming> + <bpmn:outgoing>Flow_16ju5wj</bpmn:outgoing> + <bpmn:timerEventDefinition id="TimerEventDefinition_1oa2gob" /> + </bpmn:intermediateCatchEvent> + <bpmn:sequenceFlow id="Flow_1ndnjyd" sourceRef="Gateway_0b21uvv" targetRef="Event_0ob0fr5" /> + <bpmn:sequenceFlow id="Flow_0oeaihe" sourceRef="Activity_04lnwd9" targetRef="Gateway_19xffd3" /> + <bpmn:serviceTask id="Activity_1op1tik" name="Verify Code"> + <bpmn:incoming>Flow_15yomy2</bpmn:incoming> + <bpmn:outgoing>Flow_0czzelb</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_1nl1ijk" name="Valid?"> + <bpmn:incoming>Flow_0czzelb</bpmn:incoming> + <bpmn:outgoing>Flow_08efccg</bpmn:outgoing> + <bpmn:outgoing>Flow_0jjx1zt</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0czzelb" sourceRef="Activity_1op1tik" targetRef="Gateway_1nl1ijk" /> + <bpmn:sequenceFlow id="Flow_08efccg" name="Yes" sourceRef="Gateway_1nl1ijk" targetRef="Event_0wf7qu7" /> + <bpmn:endEvent id="Event_0wf7qu7" name="Phone Verified"> + <bpmn:incoming>Flow_08efccg</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_12taxa3" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_16ju5wj" sourceRef="Event_0ob0fr5" targetRef="Activity_1l7dn1c" /> + <bpmn:sequenceFlow id="Flow_0jjx1zt" name="No" sourceRef="Gateway_1nl1ijk" targetRef="Activity_04lnwd9" /> + <bpmn:exclusiveGateway id="Gateway_19xffd3"> + <bpmn:incoming>Flow_0oeaihe</bpmn:incoming> + <bpmn:outgoing>Flow_15yomy2</bpmn:outgoing> + <bpmn:outgoing>Flow_0ohwwaf</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_15yomy2" sourceRef="Gateway_19xffd3" targetRef="Activity_1op1tik" /> + <bpmn:sequenceFlow id="Flow_0ohwwaf" sourceRef="Gateway_19xffd3" targetRef="Event_041xodd" /> + <bpmn:sequenceFlow id="Flow_09xggk3" sourceRef="Event_041xodd" targetRef="Activity_1l7dn1c" /> + <bpmn:intermediateCatchEvent id="Event_041xodd" name="Timeout"> + <bpmn:incoming>Flow_0ohwwaf</bpmn:incoming> + <bpmn:outgoing>Flow_09xggk3</bpmn:outgoing> + <bpmn:timerEventDefinition id="TimerEventDefinition_1pwael3" /> + </bpmn:intermediateCatchEvent> + </bpmn:subProcess> + <bpmn:sequenceFlow id="Flow_1m3kg99" sourceRef="Activity_1fk0vjq" targetRef="Event_0tqe66v" /> + <bpmn:endEvent id="Event_0tqe66v" name="Verified"> + <bpmn:incoming>Flow_1m3kg99</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_08gitwv" /> + </bpmn:endEvent> + <bpmn:boundaryEvent id="Event_039arig" attachedToRef="Activity_1p3rlbs"> + <bpmn:outgoing>Flow_1h6bn9w</bpmn:outgoing> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1jgvuf2" /> + </bpmn:boundaryEvent> + <bpmn:boundaryEvent id="Event_0z55xlq" attachedToRef="Activity_1fk0vjq"> + <bpmn:outgoing>Flow_00h4pfl</bpmn:outgoing> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1s41y61" /> + </bpmn:boundaryEvent> + <bpmn:sequenceFlow id="Flow_00h4pfl" sourceRef="Event_0z55xlq" targetRef="Event_0i8fec6" /> + <bpmn:endEvent id="Event_0i8fec6" name="Unverified"> + <bpmn:incoming>Flow_00h4pfl</bpmn:incoming> + <bpmn:incoming>Flow_1h6bn9w</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1yi2555" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_1h6bn9w" sourceRef="Event_039arig" targetRef="Event_0i8fec6" /> + <bpmn:callActivity id="Activity_1fk0vjq" name="Verify ID Card"> + <bpmn:extensionElements> + <zeebe:calledElement propagateAllChildVariables="false" /> + </bpmn:extensionElements> + <bpmn:incoming>Flow_1deqt80</bpmn:incoming> + <bpmn:outgoing>Flow_1m3kg99</bpmn:outgoing> + </bpmn:callActivity> + </bpmn:subProcess> + <bpmn:sequenceFlow id="Flow_0szqqpj" sourceRef="Gateway_125frj1" targetRef="Activity_1t48mzy" /> + <bpmn:exclusiveGateway id="Gateway_0adober" name="All scope verified?"> + <bpmn:incoming>Flow_1il0yc3</bpmn:incoming> + <bpmn:outgoing>Flow_1ou0y2x</bpmn:outgoing> + <bpmn:outgoing>Flow_00oxyqy</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1il0yc3" sourceRef="Activity_1t48mzy" targetRef="Gateway_0adober" /> + <bpmn:sequenceFlow id="Flow_1ou0y2x" name="Yes" sourceRef="Gateway_0adober" targetRef="Activity_1y71cx1" /> + <bpmn:sequenceFlow id="Flow_00oxyqy" name="No" sourceRef="Gateway_0adober" targetRef="Event_1g4p48y" /> + <bpmn:endEvent id="Event_10rxoox" name="Auth Code"> + <bpmn:incoming>Flow_17ezik1</bpmn:incoming> + </bpmn:endEvent> + <bpmn:subProcess id="Activity_15huvzg" name="Consent Check"> + <bpmn:incoming>Flow_0vuyjxm</bpmn:incoming> + <bpmn:outgoing>Flow_0gohdib</bpmn:outgoing> + <bpmn:startEvent id="Event_0dbqwzf"> + <bpmn:outgoing>Flow_0ucnfjy</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:task id="Activity_15jl9q0" name="Verify If not already consent"> + <bpmn:incoming>Flow_0ucnfjy</bpmn:incoming> + <bpmn:outgoing>Flow_1al5ley</bpmn:outgoing> + </bpmn:task> + <bpmn:sequenceFlow id="Flow_0ucnfjy" sourceRef="Event_0dbqwzf" targetRef="Activity_15jl9q0" /> + <bpmn:exclusiveGateway id="Gateway_1q5fjuu" name="Consent?"> + <bpmn:incoming>Flow_1al5ley</bpmn:incoming> + <bpmn:outgoing>Flow_0blg2c5</bpmn:outgoing> + <bpmn:outgoing>Flow_0a0m56u</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1al5ley" sourceRef="Activity_15jl9q0" targetRef="Gateway_1q5fjuu" /> + <bpmn:sequenceFlow id="Flow_0blg2c5" sourceRef="Gateway_1q5fjuu" targetRef="Activity_1p8aqwl" /> + <bpmn:userTask id="Activity_1p8aqwl" name="Ask Consentment"> + <bpmn:incoming>Flow_0blg2c5</bpmn:incoming> + <bpmn:outgoing>Flow_1t8on8l</bpmn:outgoing> + </bpmn:userTask> + <bpmn:exclusiveGateway id="Gateway_1m7hg30" name="Consent?"> + <bpmn:incoming>Flow_1t8on8l</bpmn:incoming> + <bpmn:outgoing>Flow_0r34yr1</bpmn:outgoing> + <bpmn:outgoing>Flow_0rs73m4</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1t8on8l" sourceRef="Activity_1p8aqwl" targetRef="Gateway_1m7hg30" /> + <bpmn:sequenceFlow id="Flow_0r34yr1" name="Yes" sourceRef="Gateway_1m7hg30" targetRef="Event_1vturru" /> + <bpmn:endEvent id="Event_1vturru" name="Consent"> + <bpmn:incoming>Flow_0r34yr1</bpmn:incoming> + <bpmn:incoming>Flow_0a0m56u</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_01azfqd" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_0a0m56u" sourceRef="Gateway_1q5fjuu" targetRef="Event_1vturru" /> + <bpmn:sequenceFlow id="Flow_0rs73m4" sourceRef="Gateway_1m7hg30" targetRef="Event_19zbz9e" /> + <bpmn:endEvent id="Event_19zbz9e" name="Declined"> + <bpmn:incoming>Flow_0rs73m4</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_0e665l6" /> + </bpmn:endEvent> + </bpmn:subProcess> + </bpmn:subProcess> + <bpmn:endEvent id="Event_0kz0gah" name="HTTP Redirect \w error"> + <bpmn:incoming>Flow_04u6p8s</bpmn:incoming> + <bpmn:incoming>Flow_1a2yt37</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1jpnx6r" /> + </bpmn:endEvent> + <bpmn:serviceTask id="Activity_1yejpha" name="Prepare Redirect URI"> + <bpmn:incoming>Flow_1hcjw9j</bpmn:incoming> + <bpmn:outgoing>Flow_1jy7glo</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_1jy7glo" sourceRef="Activity_1yejpha" targetRef="Event_00c2vo7" /> + <bpmn:endEvent id="Event_00c2vo7" name="HTTP Redirect \w code"> + <bpmn:incoming>Flow_1jy7glo</bpmn:incoming> + <bpmn:messageEventDefinition id="MessageEventDefinition_11dyqcf" /> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_04u6p8s" name="No" sourceRef="Gateway_0ymdjps" targetRef="Event_0kz0gah" /> + <bpmn:sequenceFlow id="Flow_1hcjw9j" sourceRef="Activity_17cij2m" targetRef="Activity_1yejpha" /> + <bpmn:boundaryEvent id="Event_0rknk4r" attachedToRef="Activity_17cij2m"> + <bpmn:outgoing>Flow_1a2yt37</bpmn:outgoing> + <bpmn:errorEventDefinition id="ErrorEventDefinition_0ljj31w" /> + </bpmn:boundaryEvent> + <bpmn:sequenceFlow id="Flow_1a2yt37" sourceRef="Event_0rknk4r" targetRef="Event_0kz0gah" /> + </bpmn:subProcess> + <bpmn:subProcess id="Activity_1wu7qa6" name="OAuth Back Channel"> + <bpmn:incoming>Flow_1vg1vv5</bpmn:incoming> + <bpmn:outgoing>Flow_1wudy9s</bpmn:outgoing> + <bpmn:startEvent id="Event_0yvf1fh"> + <bpmn:outgoing>Flow_16jbsqo</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_16jbsqo" sourceRef="Event_0yvf1fh" targetRef="Activity_0t071l1" /> + <bpmn:serviceTask id="Activity_0t071l1" name="Validate Token Request"> + <bpmn:incoming>Flow_16jbsqo</bpmn:incoming> + <bpmn:outgoing>Flow_0hm7v0k</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_0xo4mfj" name="Valid?"> + <bpmn:incoming>Flow_0hm7v0k</bpmn:incoming> + <bpmn:outgoing>Flow_0h3iyke</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0hm7v0k" sourceRef="Activity_0t071l1" targetRef="Gateway_0xo4mfj" /> + <bpmn:sequenceFlow id="Flow_0h3iyke" name="Yes" sourceRef="Gateway_0xo4mfj" targetRef="Activity_0hwc5se" /> + <bpmn:serviceTask id="Activity_0hwc5se" name="Find OAuth Request"> + <bpmn:incoming>Flow_0h3iyke</bpmn:incoming> + <bpmn:outgoing>Flow_13tmwm7</bpmn:outgoing> + <bpmn:dataOutputAssociation id="DataOutputAssociation_1acotul"> + <bpmn:targetRef>DataStoreReference_0547ahl</bpmn:targetRef> + </bpmn:dataOutputAssociation> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_0qzs50p" name="Found?"> + <bpmn:incoming>Flow_13tmwm7</bpmn:incoming> + <bpmn:outgoing>Flow_1g06oca</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_13tmwm7" sourceRef="Activity_0hwc5se" targetRef="Gateway_0qzs50p" /> + <bpmn:sequenceFlow id="Flow_1g06oca" name="Yes" sourceRef="Gateway_0qzs50p" targetRef="Activity_0rj9n61" /> + <bpmn:subProcess id="Activity_0rj9n61" name="Check request Completion"> + <bpmn:incoming>Flow_1g06oca</bpmn:incoming> + <bpmn:outgoing>Flow_0k1ct9s</bpmn:outgoing> + <bpmn:dataOutputAssociation id="DataOutputAssociation_0q1xnj9"> + <bpmn:targetRef>DataStoreReference_0547ahl</bpmn:targetRef> + </bpmn:dataOutputAssociation> + <bpmn:startEvent id="Event_176wvgj"> + <bpmn:outgoing>Flow_1jq68lw</bpmn:outgoing> + </bpmn:startEvent> + <bpmn:sequenceFlow id="Flow_1jq68lw" sourceRef="Event_176wvgj" targetRef="Activity_1qdq8xy" /> + <bpmn:exclusiveGateway id="Gateway_0e3f35k" name="Valid?"> + <bpmn:incoming>Flow_0acljc4</bpmn:incoming> + <bpmn:outgoing>Flow_0uq1wk6</bpmn:outgoing> + <bpmn:outgoing>Flow_140yqto</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0acljc4" sourceRef="Activity_1qdq8xy" targetRef="Gateway_0e3f35k" /> + <bpmn:serviceTask id="Activity_1qdq8xy" name="Check PKCE"> + <bpmn:incoming>Flow_1jq68lw</bpmn:incoming> + <bpmn:outgoing>Flow_0acljc4</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:sequenceFlow id="Flow_0uq1wk6" name="Yes" sourceRef="Gateway_0e3f35k" targetRef="Activity_07b3d3g" /> + <bpmn:serviceTask id="Activity_07b3d3g" name="Check if expired"> + <bpmn:incoming>Flow_0uq1wk6</bpmn:incoming> + <bpmn:outgoing>Flow_0u2cric</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_1xsn9hk" name="Expired?"> + <bpmn:incoming>Flow_0u2cric</bpmn:incoming> + <bpmn:outgoing>Flow_1g2yz9h</bpmn:outgoing> + <bpmn:outgoing>Flow_1gvle0q</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0u2cric" sourceRef="Activity_07b3d3g" targetRef="Gateway_1xsn9hk" /> + <bpmn:sequenceFlow id="Flow_1g2yz9h" name="No" sourceRef="Gateway_1xsn9hk" targetRef="Activity_1jtszc4" /> + <bpmn:serviceTask id="Activity_1jtszc4" name="Check if consumed"> + <bpmn:incoming>Flow_1g2yz9h</bpmn:incoming> + <bpmn:outgoing>Flow_1kvikta</bpmn:outgoing> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_1jjij45" name="Already consumed?"> + <bpmn:incoming>Flow_1kvikta</bpmn:incoming> + <bpmn:outgoing>Flow_0qnu38o</bpmn:outgoing> + <bpmn:outgoing>Flow_0ewfm96</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1kvikta" sourceRef="Activity_1jtszc4" targetRef="Gateway_1jjij45" /> + <bpmn:endEvent id="Event_0sghn1p" name="continue"> + <bpmn:incoming>Flow_0qnu38o</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_0qnu38o" sourceRef="Gateway_1jjij45" targetRef="Event_0sghn1p" /> + <bpmn:sequenceFlow id="Flow_140yqto" name="No" sourceRef="Gateway_0e3f35k" targetRef="Event_0s3gk7s" /> + <bpmn:sequenceFlow id="Flow_1gvle0q" name="Yes" sourceRef="Gateway_1xsn9hk" targetRef="Event_0s3gk7s" /> + <bpmn:sequenceFlow id="Flow_0ewfm96" name="Yes" sourceRef="Gateway_1jjij45" targetRef="Event_0s3gk7s" /> + <bpmn:endEvent id="Event_0s3gk7s" name="stop"> + <bpmn:incoming>Flow_140yqto</bpmn:incoming> + <bpmn:incoming>Flow_1gvle0q</bpmn:incoming> + <bpmn:incoming>Flow_0ewfm96</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1dwv5lv" /> + </bpmn:endEvent> + </bpmn:subProcess> + <bpmn:exclusiveGateway id="Gateway_1vvcpnt" name="Continue?"> + <bpmn:incoming>Flow_0k1ct9s</bpmn:incoming> + <bpmn:outgoing>Flow_0fenf9h</bpmn:outgoing> + <bpmn:outgoing>Flow_1teil2g</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0k1ct9s" sourceRef="Activity_0rj9n61" targetRef="Gateway_1vvcpnt" /> + <bpmn:sequenceFlow id="Flow_0fenf9h" name="Yes" sourceRef="Gateway_1vvcpnt" targetRef="Activity_1iwt1sq" /> + <bpmn:serviceTask id="Activity_1iwt1sq" name="Issue Access Token"> + <bpmn:incoming>Flow_0fenf9h</bpmn:incoming> + <bpmn:outgoing>Flow_0dzqygq</bpmn:outgoing> + <bpmn:dataOutputAssociation id="DataOutputAssociation_0n5fqbv"> + <bpmn:targetRef>DataStoreReference_0547ahl</bpmn:targetRef> + </bpmn:dataOutputAssociation> + </bpmn:serviceTask> + <bpmn:dataStoreReference id="DataStoreReference_0547ahl" name="OAuth Registry" /> + <bpmn:sequenceFlow id="Flow_1teil2g" name="No" sourceRef="Gateway_1vvcpnt" targetRef="Gateway_1kxvj0f" /> + <bpmn:exclusiveGateway id="Gateway_1kxvj0f"> + <bpmn:incoming>Flow_0dzqygq</bpmn:incoming> + <bpmn:incoming>Flow_1teil2g</bpmn:incoming> + <bpmn:outgoing>Flow_0sd3671</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_0dzqygq" sourceRef="Activity_1iwt1sq" targetRef="Gateway_1kxvj0f" /> + <bpmn:sequenceFlow id="Flow_0sd3671" sourceRef="Gateway_1kxvj0f" targetRef="Activity_1rg0439" /> + <bpmn:serviceTask id="Activity_1rg0439" name="Invalidate Request (consume)"> + <bpmn:incoming>Flow_0sd3671</bpmn:incoming> + <bpmn:outgoing>Flow_1ewt6tl</bpmn:outgoing> + <bpmn:dataOutputAssociation id="DataOutputAssociation_1hflb9x"> + <bpmn:targetRef>DataStoreReference_0547ahl</bpmn:targetRef> + </bpmn:dataOutputAssociation> + </bpmn:serviceTask> + <bpmn:exclusiveGateway id="Gateway_1xe2boe" name="Access token issued ?"> + <bpmn:incoming>Flow_1ewt6tl</bpmn:incoming> + <bpmn:outgoing>Flow_02snru6</bpmn:outgoing> + <bpmn:outgoing>Flow_17rqf1s</bpmn:outgoing> + </bpmn:exclusiveGateway> + <bpmn:sequenceFlow id="Flow_1ewt6tl" sourceRef="Activity_1rg0439" targetRef="Gateway_1xe2boe" /> + <bpmn:endEvent id="Event_0cpv0ha" name="Access Token"> + <bpmn:incoming>Flow_02snru6</bpmn:incoming> + </bpmn:endEvent> + <bpmn:sequenceFlow id="Flow_02snru6" sourceRef="Gateway_1xe2boe" targetRef="Event_0cpv0ha" /> + <bpmn:sequenceFlow id="Flow_17rqf1s" sourceRef="Gateway_1xe2boe" targetRef="Event_1pvnuw0" /> + <bpmn:endEvent id="Event_1pvnuw0"> + <bpmn:incoming>Flow_17rqf1s</bpmn:incoming> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1km2dzg" /> + </bpmn:endEvent> + </bpmn:subProcess> + <bpmn:subProcess id="Activity_0gg905v" name="Check KYC"> + <bpmn:incoming>Flow_1wudy9s</bpmn:incoming> + <bpmn:outgoing>Flow_1wkzy7u</bpmn:outgoing> + </bpmn:subProcess> + <bpmn:boundaryEvent id="Event_0ysi3ui" attachedToRef="Activity_0kto1mg"> + <bpmn:outgoing>Flow_0lk8psr</bpmn:outgoing> + <bpmn:errorEventDefinition id="ErrorEventDefinition_0j920s0" /> + </bpmn:boundaryEvent> + <bpmn:boundaryEvent id="Event_11b0hh3" attachedToRef="Activity_1wu7qa6"> + <bpmn:outgoing>Flow_00m8c3m</bpmn:outgoing> + <bpmn:errorEventDefinition id="ErrorEventDefinition_1qv2x90" /> + </bpmn:boundaryEvent> + <bpmn:endEvent id="Event_09tcsyw"> + <bpmn:incoming>Flow_1j4t1fh</bpmn:incoming> + <bpmn:incoming>Flow_1ds8qgw</bpmn:incoming> + <bpmn:incoming>Flow_00m8c3m</bpmn:incoming> + <bpmn:incoming>Flow_0lk8psr</bpmn:incoming> + <bpmn:terminateEventDefinition id="TerminateEventDefinition_02nf9od" /> + </bpmn:endEvent> + <bpmn:textAnnotation id="TextAnnotation_0vi3gci"> + <bpmn:text>OAuth2.1 Auth Code Flow With PKCE</bpmn:text> + </bpmn:textAnnotation> + </bpmn:process> + <bpmndi:BPMNDiagram id="BPMNDiagram_1"> + <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Collaboration_1oj2zj1"> + <bpmndi:BPMNShape id="Participant_0a7y36t_di" bpmnElement="Participant_0a7y36t" isHorizontal="true"> + <dc:Bounds x="160" y="80" width="1878" height="350" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Lane_1249v6j_di" bpmnElement="Lane_1249v6j" isHorizontal="true"> + <dc:Bounds x="190" y="305" width="1848" height="125" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Lane_147imgz_di" bpmnElement="Lane_147imgz" isHorizontal="true"> + <dc:Bounds x="190" y="80" width="1848" height="225" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0a4tk0g_di" bpmnElement="Event_0a4tk0g"> + <dc:Bounds x="242" y="222" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0xqr9ys_di" bpmnElement="Activity_0pet7qa"> + <dc:Bounds x="330" y="200" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0f6nay1_di" bpmnElement="Activity_08kelwy"> + <dc:Bounds x="490" y="200" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_06o5rd8_di" bpmnElement="Gateway_06o5rd8" isMarkerVisible="true"> + <dc:Bounds x="655" y="215" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="635" y="275" width="89" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1fz2cna_di" bpmnElement="Activity_00vx0tn"> + <dc:Bounds x="1120" y="200" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1f80x1z_di" bpmnElement="Gateway_1f80x1z" isMarkerVisible="true"> + <dc:Bounds x="1615" y="215" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1608" y="275" width="63" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1wha5i6_di" bpmnElement="Activity_1npb8xw"> + <dc:Bounds x="1730" y="200" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0p387kf_di" bpmnElement="Event_0p387kf"> + <dc:Bounds x="1902" y="222" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0voo8e6_di" bpmnElement="Event_09tcsyw"> + <dc:Bounds x="1902" y="112" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_14imynx_di" bpmnElement="Activity_0nshow5"> + <dc:Bounds x="780" y="200" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0hl35us_di" bpmnElement="Activity_0kto1mg"> + <dc:Bounds x="950" y="330" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_10zrlzw_di" bpmnElement="Activity_1wu7qa6"> + <dc:Bounds x="1290" y="200" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_06zq9mh_di" bpmnElement="Activity_0gg905v"> + <dc:Bounds x="1450" y="200" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="TextAnnotation_0vi3gci_di" bpmnElement="TextAnnotation_0vi3gci"> + <dc:Bounds x="1450" y="350" width="100" height="55" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0llf3r9_di" bpmnElement="Event_11b0hh3"> + <dc:Bounds x="1332" y="182" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_11zd2a1_di" bpmnElement="Event_0ysi3ui"> + <dc:Bounds x="1012" y="312" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_0hgmx63_di" bpmnElement="Flow_0hgmx63"> + <di:waypoint x="278" y="240" /> + <di:waypoint x="330" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_09moq56_di" bpmnElement="Flow_09moq56"> + <di:waypoint x="430" y="240" /> + <di:waypoint x="490" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_17tzkt0_di" bpmnElement="Flow_17tzkt0"> + <di:waypoint x="590" y="240" /> + <di:waypoint x="655" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_12389zf_di" bpmnElement="Flow_12389zf"> + <di:waypoint x="705" y="240" /> + <di:waypoint x="780" y="240" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="734" y="222" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1j4t1fh_di" bpmnElement="Flow_1j4t1fh"> + <di:waypoint x="680" y="215" /> + <di:waypoint x="680" y="130" /> + <di:waypoint x="1902" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0gnvwnu_di" bpmnElement="Flow_0gnvwnu"> + <di:waypoint x="1050" y="370" /> + <di:waypoint x="1085" y="370" /> + <di:waypoint x="1085" y="240" /> + <di:waypoint x="1120" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1vg1vv5_di" bpmnElement="Flow_1vg1vv5"> + <di:waypoint x="1220" y="240" /> + <di:waypoint x="1290" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1wkzy7u_di" bpmnElement="Flow_1wkzy7u"> + <di:waypoint x="1550" y="240" /> + <di:waypoint x="1615" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1e07wzn_di" bpmnElement="Flow_1e07wzn"> + <di:waypoint x="1665" y="240" /> + <di:waypoint x="1730" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ds8qgw_di" bpmnElement="Flow_1ds8qgw"> + <di:waypoint x="1640" y="215" /> + <di:waypoint x="1640" y="130" /> + <di:waypoint x="1902" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1neo3ds_di" bpmnElement="Flow_1neo3ds"> + <di:waypoint x="1830" y="240" /> + <di:waypoint x="1902" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_00m8c3m_di" bpmnElement="Flow_00m8c3m"> + <di:waypoint x="1350" y="182" /> + <di:waypoint x="1350" y="130" /> + <di:waypoint x="1902" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0lk8psr_di" bpmnElement="Flow_0lk8psr"> + <di:waypoint x="1030" y="312" /> + <di:waypoint x="1030" y="130" /> + <di:waypoint x="1902" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_07qsy83_di" bpmnElement="Flow_07qsy83"> + <di:waypoint x="880" y="240" /> + <di:waypoint x="915" y="240" /> + <di:waypoint x="915" y="370" /> + <di:waypoint x="950" y="370" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1wudy9s_di" bpmnElement="Flow_1wudy9s"> + <di:waypoint x="1390" y="240" /> + <di:waypoint x="1450" y="240" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNShape id="Group_1qjzvh5_di" bpmnElement="Group_1qjzvh5" bioc:stroke="#0d4372" bioc:fill="#bbdefb" color:background-color="#bbdefb" color:border-color="#0d4372"> + <dc:Bounds x="760" y="160" width="650" height="300" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Association_12jvq7f_di" bpmnElement="Association_12jvq7f"> + <di:waypoint x="1410" y="352" /> + <di:waypoint x="1450" y="358" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_1yt5lkk"> + <bpmndi:BPMNPlane id="BPMNPlane_0j43opa" bpmnElement="Activity_0nshow5"> + <bpmndi:BPMNShape id="Event_1lhllip_di" bpmnElement="Event_1lhllip"> + <dc:Bounds x="192" y="102" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0prlmdu_di" bpmnElement="Activity_0xyz10m"> + <dc:Bounds x="280" y="80" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_08zfjqz_di" bpmnElement="Activity_15qtcnh"> + <dc:Bounds x="440" y="80" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_14o8lfo_di" bpmnElement="Activity_0jk8n2w"> + <dc:Bounds x="600" y="80" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_06rhbm2_di" bpmnElement="Event_0iwxp63"> + <dc:Bounds x="762" y="102" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="738" y="150" width="84" height="40" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_044noki_di" bpmnElement="Flow_044noki"> + <di:waypoint x="228" y="120" /> + <di:waypoint x="280" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1djw0g4_di" bpmnElement="Flow_1djw0g4"> + <di:waypoint x="380" y="120" /> + <di:waypoint x="440" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1izs0rz_di" bpmnElement="Flow_1izs0rz"> + <di:waypoint x="540" y="120" /> + <di:waypoint x="600" y="120" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_06wndv7_di" bpmnElement="Flow_06wndv7"> + <di:waypoint x="700" y="120" /> + <di:waypoint x="762" y="120" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_12mhe2v"> + <bpmndi:BPMNPlane id="BPMNPlane_0whhs15" bpmnElement="Activity_0kto1mg" label="[object Object]"> + <bpmndi:BPMNShape id="Event_0zmoo0b_di" bpmnElement="Event_1q3dk9v"> + <dc:Bounds x="152" y="112" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_17evscf_di" bpmnElement="Activity_02hrlpt"> + <dc:Bounds x="240" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0ymdjps_di" bpmnElement="Gateway_0ymdjps" isMarkerVisible="true"> + <dc:Bounds x="395" y="105" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="405" y="83" width="30" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1kger88_di" bpmnElement="Event_0kz0gah"> + <dc:Bounds x="942" y="212" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="917" y="255" width="87" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0cvetcp_di" bpmnElement="Activity_1yejpha"> + <dc:Bounds x="750" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1key20k_di" bpmnElement="Event_00c2vo7"> + <dc:Bounds x="942" y="112" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="917" y="155" width="87" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1lbrou7_di" bpmnElement="Activity_17cij2m"> + <dc:Bounds x="550" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_18wi758_di" bpmnElement="Event_0rknk4r"> + <dc:Bounds x="632" y="132" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_0bkanj8_di" bpmnElement="Flow_0bkanj8"> + <di:waypoint x="188" y="130" /> + <di:waypoint x="240" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ugycya_di" bpmnElement="Flow_1ugycya"> + <di:waypoint x="340" y="130" /> + <di:waypoint x="395" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0wxi5e5_di" bpmnElement="Flow_0wxi5e5"> + <di:waypoint x="445" y="130" /> + <di:waypoint x="550" y="130" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="489" y="112" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1jy7glo_di" bpmnElement="Flow_1jy7glo"> + <di:waypoint x="850" y="130" /> + <di:waypoint x="942" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_04u6p8s_di" bpmnElement="Flow_04u6p8s"> + <di:waypoint x="420" y="155" /> + <di:waypoint x="420" y="230" /> + <di:waypoint x="942" y="230" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="428" y="190" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1hcjw9j_di" bpmnElement="Flow_1hcjw9j"> + <di:waypoint x="650" y="130" /> + <di:waypoint x="750" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1a2yt37_di" bpmnElement="Flow_1a2yt37"> + <di:waypoint x="650" y="168" /> + <di:waypoint x="650" y="230" /> + <di:waypoint x="942" y="230" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_0yyvjx6"> + <bpmndi:BPMNPlane id="BPMNPlane_1rt1sbl" bpmnElement="Activity_1wu7qa6" label="[object Object]"> + <bpmndi:BPMNShape id="Event_0yvf1fh_di" bpmnElement="Event_0yvf1fh"> + <dc:Bounds x="152" y="312" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0382sxu_di" bpmnElement="Activity_0t071l1"> + <dc:Bounds x="240" y="290" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0xo4mfj_di" bpmnElement="Gateway_0xo4mfj" isMarkerVisible="true"> + <dc:Bounds x="395" y="305" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="405" y="283" width="30" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0q5xhzv_di" bpmnElement="Activity_0hwc5se"> + <dc:Bounds x="510" y="290" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0qzs50p_di" bpmnElement="Gateway_0qzs50p" isMarkerVisible="true"> + <dc:Bounds x="675" y="305" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="681" y="283" width="38" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1nuhdtd_di" bpmnElement="Activity_0rj9n61"> + <dc:Bounds x="800" y="290" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1vvcpnt_di" bpmnElement="Gateway_1vvcpnt" isMarkerVisible="true"> + <dc:Bounds x="975" y="305" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="975" y="273" width="51" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0wzo94r_di" bpmnElement="Activity_1iwt1sq"> + <dc:Bounds x="1110" y="290" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="DataStoreReference_0547ahl_di" bpmnElement="DataStoreReference_0547ahl"> + <dc:Bounds x="825" y="115" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="813" y="85" width="75" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1kxvj0f_di" bpmnElement="Gateway_1kxvj0f" isMarkerVisible="true"> + <dc:Bounds x="1295" y="305" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_13wv0cn_di" bpmnElement="Activity_1rg0439"> + <dc:Bounds x="1430" y="290" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1xe2boe_di" bpmnElement="Gateway_1xe2boe" isMarkerVisible="true"> + <dc:Bounds x="1615" y="305" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1607" y="266" width="66" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0cpv0ha_di" bpmnElement="Event_0cpv0ha"> + <dc:Bounds x="1752" y="312" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1736" y="355" width="68" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0a5yn7a_di" bpmnElement="Event_1pvnuw0"> + <dc:Bounds x="1752" y="422" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_16jbsqo_di" bpmnElement="Flow_16jbsqo"> + <di:waypoint x="188" y="330" /> + <di:waypoint x="240" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0hm7v0k_di" bpmnElement="Flow_0hm7v0k"> + <di:waypoint x="340" y="330" /> + <di:waypoint x="395" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0h3iyke_di" bpmnElement="Flow_0h3iyke"> + <di:waypoint x="445" y="330" /> + <di:waypoint x="510" y="330" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="469" y="312" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataOutputAssociation_1acotul_di" bpmnElement="DataOutputAssociation_1acotul"> + <di:waypoint x="609" y="297" /> + <di:waypoint x="825" y="153" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_13tmwm7_di" bpmnElement="Flow_13tmwm7"> + <di:waypoint x="610" y="330" /> + <di:waypoint x="675" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1g06oca_di" bpmnElement="Flow_1g06oca"> + <di:waypoint x="725" y="330" /> + <di:waypoint x="800" y="330" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="754" y="312" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataOutputAssociation_0q1xnj9_di" bpmnElement="DataOutputAssociation_0q1xnj9"> + <di:waypoint x="850" y="290" /> + <di:waypoint x="850" y="165" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0k1ct9s_di" bpmnElement="Flow_0k1ct9s"> + <di:waypoint x="900" y="330" /> + <di:waypoint x="975" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0fenf9h_di" bpmnElement="Flow_0fenf9h"> + <di:waypoint x="1025" y="330" /> + <di:waypoint x="1110" y="330" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1059" y="312" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataOutputAssociation_0n5fqbv_di" bpmnElement="DataOutputAssociation_0n5fqbv"> + <di:waypoint x="1110" y="300" /> + <di:waypoint x="875" y="157" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1teil2g_di" bpmnElement="Flow_1teil2g"> + <di:waypoint x="1000" y="355" /> + <di:waypoint x="1000" y="430" /> + <di:waypoint x="1320" y="430" /> + <di:waypoint x="1320" y="355" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1012" y="383" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0dzqygq_di" bpmnElement="Flow_0dzqygq"> + <di:waypoint x="1210" y="330" /> + <di:waypoint x="1295" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0sd3671_di" bpmnElement="Flow_0sd3671"> + <di:waypoint x="1345" y="330" /> + <di:waypoint x="1430" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataOutputAssociation_1hflb9x_di" bpmnElement="DataOutputAssociation_1hflb9x"> + <di:waypoint x="1430" y="315" /> + <di:waypoint x="875" y="148" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ewt6tl_di" bpmnElement="Flow_1ewt6tl"> + <di:waypoint x="1530" y="330" /> + <di:waypoint x="1615" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_02snru6_di" bpmnElement="Flow_02snru6"> + <di:waypoint x="1665" y="330" /> + <di:waypoint x="1752" y="330" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_17rqf1s_di" bpmnElement="Flow_17rqf1s"> + <di:waypoint x="1640" y="355" /> + <di:waypoint x="1640" y="440" /> + <di:waypoint x="1752" y="440" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_1te3i44"> + <bpmndi:BPMNPlane id="BPMNPlane_088isd8" bpmnElement="Activity_0gg905v" /> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_0n1165z"> + <bpmndi:BPMNPlane id="BPMNPlane_0h4uyea" bpmnElement="Activity_17cij2m" label="[object Object]"> + <bpmndi:BPMNShape id="Event_0twcw9y_di" bpmnElement="Event_0twcw9y"> + <dc:Bounds x="152" y="192" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_05c0zgn_di" bpmnElement="Activity_0huncl0"> + <dc:Bounds x="500" y="170" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1j4d4xy_di" bpmnElement="Gateway_1j4d4xy" isMarkerVisible="true"> + <dc:Bounds x="655" y="185" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="643" y="163" width="74" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0nndzmg_di" bpmnElement="Gateway_0nndzmg" isMarkerVisible="true"> + <dc:Bounds x="395" y="185" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="403" y="242" width="35" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_09amsjf_di" bpmnElement="Activity_09amsjf"> + <dc:Bounds x="240" y="170" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="DataStoreReference_1q3tws7_di" bpmnElement="DataStoreReference_1q3tws7"> + <dc:Bounds x="525" y="325" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="516" y="385" width="67" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1dbe65g_di" bpmnElement="Gateway_1dbe65g" isMarkerVisible="true"> + <dc:Bounds x="895" y="185" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1dcujvu_di" bpmnElement="Activity_1y71cx1"> + <dc:Bounds x="1510" y="170" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_00gx9x4_di" bpmnElement="Activity_0f1svfw"> + <dc:Bounds x="1670" y="170" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_10rxoox_di" bpmnElement="Event_10rxoox"> + <dc:Bounds x="1832" y="192" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1824" y="235" width="52" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_17cm8lz_di" bpmnElement="Event_1g4p48y"> + <dc:Bounds x="1832" y="82" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_125frj1_di" bpmnElement="Gateway_125frj1" isMarkerVisible="true"> + <dc:Bounds x="1145" y="185" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1146" y="245" width="48" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0adober_di" bpmnElement="Gateway_0adober" isMarkerVisible="true"> + <dc:Bounds x="1395" y="185" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1375" y="242" width="90" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0ftnpso_di" bpmnElement="Activity_1lumdha"> + <dc:Bounds x="750" y="280" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0mpiels_di" bpmnElement="Activity_1t48mzy"> + <dc:Bounds x="1240" y="170" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1mkvzd5_di" bpmnElement="Activity_15huvzg"> + <dc:Bounds x="1000" y="170" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_048twhv_di" bpmnElement="Event_0bwsrc6"> + <dc:Bounds x="832" y="302" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_1kodcnw_di" bpmnElement="Flow_1kodcnw"> + <di:waypoint x="188" y="210" /> + <di:waypoint x="240" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_14evrco_di" bpmnElement="Flow_14evrco"> + <di:waypoint x="600" y="210" /> + <di:waypoint x="655" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataOutputAssociation_19b2mch_di" bpmnElement="DataOutputAssociation_19b2mch"> + <di:waypoint x="550" y="250" /> + <di:waypoint x="550" y="325" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1azzwv3_di" bpmnElement="Flow_1azzwv3"> + <di:waypoint x="705" y="210" /> + <di:waypoint x="895" y="210" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="791" y="192" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1v0kmvi_di" bpmnElement="Flow_1v0kmvi"> + <di:waypoint x="680" y="235" /> + <di:waypoint x="680" y="320" /> + <di:waypoint x="750" y="320" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0vuyjxm_di" bpmnElement="Flow_0vuyjxm"> + <di:waypoint x="945" y="210" /> + <di:waypoint x="1000" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1xx4532_di" bpmnElement="Flow_1xx4532"> + <di:waypoint x="1610" y="210" /> + <di:waypoint x="1670" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_17ezik1_di" bpmnElement="Flow_17ezik1"> + <di:waypoint x="1770" y="210" /> + <di:waypoint x="1832" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_08r5cic_di" bpmnElement="Flow_08r5cic"> + <di:waypoint x="1170" y="185" /> + <di:waypoint x="1170" y="100" /> + <di:waypoint x="1832" y="100" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1178" y="133" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_00n25at_di" bpmnElement="Flow_00n25at"> + <di:waypoint x="445" y="210" /> + <di:waypoint x="500" y="210" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="465" y="192" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1v0qy3b_di" bpmnElement="Flow_1v0qy3b"> + <di:waypoint x="340" y="210" /> + <di:waypoint x="395" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1aruwtj_di" bpmnElement="Flow_1aruwtj"> + <di:waypoint x="420" y="185" /> + <di:waypoint x="420" y="100" /> + <di:waypoint x="1832" y="100" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="426" y="133" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1t5q2d1_di" bpmnElement="Flow_1t5q2d1"> + <di:waypoint x="868" y="320" /> + <di:waypoint x="920" y="320" /> + <di:waypoint x="920" y="235" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0gohdib_di" bpmnElement="Flow_0gohdib"> + <di:waypoint x="1100" y="210" /> + <di:waypoint x="1145" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0szqqpj_di" bpmnElement="Flow_0szqqpj"> + <di:waypoint x="1195" y="210" /> + <di:waypoint x="1240" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1il0yc3_di" bpmnElement="Flow_1il0yc3"> + <di:waypoint x="1340" y="210" /> + <di:waypoint x="1395" y="210" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ou0y2x_di" bpmnElement="Flow_1ou0y2x"> + <di:waypoint x="1445" y="210" /> + <di:waypoint x="1510" y="210" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1469" y="192" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_00oxyqy_di" bpmnElement="Flow_00oxyqy"> + <di:waypoint x="1420" y="185" /> + <di:waypoint x="1420" y="100" /> + <di:waypoint x="1832" y="100" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1428" y="140" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_028ajjv"> + <bpmndi:BPMNPlane id="BPMNPlane_0f2vjes" bpmnElement="Activity_0rj9n61"> + <bpmndi:BPMNShape id="Event_176wvgj_di" bpmnElement="Event_176wvgj"> + <dc:Bounds x="-388" y="242" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0e3f35k_di" bpmnElement="Gateway_0e3f35k" isMarkerVisible="true"> + <dc:Bounds x="-145" y="235" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="-135" y="213" width="30" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_04138uh_di" bpmnElement="Activity_1qdq8xy"> + <dc:Bounds x="-300" y="220" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0pwnuv0_di" bpmnElement="Activity_07b3d3g"> + <dc:Bounds x="-40" y="220" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1xsn9hk_di" bpmnElement="Gateway_1xsn9hk" isMarkerVisible="true"> + <dc:Bounds x="115" y="235" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="118" y="213" width="44" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_14zck56_di" bpmnElement="Activity_1jtszc4"> + <dc:Bounds x="220" y="220" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1jjij45_di" bpmnElement="Gateway_1jjij45" isMarkerVisible="true"> + <dc:Bounds x="375" y="235" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="371" y="196" width="57" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0sghn1p_di" bpmnElement="Event_0sghn1p"> + <dc:Bounds x="482" y="242" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="479" y="285" width="42" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_06ebhoe_di" bpmnElement="Event_0s3gk7s"> + <dc:Bounds x="482" y="342" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="490" y="385" width="21" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_1jq68lw_di" bpmnElement="Flow_1jq68lw"> + <di:waypoint x="-352" y="260" /> + <di:waypoint x="-300" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0acljc4_di" bpmnElement="Flow_0acljc4"> + <di:waypoint x="-200" y="260" /> + <di:waypoint x="-145" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0uq1wk6_di" bpmnElement="Flow_0uq1wk6"> + <di:waypoint x="-95" y="260" /> + <di:waypoint x="-40" y="260" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="-76" y="242" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0u2cric_di" bpmnElement="Flow_0u2cric"> + <di:waypoint x="60" y="260" /> + <di:waypoint x="115" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1g2yz9h_di" bpmnElement="Flow_1g2yz9h"> + <di:waypoint x="165" y="260" /> + <di:waypoint x="220" y="260" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="185" y="242" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1kvikta_di" bpmnElement="Flow_1kvikta"> + <di:waypoint x="320" y="260" /> + <di:waypoint x="375" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0qnu38o_di" bpmnElement="Flow_0qnu38o"> + <di:waypoint x="425" y="260" /> + <di:waypoint x="482" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_140yqto_di" bpmnElement="Flow_140yqto"> + <di:waypoint x="-120" y="285" /> + <di:waypoint x="-120" y="360" /> + <di:waypoint x="482" y="360" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="-112" y="303" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1gvle0q_di" bpmnElement="Flow_1gvle0q"> + <di:waypoint x="140" y="285" /> + <di:waypoint x="140" y="360" /> + <di:waypoint x="482" y="360" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="146" y="303" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0ewfm96_di" bpmnElement="Flow_0ewfm96"> + <di:waypoint x="400" y="285" /> + <di:waypoint x="400" y="360" /> + <di:waypoint x="482" y="360" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="407" y="303" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_0dkl5sj"> + <bpmndi:BPMNPlane id="BPMNPlane_0bzitlf" bpmnElement="Activity_1lumdha" label="[object Object]"> + <bpmndi:BPMNShape id="Event_0fibab5_di" bpmnElement="Event_0fibab5"> + <dc:Bounds x="152" y="112" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0a53e7b_di" bpmnElement="Activity_0ng08x2"> + <dc:Bounds x="240" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1akprvw_di" bpmnElement="Activity_1nf6nns"> + <dc:Bounds x="400" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0is38ku_di" bpmnElement="Gateway_0is38ku" isMarkerVisible="true"> + <dc:Bounds x="565" y="105" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="571" y="83" width="38" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_14wv7lo_di" bpmnElement="Gateway_14wv7lo" isMarkerVisible="true"> + <dc:Bounds x="795" y="105" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_19lnplw_di" bpmnElement="Event_03eoc9g"> + <dc:Bounds x="1062" y="112" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1061" y="88" width="37" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="DataStoreReference_1dazcw0_di" bpmnElement="DataStoreReference_1dazcw0"> + <dc:Bounds x="1055" y="265" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1047" y="322" width="67" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0q589qu_di" bpmnElement="Activity_0vfbxjb"> + <dc:Bounds x="660" y="200" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1ljh3i1_di" bpmnElement="Activity_16cukyb"> + <dc:Bounds x="900" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_051f8xc_di" bpmnElement="Flow_051f8xc"> + <di:waypoint x="188" y="130" /> + <di:waypoint x="240" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0j3d845_di" bpmnElement="Flow_0j3d845"> + <di:waypoint x="340" y="130" /> + <di:waypoint x="400" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1yr0ecm_di" bpmnElement="Flow_1yr0ecm"> + <di:waypoint x="500" y="130" /> + <di:waypoint x="565" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0y8yhx3_di" bpmnElement="Flow_0y8yhx3"> + <di:waypoint x="615" y="130" /> + <di:waypoint x="795" y="130" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="649" y="112" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1w4j4tr_di" bpmnElement="Flow_1w4j4tr"> + <di:waypoint x="590" y="155" /> + <di:waypoint x="590" y="240" /> + <di:waypoint x="660" y="240" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="598" y="173" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_100hxiz_di" bpmnElement="Flow_100hxiz"> + <di:waypoint x="760" y="240" /> + <di:waypoint x="820" y="240" /> + <di:waypoint x="820" y="155" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_121xvas_di" bpmnElement="Flow_121xvas"> + <di:waypoint x="845" y="130" /> + <di:waypoint x="900" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0xo6jrg_di" bpmnElement="Flow_0xo6jrg"> + <di:waypoint x="1000" y="130" /> + <di:waypoint x="1062" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataInputAssociation_1axcoun_di" bpmnElement="DataInputAssociation_1axcoun"> + <di:waypoint x="1080" y="265" /> + <di:waypoint x="1080" y="148" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_10uw71t"> + <bpmndi:BPMNPlane id="BPMNPlane_1eedl8e" bpmnElement="Activity_16cukyb" label="[object Object]"> + <bpmndi:BPMNShape id="Event_1ab8ehw_di" bpmnElement="Event_1ab8ehw"> + <dc:Bounds x="152" y="112" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0fdetbg_di" bpmnElement="Activity_15sltjm"> + <dc:Bounds x="240" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0jpouzz_di" bpmnElement="Event_0qs1lli"> + <dc:Bounds x="392" y="112" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="385" y="155" width="51" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_05asblp_di" bpmnElement="Activity_1go6kqq"> + <dc:Bounds x="480" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0xlxqfr_di" bpmnElement="Activity_0vsewf0"> + <dc:Bounds x="640" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_03ruqgf_di" bpmnElement="Gateway_03ruqgf" isMarkerVisible="true"> + <dc:Bounds x="805" y="105" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="811" y="83" width="37" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0rhcah2_di" bpmnElement="Activity_0swvwe2"> + <dc:Bounds x="910" y="210" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1e7e4kf_di" bpmnElement="Event_16ffdl6"> + <dc:Bounds x="1072" y="232" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1065" y="275" width="51" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0zm2wlj_di" bpmnElement="Event_0uiu28g"> + <dc:Bounds x="1072" y="112" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1057" y="155" width="68" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="DataStoreReference_0zf827n_di" bpmnElement="DataStoreReference_0zf827n"> + <dc:Bounds x="365" y="285" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="352" y="342" width="76" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_0dtmupl_di" bpmnElement="Flow_0dtmupl"> + <di:waypoint x="188" y="130" /> + <di:waypoint x="240" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_187j741_di" bpmnElement="Flow_187j741"> + <di:waypoint x="340" y="130" /> + <di:waypoint x="392" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0u4i98t_di" bpmnElement="Flow_0u4i98t"> + <di:waypoint x="428" y="130" /> + <di:waypoint x="480" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0wk2vi6_di" bpmnElement="Flow_0wk2vi6"> + <di:waypoint x="580" y="130" /> + <di:waypoint x="640" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0jrxgl4_di" bpmnElement="Flow_0jrxgl4"> + <di:waypoint x="740" y="130" /> + <di:waypoint x="805" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0fjtz1a_di" bpmnElement="Flow_0fjtz1a"> + <di:waypoint x="855" y="130" /> + <di:waypoint x="1072" y="130" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="956" y="112" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0717nwp_di" bpmnElement="Flow_0717nwp"> + <di:waypoint x="830" y="155" /> + <di:waypoint x="830" y="250" /> + <di:waypoint x="910" y="250" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_030vfui_di" bpmnElement="Flow_030vfui"> + <di:waypoint x="1010" y="250" /> + <di:waypoint x="1072" y="250" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataInputAssociation_1jmkied_di" bpmnElement="DataInputAssociation_1jmkied"> + <di:waypoint x="373" y="285" /> + <di:waypoint x="297" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="DataInputAssociation_0v62v65_di" bpmnElement="DataInputAssociation_0v62v65"> + <di:waypoint x="415" y="308" /> + <di:waypoint x="910" y="271" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_1hd7kzk"> + <bpmndi:BPMNPlane id="BPMNPlane_0lckbby" bpmnElement="Activity_0vfbxjb" label="[object Object]"> + <bpmndi:BPMNShape id="Event_1yshq5i_di" bpmnElement="Event_1yshq5i"> + <dc:Bounds x="152" y="112" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1xpaamz_di" bpmnElement="Activity_0g8r8cs"> + <dc:Bounds x="240" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0e2n6fe_di" bpmnElement="Activity_01hwvjz"> + <dc:Bounds x="400" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_096emro_di" bpmnElement="Gateway_096emro" isMarkerVisible="true"> + <dc:Bounds x="565" y="105" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="545" y="83" width="89" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1thcxvi_di" bpmnElement="Event_0050zdz"> + <dc:Bounds x="422" y="232" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="407" y="275" width="67" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0vw5aa5_di" bpmnElement="Activity_0slbnv5"> + <dc:Bounds x="680" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1d8qf7b_di" bpmnElement="Activity_1d8qf7b"> + <dc:Bounds x="850" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_15yxov3_di" bpmnElement="Gateway_15yxov3" isMarkerVisible="true"> + <dc:Bounds x="1025" y="105" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1031" y="83" width="37" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1nnw9kw_di" bpmnElement="Event_02fl86a"> + <dc:Bounds x="882" y="232" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="876" y="275" width="49" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0iasf31_di" bpmnElement="Activity_1imcwjz"> + <dc:Bounds x="1130" y="90" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_15t2mkf_di" bpmnElement="Event_0mp8x6q"> + <dc:Bounds x="1292" y="112" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1279" y="155" width="63" height="27" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0lw9yea_di" bpmnElement="Activity_19rj33z"> + <dc:Bounds x="1390" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_086jn8b_di" bpmnElement="Activity_1patror"> + <dc:Bounds x="1560" y="90" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0w3wm4j_di" bpmnElement="Gateway_0w3wm4j" isMarkerVisible="true"> + <dc:Bounds x="1735" y="105" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1737" y="83" width="46" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0d81t2k_di" bpmnElement="Event_0xfjgpy"> + <dc:Bounds x="1862" y="112" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1854" y="155" width="54" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_1r7a1ke_di" bpmnElement="Flow_1r7a1ke"> + <di:waypoint x="188" y="130" /> + <di:waypoint x="240" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1j2fpks_di" bpmnElement="Flow_1j2fpks"> + <di:waypoint x="422" y="250" /> + <di:waypoint x="290" y="250" /> + <di:waypoint x="290" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1n3uaow_di" bpmnElement="Flow_1n3uaow"> + <di:waypoint x="340" y="130" /> + <di:waypoint x="400" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_048zyk3_di" bpmnElement="Flow_048zyk3"> + <di:waypoint x="500" y="130" /> + <di:waypoint x="565" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_05nhbqn_di" bpmnElement="Flow_05nhbqn"> + <di:waypoint x="590" y="155" /> + <di:waypoint x="590" y="250" /> + <di:waypoint x="458" y="250" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="602" y="163" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1h137d9_di" bpmnElement="Flow_1h137d9"> + <di:waypoint x="615" y="130" /> + <di:waypoint x="680" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_10ivlzh_di" bpmnElement="Flow_10ivlzh"> + <di:waypoint x="882" y="250" /> + <di:waypoint x="730" y="250" /> + <di:waypoint x="730" y="170" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_05vw7yw_di" bpmnElement="Flow_05vw7yw"> + <di:waypoint x="780" y="130" /> + <di:waypoint x="850" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0h0f923_di" bpmnElement="Flow_0h0f923"> + <di:waypoint x="950" y="130" /> + <di:waypoint x="1025" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1xnv48h_di" bpmnElement="Flow_1xnv48h"> + <di:waypoint x="1050" y="155" /> + <di:waypoint x="1050" y="250" /> + <di:waypoint x="918" y="250" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1062" y="163" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_15q8ius_di" bpmnElement="Flow_15q8ius"> + <di:waypoint x="1075" y="130" /> + <di:waypoint x="1130" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ydzzt7_di" bpmnElement="Flow_1ydzzt7"> + <di:waypoint x="1230" y="130" /> + <di:waypoint x="1292" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1vuifsd_di" bpmnElement="Flow_1vuifsd"> + <di:waypoint x="1328" y="130" /> + <di:waypoint x="1390" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0igkyux_di" bpmnElement="Flow_0igkyux"> + <di:waypoint x="1490" y="130" /> + <di:waypoint x="1560" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1h8eq73_di" bpmnElement="Flow_1h8eq73"> + <di:waypoint x="1660" y="130" /> + <di:waypoint x="1735" y="130" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ys5rc6_di" bpmnElement="Flow_1ys5rc6"> + <di:waypoint x="1785" y="130" /> + <di:waypoint x="1862" y="130" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1815" y="112" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1jc568l_di" bpmnElement="Flow_1jc568l"> + <di:waypoint x="1760" y="155" /> + <di:waypoint x="1760" y="250" /> + <di:waypoint x="1440" y="250" /> + <di:waypoint x="1440" y="170" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1772" y="173" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_1mqgsfb"> + <bpmndi:BPMNPlane id="BPMNPlane_06ocm1v" bpmnElement="Activity_1t48mzy"> + <bpmndi:BPMNShape id="Event_0fhlmze_di" bpmnElement="Event_0fhlmze"> + <dc:Bounds x="152" y="202" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0vhon7j_di" bpmnElement="Event_0tqe66v"> + <dc:Bounds x="632" y="202" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="632" y="245" width="37" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1s4lw7g_di" bpmnElement="Event_0i8fec6"> + <dc:Bounds x="632" y="82" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="625" y="125" width="50" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1pmj50s_di" bpmnElement="Activity_1fk0vjq"> + <dc:Bounds x="450" y="180" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1cf3kkz_di" bpmnElement="Activity_1p3rlbs"> + <dc:Bounds x="260" y="180" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0xsqd3e_di" bpmnElement="Event_039arig"> + <dc:Bounds x="292" y="162" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_16cy81a_di" bpmnElement="Event_0z55xlq"> + <dc:Bounds x="482" y="162" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_1a4n82m_di" bpmnElement="Flow_1a4n82m"> + <di:waypoint x="188" y="220" /> + <di:waypoint x="260" y="220" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1m3kg99_di" bpmnElement="Flow_1m3kg99"> + <di:waypoint x="550" y="220" /> + <di:waypoint x="632" y="220" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_00h4pfl_di" bpmnElement="Flow_00h4pfl"> + <di:waypoint x="500" y="162" /> + <di:waypoint x="500" y="100" /> + <di:waypoint x="632" y="100" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1h6bn9w_di" bpmnElement="Flow_1h6bn9w"> + <di:waypoint x="310" y="162" /> + <di:waypoint x="310" y="100" /> + <di:waypoint x="632" y="100" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1deqt80_di" bpmnElement="Flow_1deqt80"> + <di:waypoint x="360" y="220" /> + <di:waypoint x="450" y="220" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_04rzwam"> + <bpmndi:BPMNPlane id="BPMNPlane_0hksn5d" bpmnElement="Activity_15huvzg"> + <bpmndi:BPMNShape id="Event_0dbqwzf_di" bpmnElement="Event_0dbqwzf"> + <dc:Bounds x="152" y="142" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_15jl9q0_di" bpmnElement="Activity_15jl9q0"> + <dc:Bounds x="240" y="120" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1q5fjuu_di" bpmnElement="Gateway_1q5fjuu" isMarkerVisible="true"> + <dc:Bounds x="395" y="135" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="397" y="192" width="48" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_09di4b2_di" bpmnElement="Activity_1p8aqwl"> + <dc:Bounds x="500" y="120" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1m7hg30_di" bpmnElement="Gateway_1m7hg30" isMarkerVisible="true"> + <dc:Bounds x="655" y="135" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="656" y="113" width="48" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1471n6p_di" bpmnElement="Event_1vturru"> + <dc:Bounds x="762" y="142" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="760" y="185" width="41" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1u1rznf_di" bpmnElement="Event_19zbz9e"> + <dc:Bounds x="762" y="252" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="759" y="295" width="43" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_0ucnfjy_di" bpmnElement="Flow_0ucnfjy"> + <di:waypoint x="188" y="160" /> + <di:waypoint x="240" y="160" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1al5ley_di" bpmnElement="Flow_1al5ley"> + <di:waypoint x="340" y="160" /> + <di:waypoint x="395" y="160" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0blg2c5_di" bpmnElement="Flow_0blg2c5"> + <di:waypoint x="445" y="160" /> + <di:waypoint x="500" y="160" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0a0m56u_di" bpmnElement="Flow_0a0m56u"> + <di:waypoint x="420" y="135" /> + <di:waypoint x="420" y="80" /> + <di:waypoint x="780" y="80" /> + <di:waypoint x="780" y="142" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1t8on8l_di" bpmnElement="Flow_1t8on8l"> + <di:waypoint x="600" y="160" /> + <di:waypoint x="655" y="160" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0r34yr1_di" bpmnElement="Flow_0r34yr1"> + <di:waypoint x="705" y="160" /> + <di:waypoint x="762" y="160" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="725" y="142" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0rs73m4_di" bpmnElement="Flow_0rs73m4"> + <di:waypoint x="680" y="185" /> + <di:waypoint x="680" y="270" /> + <di:waypoint x="762" y="270" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> + <bpmndi:BPMNDiagram id="BPMNDiagram_0i9sfjv"> + <bpmndi:BPMNPlane id="BPMNPlane_0xpmnnl" bpmnElement="Activity_1p3rlbs"> + <bpmndi:BPMNShape id="Event_0bqqfvt_di" bpmnElement="Event_0bqqfvt"> + <dc:Bounds x="152" y="242" width="36" height="36" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0v8dpi9_di" bpmnElement="Activity_0h26l95"> + <dc:Bounds x="240" y="220" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_10216oy_di" bpmnElement="Gateway_10216oy" isMarkerVisible="true"> + <dc:Bounds x="395" y="235" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="403" y="213" width="33" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_1a6ebbi_di" bpmnElement="Activity_1l7dn1c"> + <dc:Bounds x="500" y="220" width="100" height="80" /> + <bpmndi:BPMNLabel /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1iyacwd_di" bpmnElement="Event_07uvg80"> + <dc:Bounds x="662" y="242" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="654" y="285" width="53" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_0hgmtmx_di" bpmnElement="Gateway_0b21uvv"> + <dc:Bounds x="765" y="235" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_1nygmxr_di" bpmnElement="Event_15gd4sd"> + <dc:Bounds x="882" y="172" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="867" y="215" width="67" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0ia7r71_di" bpmnElement="Activity_04lnwd9"> + <dc:Bounds x="990" y="150" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0ob0fr5_di" bpmnElement="Event_0ob0fr5"> + <dc:Bounds x="772" y="322" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="757" y="365" width="67" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_1nl1ijk_di" bpmnElement="Gateway_1nl1ijk" isMarkerVisible="true"> + <dc:Bounds x="1395" y="165" width="50" height="50" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1405" y="143" width="30" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0wqjkxl_di" bpmnElement="Event_0wf7qu7"> + <dc:Bounds x="1562" y="172" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1544" y="215" width="72" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Activity_0hbohbd_di" bpmnElement="Activity_1op1tik"> + <dc:Bounds x="1220" y="150" width="100" height="80" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Gateway_19xffd3_di" bpmnElement="Gateway_19xffd3" isMarkerVisible="true"> + <dc:Bounds x="1125" y="165" width="50" height="50" /> + </bpmndi:BPMNShape> + <bpmndi:BPMNShape id="Event_0urzqjl_di" bpmnElement="Event_041xodd"> + <dc:Bounds x="832" y="82" width="36" height="36" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="830" y="125" width="40" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNShape> + <bpmndi:BPMNEdge id="Flow_0fjdi0g_di" bpmnElement="Flow_0fjdi0g"> + <di:waypoint x="188" y="260" /> + <di:waypoint x="240" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_16t8foj_di" bpmnElement="Flow_16t8foj"> + <di:waypoint x="340" y="260" /> + <di:waypoint x="395" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1jm8xy5_di" bpmnElement="Flow_1jm8xy5"> + <di:waypoint x="445" y="260" /> + <di:waypoint x="500" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_16ju5wj_di" bpmnElement="Flow_16ju5wj"> + <di:waypoint x="772" y="340" /> + <di:waypoint x="550" y="340" /> + <di:waypoint x="550" y="300" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_09xggk3_di" bpmnElement="Flow_09xggk3"> + <di:waypoint x="832" y="100" /> + <di:waypoint x="550" y="100" /> + <di:waypoint x="550" y="220" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1snpj0t_di" bpmnElement="Flow_1snpj0t"> + <di:waypoint x="600" y="260" /> + <di:waypoint x="662" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0fl304d_di" bpmnElement="Flow_0fl304d"> + <di:waypoint x="698" y="260" /> + <di:waypoint x="765" y="260" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0j2dm4a_di" bpmnElement="Flow_0j2dm4a"> + <di:waypoint x="790" y="235" /> + <di:waypoint x="790" y="190" /> + <di:waypoint x="882" y="190" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_1ndnjyd_di" bpmnElement="Flow_1ndnjyd"> + <di:waypoint x="790" y="285" /> + <di:waypoint x="790" y="322" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0o0uqqu_di" bpmnElement="Flow_0o0uqqu"> + <di:waypoint x="918" y="190" /> + <di:waypoint x="990" y="190" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0jjx1zt_di" bpmnElement="Flow_0jjx1zt"> + <di:waypoint x="1420" y="215" /> + <di:waypoint x="1420" y="300" /> + <di:waypoint x="1040" y="300" /> + <di:waypoint x="1040" y="230" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1432" y="223" width="15" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0oeaihe_di" bpmnElement="Flow_0oeaihe"> + <di:waypoint x="1090" y="190" /> + <di:waypoint x="1125" y="190" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0czzelb_di" bpmnElement="Flow_0czzelb"> + <di:waypoint x="1320" y="190" /> + <di:waypoint x="1395" y="190" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_08efccg_di" bpmnElement="Flow_08efccg"> + <di:waypoint x="1445" y="190" /> + <di:waypoint x="1562" y="190" /> + <bpmndi:BPMNLabel> + <dc:Bounds x="1496" y="172" width="18" height="14" /> + </bpmndi:BPMNLabel> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_15yomy2_di" bpmnElement="Flow_15yomy2"> + <di:waypoint x="1175" y="190" /> + <di:waypoint x="1220" y="190" /> + </bpmndi:BPMNEdge> + <bpmndi:BPMNEdge id="Flow_0ohwwaf_di" bpmnElement="Flow_0ohwwaf"> + <di:waypoint x="1150" y="165" /> + <di:waypoint x="1150" y="100" /> + <di:waypoint x="868" y="100" /> + </bpmndi:BPMNEdge> + </bpmndi:BPMNPlane> + </bpmndi:BPMNDiagram> +</bpmn:definitions> diff --git a/docs/figures/old/DomainModel.mocodo.net b/docs/figures/old/DomainModel.mocodo.net @@ -0,0 +1,20 @@ +CONSENT, 0N IDENTITY, 0N CLIENT APP: date, agent +IDENTITY: id [text], hashed_password [text] +OAUTH, 11 IDENTITY, 0N PROCESS CASE +PROCESS CASE: process case [text] +ISSUE, 0N PROCESS CASE, 11 TOKEN: bearer [text], expire [text] +TOKEN: token [text] + +CLIENT APP: client_id [text], description [text], client_secret [text] +CLAIM, 0N IDENTITY, 0N ATTRIBUTE: claim [text], verified [int], code [text] +ATTRIBUTE: attribute [text] +IS IN, 11 PROCESS CASE, 0N STATE +PERMISSION: permission [text] +GRANT, 0N TOKEN, 0N PERMISSION + +PRE-RECORD, 1N CLIENT APP, 0N SCOPE: redirect_uri [text] +SCOPE: scope [text] +REQUIRE, 0N SCOPE, 1N ATTRIBUTE: verified [int] +STATE: state [text] +TRANSIT, 0N> [to] STATE, 0N< [from] STATE, 01 [transition] PERMISSION +: diff --git a/docs/figures/old/DomainModel.svg b/docs/figures/old/DomainModel.svg @@ -0,0 +1,260 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generated by Mocodo 4.2.4 --> +<svg width="727" height="276" viewBox="0 0 727 276" xmlns="http://www.w3.org/2000/svg"> +<rect x="0" y="0" width="727" height="276" fill="#f5f5f5" stroke="none" stroke-width="0"/> + +<!-- Association CONSENT --> +<g> + <line x1="208" y1="44" x2="69" y2="44" stroke="#bf812d" stroke-width="1"/> + <line x1="69" y1="147" x2="69" y2="44" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M92 9 a14 14 90 0 1 14 14 V35 h-74 V23 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M106 35 v30 a14 14 90 0 1 -14 14 H46 a14 14 90 0 1 -14 -14 V35 H74" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="32" y="9" width="74" height="70" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="32" y1="35" x2="106" y2="35" stroke="#bf812d" stroke-width="1"/> + <text x="39" y="27.6" fill="#000000" font-family="Courier New" font-size="14">CONSENT</text> + <text x="39" y="53.6" fill="#000000" font-family="Courier New" font-size="14">date</text> + <text x="39" y="71.6" fill="#000000" font-family="Courier New" font-size="14">agent</text> + </g> + <text x="111" y="60" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="74" y="95" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> +</g> + +<!-- Association OAUTH --> +<g> + <line x1="208" y1="44" x2="339" y2="44" stroke="#bf812d" stroke-width="1"/> + <line x1="457" y1="44" x2="339" y2="44" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M354 18 a14 14 90 0 1 14 14 V44 h-58 V32 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M368 44 v12 a14 14 90 0 1 -14 14 H324 a14 14 90 0 1 -14 -14 V44 H58" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="310" y="18" width="58" height="52" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="310" y1="44" x2="368" y2="44" stroke="#bf812d" stroke-width="1"/> + <text x="318" y="36.6" fill="#000000" font-family="Courier New" font-size="14">OAUTH</text> + </g> + <text x="282" y="60" fill="#01665e" font-family="Courier New" font-size="12">1,1</text> + <text x="373" y="60" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> +</g> + +<!-- Association ISSUE --> +<g> + <line x1="457" y1="44" x2="579" y2="44" stroke="#bf812d" stroke-width="1"/> + <line x1="689" y1="44" x2="579" y2="44" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M598 9 a14 14 90 0 1 14 14 V35 h-66 V23 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M612 35 v30 a14 14 90 0 1 -14 14 H560 a14 14 90 0 1 -14 -14 V35 H66" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="546" y="9" width="66" height="70" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="546" y1="35" x2="612" y2="35" stroke="#bf812d" stroke-width="1"/> + <text x="558" y="27.6" fill="#000000" font-family="Courier New" font-size="14">ISSUE</text> + <text x="553" y="53.6" fill="#000000" font-family="Courier New" font-size="14">bearer</text> + <text x="553" y="71.6" fill="#000000" font-family="Courier New" font-size="14">expire</text> + </g> + <text x="518" y="60" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="634" y="60" fill="#01665e" font-family="Courier New" font-size="12">1,1</text> +</g> + +<!-- Association CLAIM --> +<g> + <line x1="208" y1="44" x2="208" y2="147" stroke="#bf812d" stroke-width="1"/> + <line x1="339" y1="147" x2="208" y2="147" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M235 103 a14 14 90 0 1 14 14 V129 h-82 V117 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M249 129 v48 a14 14 90 0 1 -14 14 H181 a14 14 90 0 1 -14 -14 V129 H82" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="167" y="103" width="82" height="88" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="167" y1="129" x2="249" y2="129" stroke="#bf812d" stroke-width="1"/> + <text x="187" y="121.6" fill="#000000" font-family="Courier New" font-size="14">CLAIM</text> + <text x="174" y="147.6" fill="#000000" font-family="Courier New" font-size="14">claim</text> + <text x="174" y="165.6" fill="#000000" font-family="Courier New" font-size="14">verified</text> + <text x="174" y="183.6" fill="#000000" font-family="Courier New" font-size="14">code</text> + </g> + <text x="213" y="95" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="267" y="163" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> +</g> + +<!-- Association IS_IN --> +<g> + <line x1="457" y1="44" x2="457" y2="147" stroke="#bf812d" stroke-width="1"/> + <line x1="457" y1="241" x2="457" y2="147" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M472 121 a14 14 90 0 1 14 14 V147 h-58 V135 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M486 147 v12 a14 14 90 0 1 -14 14 H442 a14 14 90 0 1 -14 -14 V147 H58" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="428" y="121" width="58" height="52" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="428" y1="147" x2="486" y2="147" stroke="#bf812d" stroke-width="1"/> + <text x="436" y="139.6" fill="#000000" font-family="Courier New" font-size="14">IS IN</text> + </g> + <text x="462" y="86" fill="#01665e" font-family="Courier New" font-size="12">1,1</text> + <text x="462" y="207" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> +</g> + +<!-- Association GRANT --> +<g> + <line x1="689" y1="44" x2="689" y2="147" stroke="#bf812d" stroke-width="1"/> + <line x1="579" y1="147" x2="689" y2="147" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M704 121 a14 14 90 0 1 14 14 V147 h-58 V135 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M718 147 v12 a14 14 90 0 1 -14 14 H674 a14 14 90 0 1 -14 -14 V147 H58" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="660" y="121" width="58" height="52" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="660" y1="147" x2="718" y2="147" stroke="#bf812d" stroke-width="1"/> + <text x="668" y="139.6" fill="#000000" font-family="Courier New" font-size="14">GRANT</text> + </g> + <text x="694" y="86" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="632" y="163" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> +</g> + +<!-- Association PRE_RECORD --> +<g> + <line x1="69" y1="147" x2="69" y2="241" stroke="#bf812d" stroke-width="1"/> + <line x1="208" y1="241" x2="69" y2="241" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M113 215 a14 14 90 0 1 14 14 V241 h-116 V229 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M127 241 v12 a14 14 90 0 1 -14 14 H25 a14 14 90 0 1 -14 -14 V241 H116" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="11" y="215" width="116" height="52" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="11" y1="241" x2="127" y2="241" stroke="#bf812d" stroke-width="1"/> + <text x="27" y="233.6" fill="#000000" font-family="Courier New" font-size="14">PRE-RECORD</text> + <text x="18" y="259.6" fill="#000000" font-family="Courier New" font-size="14">redirect_uri</text> + </g> + <text x="74" y="207" fill="#01665e" font-family="Courier New" font-size="12">1,N</text> + <text x="153" y="257" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> +</g> + +<!-- Association REQUIRE --> +<g> + <line x1="208" y1="241" x2="339" y2="241" stroke="#bf812d" stroke-width="1"/> + <line x1="339" y1="147" x2="339" y2="241" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M366 215 a14 14 90 0 1 14 14 V241 h-82 V229 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M380 241 v12 a14 14 90 0 1 -14 14 H312 a14 14 90 0 1 -14 -14 V241 H82" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="298" y="215" width="82" height="52" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="298" y1="241" x2="380" y2="241" stroke="#bf812d" stroke-width="1"/> + <text x="309" y="233.6" fill="#000000" font-family="Courier New" font-size="14">REQUIRE</text> + <text x="305" y="259.6" fill="#000000" font-family="Courier New" font-size="14">verified</text> + </g> + <text x="240" y="257" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="344" y="189" fill="#01665e" font-family="Courier New" font-size="12">1,N</text> +</g> + +<!-- Association TRANSIT --> +<g> + <path d="M457 241 C474.33 209 515 209 579 241" fill="none" stroke="#bf812d" stroke-width="1"/> + <polygon points="484.0 219.1 493.94 210.08 491.7 216.94 497.17 221.64" fill="#bf812d" stroke-width="0"/> + <path d="M457 241 C474.33 273 515 273 579 241" fill="none" stroke="#bf812d" stroke-width="1"/> + <polygon points="542.0 256.85 532.6 266.42 534.44 259.45 528.7 255.07" fill="#bf812d" stroke-width="0"/> + <line x1="579" y1="147" x2="579" y2="241" stroke="#bf812d" stroke-width="1"/> + <g> + <path d="M602 215 a14 14 90 0 1 14 14 V241 h-74 V229 a14 14 90 0 1 14 -14" fill="#dfc27d" stroke="#dfc27d" stroke-width="0"/> + <path d="M616 241 v12 a14 14 90 0 1 -14 14 H556 a14 14 90 0 1 -14 -14 V241 H74" fill="#f6e8c3" stroke="#f6e8c3" stroke-width="0"/> + <rect x="542" y="215" width="74" height="52" fill="none" rx="14" stroke="#bf812d" stroke-width="1.5"/> + <line x1="542" y1="241" x2="616" y2="241" stroke="#bf812d" stroke-width="1"/> + <text x="549" y="233.6" fill="#000000" font-family="Courier New" font-size="14">TRANSIT</text> + </g> + <text x="489" y="235" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="489" y="255" fill="#01665e" font-family="Courier New" font-size="12">0,N</text> + <text x="584" y="189" fill="#01665e" font-family="Courier New" font-size="12">0,1</text> +</g> + +<!-- Entity IDENTITY --> +<g> + <g> + <rect x="139" y="9" width="138" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="139" y="35" width="138" height="44" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="139" y="9" width="138" height="70" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="139" y1="35" x2="277" y2="35" stroke="#35978f" stroke-width="1"/> + </g> + <text x="174" y="27.6" fill="#000000" font-family="Courier New" font-size="14">IDENTITY</text> + <text x="144" y="53.6" fill="#000000" font-family="Courier New" font-size="14">id</text> + <line x1="144" y1="56" x2="162" y2="56" stroke="#000000" stroke-width="1"/> + <text x="144" y="71.6" fill="#000000" font-family="Courier New" font-size="14">hashed_password</text> +</g> + +<!-- Entity PROCESS_CASE --> +<g> + <g> + <rect x="401" y="18" width="112" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="401" y="44" width="112" height="26" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="401" y="18" width="112" height="52" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="401" y1="44" x2="513" y2="44" stroke="#35978f" stroke-width="1"/> + </g> + <text x="406" y="36.6" fill="#000000" font-family="Courier New" font-size="14">PROCESS CASE</text> + <text x="406" y="62.6" fill="#000000" font-family="Courier New" font-size="14">process case</text> + <line x1="406" y1="65" x2="508" y2="65" stroke="#000000" stroke-width="1"/> +</g> + +<!-- Entity TOKEN --> +<g> + <g> + <rect x="662" y="18" width="54" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="662" y="44" width="54" height="26" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="662" y="18" width="54" height="52" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="662" y1="44" x2="716" y2="44" stroke="#35978f" stroke-width="1"/> + </g> + <text x="668" y="36.6" fill="#000000" font-family="Courier New" font-size="14">TOKEN</text> + <text x="667" y="62.6" fill="#000000" font-family="Courier New" font-size="14">token</text> + <line x1="667" y1="65" x2="710" y2="65" stroke="#000000" stroke-width="1"/> +</g> + +<!-- Entity CLIENT_APP --> +<g> + <g> + <rect x="9" y="103" width="120" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="9" y="129" width="120" height="62" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="9" y="103" width="120" height="88" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="9" y1="129" x2="129" y2="129" stroke="#35978f" stroke-width="1"/> + </g> + <text x="27" y="121.6" fill="#000000" font-family="Courier New" font-size="14">CLIENT APP</text> + <text x="14" y="147.6" fill="#000000" font-family="Courier New" font-size="14">client_id</text> + <line x1="14" y1="150" x2="91" y2="150" stroke="#000000" stroke-width="1"/> + <text x="14" y="165.6" fill="#000000" font-family="Courier New" font-size="14">description</text> + <text x="14" y="183.6" fill="#000000" font-family="Courier New" font-size="14">client_secret</text> +</g> + +<!-- Entity ATTRIBUTE --> +<g> + <g> + <rect x="295" y="121" width="88" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="295" y="147" width="88" height="26" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="295" y="121" width="88" height="52" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="295" y1="147" x2="383" y2="147" stroke="#35978f" stroke-width="1"/> + </g> + <text x="301" y="139.6" fill="#000000" font-family="Courier New" font-size="14">ATTRIBUTE</text> + <text x="300" y="165.6" fill="#000000" font-family="Courier New" font-size="14">attribute</text> + <line x1="300" y1="168" x2="377" y2="168" stroke="#000000" stroke-width="1"/> +</g> + +<!-- Entity PERMISSION --> +<g> + <g> + <rect x="531" y="121" width="96" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="531" y="147" width="96" height="26" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="531" y="121" width="96" height="52" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="531" y1="147" x2="627" y2="147" stroke="#35978f" stroke-width="1"/> + </g> + <text x="537" y="139.6" fill="#000000" font-family="Courier New" font-size="14">PERMISSION</text> + <text x="536" y="165.6" fill="#000000" font-family="Courier New" font-size="14">permission</text> + <line x1="536" y1="168" x2="621" y2="168" stroke="#000000" stroke-width="1"/> +</g> + +<!-- Entity SCOPE --> +<g> + <g> + <rect x="181" y="215" width="54" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="181" y="241" width="54" height="26" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="181" y="215" width="54" height="52" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="181" y1="241" x2="235" y2="241" stroke="#35978f" stroke-width="1"/> + </g> + <text x="187" y="233.6" fill="#000000" font-family="Courier New" font-size="14">SCOPE</text> + <text x="186" y="259.6" fill="#000000" font-family="Courier New" font-size="14">scope</text> + <line x1="186" y1="262" x2="229" y2="262" stroke="#000000" stroke-width="1"/> +</g> + +<!-- Entity STATE --> +<g> + <g> + <rect x="430" y="215" width="54" height="26" fill="#80cdc1" stroke="none" stroke-width="0" opacity="1"/> + <rect x="430" y="241" width="54" height="26" fill="#c7eae5" stroke="none" stroke-width="0" opacity="1"/> + <rect x="430" y="215" width="54" height="52" fill="none" stroke="#35978f" stroke-width="1.5" opacity="1"/> + <line x1="430" y1="241" x2="484" y2="241" stroke="#35978f" stroke-width="1"/> + </g> + <text x="436" y="233.6" fill="#000000" font-family="Courier New" font-size="14">STATE</text> + <text x="435" y="259.6" fill="#000000" font-family="Courier New" font-size="14">state</text> + <line x1="435" y1="262" x2="478" y2="262" stroke="#000000" stroke-width="1"/> +</g> +</svg> +\ No newline at end of file diff --git a/docs/figures/old/context-map.drawio.svg b/docs/figures/old/context-map.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than draw.io --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="592px" height="112px" viewBox="-0.5 -0.5 592 112" content="<mxfile host="app.diagrams.net" modified="2024-04-30T06:56:05.082Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:124.0) Gecko/20100101 Firefox/124.0" etag="R43d22fqfFiy1sxSp4Sy" version="24.3.1" scale="1" border="0">
 <diagram name="Page-1" id="Hekh8i1OT60wlZ4s4Ahz">
 <mxGraphModel dx="795" dy="486" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
 <root>
 <mxCell id="0" />
 <mxCell id="1" parent="0" />
 <mxCell id="Uz3pbY1pgS7CU2lNiq70-3" value="&lt;font style=&quot;font-size: 36px;&quot;&gt;KYC&lt;/font&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
 <mxGeometry x="520" y="217.5" width="170" height="95" as="geometry" />
 </mxCell>
 <mxCell id="Uz3pbY1pgS7CU2lNiq70-4" value="&lt;font style=&quot;font-size: 36px;&quot;&gt;OAUTH&lt;/font&gt;" style="ellipse;whiteSpace=wrap;html=1;" vertex="1" parent="1">
 <mxGeometry x="100" y="210" width="180" height="110" as="geometry" />
 </mxCell>
 <mxCell id="Uz3pbY1pgS7CU2lNiq70-5" value="" style="endArrow=none;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="Uz3pbY1pgS7CU2lNiq70-4" target="Uz3pbY1pgS7CU2lNiq70-3">
 <mxGeometry width="50" height="50" relative="1" as="geometry">
 <mxPoint x="550" y="640" as="sourcePoint" />
 <mxPoint x="600" y="590" as="targetPoint" />
 </mxGeometry>
 </mxCell>
 <mxCell id="Uz3pbY1pgS7CU2lNiq70-6" value="&lt;font style=&quot;font-size: 36px;&quot;&gt;U&lt;/font&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="Uz3pbY1pgS7CU2lNiq70-5">
 <mxGeometry x="-0.5333" y="-4" relative="1" as="geometry">
 <mxPoint x="-35" y="-4" as="offset" />
 </mxGeometry>
 </mxCell>
 <mxCell id="Uz3pbY1pgS7CU2lNiq70-9" value="&lt;div&gt;&lt;font style=&quot;font-size: 36px;&quot;&gt;D&lt;/font&gt;&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="1">
 <mxGeometry x="319.9990322580644" y="284" as="geometry">
 <mxPoint x="172" y="-17" as="offset" />
 </mxGeometry>
 </mxCell>
 </root>
 </mxGraphModel>
 </diagram>
</mxfile>
"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0"/><g><g><ellipse cx="505" cy="55" rx="85" ry="47.5" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 55px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 36px;">KYC</font></div></div></div></foreignObject><image x="421" y="34" width="168" height="46" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqAAAAC4CAYAAAA8Jl4aAAAgAElEQVR4Xu2dCbxv5bjHU1xDbqbUVdGhNJIMpVBOKRmuEpUhuQeRIfMQqYSQMoS43ZLOpYGGSyWpyJGiyZCkkTKUcCtjJHF/v09737bjv/de//d51/q/a73f9/N5PnufvdfzvM/7fdY++7fXeoc7LUODAAQgAAEIQAACEIBAhwTu1GFfdAUBCEAAAhCAAAQgAIFlEKDcBBCAAAQgAAEIQAACnRJAgHaKm84gAAEIQAACEIAABBCg3AMQgAAEIAABCEAAAp0SQIB2ipvOIAABCEAAAhCAAAQQoNwDEIAABCAAAQhAAAKdEkCAdoqbziAAAQhAAAIQgAAEEKDcAxCAAAQgAAEIQAACnRJAgHaKm84gAAEIQAACEIAABBCg3AMQgAAEIAABCEAAAp0SQIB2ipvOIAABCEAAAhCAAAQQoNwDEIAABCAAAQhAAAKdEkCAdoqbziAAAQhAAAIQgAAEEKDcAxCAAAQgAAEIQAACnRJAgHaKm84gAAEIQAACEIAABBCg3AMQgAAEIAABCEAAAp0SQIB2ipvOIAABCEBgTAJ30fWryxbIHiy7t+wesuVl/zr18TdTn9+gjzdO2U36aPP3pj/6+38bs38uhwAEWiCAAG0BKiEhAAEIQCCJwF3l9WjZ5rLHydaXPSQp0min3+vLX5GdJfum7Huyv2SMTygIQKAhAQRoQ1BcBgEIQAACrRBYQ1GfLdtKtnUrPcwd9Ex9e4nsHNm5spsnkANdQqA6AgjQ6krOgBsS2ETXHdfw2pmXXaF/PCnBrySXf1EyR8j8FCpXe6sCHTUj2MP0+anB4BfJf1vZ0F+p+nWzBdIDgrw2k/81wRi53FdQoGfJXixzXqU0PyH9gOwQ2a9KSYo8IDBEAgjQIVaVMeUg8O8KcnJCIP/SWjnBrxQXi8/PyrbPmNApirWj7E8zYt5Zn58ne1Swn13kf2QwRunueynBdweT/Ib8F8omLdYXKIc9ZC8PjqcL94PVyUdkV3XRGX1AoDYCCNDaKs54mxKoUYC2IT4/L+DPk90yArzn+l3YtCCzXOcnVg+SeaHJEJvnP/4ow8DWVYzLMsRJDbGqHP0UfPfUABP085uQD8r8BxMNAhDIRAABmgkkYQZHoDYB2ob4PFp3xSLZrXPcHQfoe28O3j0flv8bgjFKdf+CEtsumNw+8o8+QU1N4Z5y3Fv2ltQABfmdoFxeKvOKehoEIBAkgAANAsR9sARqEqBtiM/FU7+s/zrPHWKBcqlsteCd9Aj5fz8YozT3pyqhLwWT8pzkDWSjnkAHQ8/r7rmdvg9yrmKft9OWL/i54vsPgu+03A/hITB4AgjQwZeYASYSqEWAtiE+vYDDr1pva8g+h9DyHMcnyv7esM/SL7ubErwkg3izCDy748F60ZSfuA71qbRxvkLm+5wGAQgkEkCAJoLDbfAEahCgbYjPj+rOeL1s3MUuXiH//OBdZf9jgjFKcX+bEnlvMBkLJAulLtua6syLztbqstMJ9eUpJl5M5XnINAhAYEwCCNAxgXF5NQSGLkDbEJ+ez+mFJilPIf9Nfn5d7JNtUpt3ILDw+W1qgEL8FiiPq4O5mMU6si7nK3rrstODNQwOu3N337PeCuzyznumQwj0nAACtOcFJP3WCAxZgLYhPt+lSrwjWI0Xyf9TwRgHyr/vC16O1xi8MXukedsrx+mq7aCOUvbN7Sq/NvvxvFCL72vb7ITYEBgaAQTo0CrKeHIRGKoAbUN8vl3Qo6+LXbdlZV+VLQwW0Zvce/5kH9uTlfRpwcS9f62fynXVPN/3Y111Vmg/P1ReT5B1+cS5UBSkBYFmBBCgzThxVX0EhihA2xCfb9St4W2QUl67j7qr1tYXo/tVLlGMLTPm1NXd73PQLWSiq8ZXV4yfdpT0IvXjU7O6aD4m0/fG9VP2S330VINfy26Q+XCDe8k8jcMfbd5/dGPZQtlKLSfphXDbyGYeuNByl4SHQH8JIED7Wzsyb5fA0ARoG+LTT74+3kIZ/ER1v2Dc58r/c8EYXbt76sD7g52+Wv4+waeL9gx1clLLHfkgA5ufCkePxvRRpj556/Gyl8jaEKSehuDFcPNtP9YyNsJDoHwCCNDya0SGkyEwJAHahvjcVWU5vKXS+Emg9/SMrKS2WPGK7L6sUH6gco0+tbxAMR7XkfjZXP18vaX6HzolbL+mjze31MddFNc/494lYOvMffgPAP8hQIMABOYggADl9oDAaAJDEaBtiM8uzl+3kDoneHP6aaJX5feh+WntTsFEN5T/RcEYTdx99OkPZJEdC0b1c6y+6HPir2mSRMZr/IfK/rLowq+ZKfn42c9mzJFQEBgcAQTo4ErKgDIRGIIAbUN8WiR1tdrZr/dfGaznevL3SUslt62U3BnBBC2gvHdo280Lxb4sy/nU0E+7/cTwrLaTnye+p2346WsOYe0n7w+WeW4qDQIQGEEAAcptAYHRBPouQNsQn88UqhM7vGHurb68v2Jkrp6FnVeWl9pcp4tlkekG3gbIi7fael09k91u+keuE4As0nxa0mJZKXMmvR+tx+fjNqPNU1Q8VYUGAQiMIIAA5baAwGgCfRagbYjPpwnTqRO4WZ6lPk8I9tv1npjjpOtdBD4wjsOIa/008ivBGE3c19BFVzW5sME1Pkv9KTKvYC+t+SnvR2ReZBdt3o3Bc1lpEIDAUgQQoNwSEBhNoK8CtA3x6VfE3p9zUu0L6jjyRMoLkiye/jCpAczS72r6+s+COX1G/i8MxmjivtyUkPLZ8tF2pgJsL/tdNFCL/hah3ts0OgXkx4rhfWnZmqnFYhG6nwQQoP2sG1m3T6CPArQN8enVzt7fcJItxwpxb5Tv7Z1KakcpGW/Zk9r8CtvCuouniJ6j+dHURGf4eUulnXsiyHKJUJ8Q5pPCaBCAwAwCCFBuBwiMJtA3AZpbfFrceO6kN/8uob1KSUT3t/TZ6KWc2b2FcvGTwEjzk08/AW275TgcwDkulr1UVsp8zybcLEK/KHtqk4tnucY/S55b2sUc3UCauEKgWwII0G5501t/CPRJgLYhPi2Qvl1QuXzKzTdlGwVy8mbmnnc46eY9KL2NUWThkcWrp0bkOoFqNibm7ifgPus80nxa1ptkf4sEmZDvKurXJzBFVsf7SfcxE8qfbiFQJAEEaJFlIakCCPRFgLYhPn2mtbfGKa1toISi+1x6UZNfA0+yvU6dW5BF2kPlnGtB0Fx5eGuiqHDyfq5PlN0WGfCEfb0DROS+sYj3dBYaBCAwRQAByq0AgdEE+iBAc4tPL9bxk0+fR15qe48S2zOQnLcs8qv4PwZiRFz9NO3aSAD5enP96JGdTVP4li6MPv3sSiw3HVPqdd5W6cWpzvJbV+YnqTQIQEAEEKDcBhAYTaB0AdqG+PSTzysLvyHuofy8b+ZDAnl6QYgXhkyifVqd+iSp1OY/Dh4p+0tqgDH8HqNrfbxnpHkrIx8oMIS2qgbhP2BS2wFy9ElPNAhAQAQQoNwGEBhNoGQBmlt8+peqXw9e3ZObIcfJQZN4Kpfj/PRNVaOuFoYdob4WBe4Jz1P1HqV9nPc527A/oW/4/PiU5sVIK8q6+OMhJT98INApAQRop7jprEcEShWgucWn9ylcKIvuR9l1aaPiyJvqe3P9rpoXHn1P5qNBU5u3QXptqvOYfivr+uvH9Fn6ch9FeU0wRmnufvL+o0BSG8o3Oo850D2uECiHAAK0nFqQSVkEShSgucXnFULuOZ/XlYW+UTZ+kmTxHFmZ7M3tT2rUW/wiv4r2xuapzfNz/dS2q83bfa68905Nbd5u6ZOpzoX7LVZ+/5GYo6dfHJnoixsEBkUAATqocjKYjARKE6C5xadXufv1qIVNX9sLlHhkH8yuzlB/gPL0/qN9Ect+Wms2KyXeGL6nPF+yT/t9jjPUyFSKD6ojb0dFg0D1BBCg1d8CAJiFQEkCNLf49Dnc3mT+hp5X3/9/eW9PC+nU1sUpNdHpAidocDukDjDBb0f5HJvgN+3yTn2yb8C/dFfvjXqjLOUPiiXy81sHGgSqJ4AArf4WAEDhAjS3+PQCFs99vGkglV9T44iu3HeMyLy+uVA+Xt88O8jaTxO7nCbhfJ13amuTZ2pOuf1S/6jwQqR7ydo+QCD3eIkHgewEEKDZkRJwIARKeAKaW3x6M2yPq6t5hF3dCm9WR97iJrWdLMdtU53n8POTMp8m5Q30U9vL5fhfqc4JfveXT2Raxhny99P1oTcfaOAn0ynNC5n6suNEyvjwgUAjAgjQRpi4qEICkxagucWnhcH2skltwN7mLeQ5ixcGhZ7rfUrmJF+peJE9MCdxgtDTlbPPPk9tO8nxuFTnHvmtoFy9p2tKe5mcIiI/pU98IFAcAQRocSUhoUIITFKA5hafFlae1/enQti2kcbGCnpeILBX1D8sIyNvY+SpASnzBKeH4XwuCYwpxfXdctorxVE+fr3shUt/TvTHDQIQqIgAArSiYjPUsQhMSoDmFp8+v/p5slvGGn0/L/6Q0n59IPW95btfwH+mq7cgekkg1qQW8pylnDdLzNv835joixsEIFAZAQRoZQVnuI0JTEKA5hafXsnsrYpubTzqfl/o16J+6pi6fZBHn2N+ns9O9xnqqS3309imedxVF0aeXj5W/uc37YzrIACBugkgQOuuP6OfnUDXAjS3+PxvDW1X2VD3Ypytcql1m453oj55ZuAHwwuPPBXgUYEY3qZnScA/1dUCMnLM592DAjY1b/wgAIEeEkCA9rBopNwJgVQh48UFnv83TsstPg9T5z6v+rZxkhjQtX7y6zmvqc3bVPmozpS2m5wOSXGc8jlcH/2HwySaj/k8KLFj7y376ERf3CAAgQoJIEArLDpDbkSgKwGaW3werNFZSPyt0SiHedEqGtZlstQFQH4Fvr5s3NfR3sLI+4mm9utFPAtk3uR8Ei0i3C26/UcPDQIQgEAjAgjQRpi4qEICXQjQ3OLTx/x5T0w2uV5mGZ9Ffmjgvt1Tvu8b09/7dXqLndTmxWKfTXUO+vl3wW9lqeLZ4/aTdxoEIACBRgQQoI0wcVGFBNoWoLnFp1dvexU37XYCy8q8ojtyos8C+f+kIdDo/Em/8ver/0m1NdTxVYHOWYAUgIcrBGokgACtseqMuQmBNgVobvGZc/ugJmz6cs16SjSyj2bTM9iXUz9e/R1ZeJRj9X2kLt56yYI9tS0vx5tTnfGDAATqI4AAra/mjLgZgbYEaG7x6VfufvXOa/fRdd1HX/aemqltGzmePo+zFw1FXj+/Qf4fTk0wk5+PIvUOACnth3LynFkaBCAAgcYEEKCNUXFhZQTaEKC5xadL4nPGL66sNuMM9266+CLZWuM4zbj2iinGs23kv6K+70VLqXMnvXrcr68nvV3WIuVwRCKjSa7cT0wZNwhAYNIEEKCTrgD9l0ogtwBtQ3yanZ8+bSTj9efsd9Lm+tbXAzfaHvI9YBb/T+jrkdXf3rrIInTS7XVKIPUprE8/8ilINAhAAAKNCSBAG6PiwsoI5BSgbYnP6ZJ8TJ+8prL6jDvc6Ar1B6nDny3V6WP07wvGTWTG9Qfq87cE/HO6epqCpyukNB85+qkUR3wgAIF6CSBA6609I5+bQC4B2rb4nB6F8z2Fos5K4D76jle0p74q9x6Zz5kR3QuPfNymnz6ntJ/LaV3ZH1KcW/DxHzG7J8b1pv/HJ/riBgEIVEoAAVpp4Rn2vARyCNCuxKcH403M15b9Yt6R1XuBhZKFZGrbSo5fnXJ+kT5GnvpFTltKzX8uv6P0zecnBm6yUCsxNG4QgMBQCSBAh1pZxhUlEBWgXYrP6bGepk8sbGo+BWm+un9RFzx9votm+b4XJD1cdk/ZNbLUp6lHy3fnxBzacvuyAltIpjTvtfrNFEd8IACBegkgQOutPSOfm0BEgD5QoX2izfYTgOzFJB+ZQL996XKBEr06kOyb5OsYqa+r/aTaK/KvD+TQhuu3FTR1H1OL8h+0kRQxIQCB4RJAgA63towsRiBVgFpgfGVC4nN6xBvqE289RBtN4LX68kETgvNi9Zu63VGbKXuB1WqJHViQNz0xKrEL3CAAgaERQIAOraKMJxeBVAGaq/9IHL8qfqSMrZlGU7yzvnyeLPWJX2ptlsjxSbISp0hEDjK4r8Z0UyoU/CAAgToJIEDrrDujnp9AnwWoR+f9KV81/zCrvcICvev9N9dRn5cXSjwiQD3f+dZCx0VaEIBAoQQQoIUWhrQmTmBSAtSv8FMXtywNbTt94aSJkyw3gf2VmjeZ76LtpU7e00VHiX38LnDf8XskETpuEKiZAP9x1Fx9xj4XgUkIUO8NuYVsJdk5GcpjMeunbtdliDXEEMtrUJfJUuc+NmUy33GeTeO0eV3qHFDfYyu0mRixIQCBYRJAgA6zrowqTqBrAerzxC0+fzqVeuRkmpmjP0P/eIqsxHmH8SrFI5jNqfEwc0bowzZFnhrg1fkpjd8jKdTwgUDlBPiPo/IbgOHPSqBLAerz3LeWzXxS6Xl1Pmknx0IZbx30QWo9K4HP6DsvaIlPX+biRrZh8r6of2yJH2EhAIGBEkCADrSwDCtMoCsB6oUw3gD8f0dk7KMaLU5zNAvZ7+YINMAYK2tMV8pyzb2dRvQrfeLTqX7TA2ZnK0c/qU1pq8iJE7hSyOEDgYoJIEArLj5Dn5NAFwL0XGXgk4vm2sLGK9kPzlArz0O0COVJ1WiYi/Tl3PtzPlsx/ydD7boIcbo68VP4lFby6v6U8eADAQh0QAAB2gFkuuglgbYF6BJR2VbmRRxztWX1zS/JUo9JnBn7EP3jFb2sRvtJ+//CM2ULM3V1ouI8M1OsLsJYKKee3PVY+Z7fRZL0AQEIDIcAAnQ4tWQkeQm0KUC96GUHWdON4lfVtZfKcrwifpbifD4vqsFE8+tyr4rP0R6kIF5Z3pf2MSWaeryon5z69C8aBCAAgcYEEKCNUXFhZQTaEqAWf8+T3TImTwvW48b0GXW5n7h6bum1GWINMcTbNKj3BgdmIffxYIyu3b0fqvdFTWm+N09IccQHAhColwACtN7aM/K5CbQhQI9Uly+S/TUR/qflt0ui70w3v2p+suy2DLGGFsK7D3ix1nqJA7tAfpv2kK13AfBuACltVzkdnuKIDwQgUC8BBGi9tWfk3QrQw9Sd519GRN+95X+xLMfG6X7idQA3wUgCO+qrxyay8aKytvcVTUxtTreF+u7XEgN/WH5vSPTFDQIQqJQAArTSwjPseQnkfAJ6kHp7oyzHZvARobD0oDfSFy6cl0R9FzxdQ/5i4rA3l983En0n6RaZ/+rdHPzUlwYBCECgMQEEaGNUXFgZgVwC9H3itmdmdrnOMPfpS4+Q/SFzfn0PV6MA9QI3nwef2jx14dZUZ/wgAIH6CCBA66s5I25GIIcA3Vtd7desu7GuupuuPk+2wVheoy/23D3P4aPdQaBGAerRW4Cm7rSwoXwvquwm8s/hvglj/vvU/wvsyZsAD5fhEECADqeWjCQvgagA9Zw4z41rq1l85vqF7zmPx7eVaA/j1ipAPe3AY09pXly3OMWxxz4+OconSKW0h8rpqhRHfCAwFAII0KFUknHkJhARoLspmUNzJzQinkVujjPevTXT+rI+7VvZJt5aBeg+gvrORLA+revVib59dYtsXXVnDTqyILGvzMgbAv9PAAHKzQCB0QRSBajP//bZ4l205dSJNwBfmKGzJYrhDcVTt4jKkEIxIWoVoM9QBU5KrMJ35PfoRN++un1ZiaecUHaO/J7Q10GTNwRyEUCA5iJJnKER6IMANfPVZd6aKXXu3sy6ebGUF03V3moVoD696SeB4q8g3/mOlg2EL8rVi67GPUxiegA+deo1RY2GZCAwAQII0AlAp8teEOiLADXMnWXe5D5H41zv2+dB1rYN0/S9E1mIVNM8UD/BTN1ui437c/xPRYzeE0CA9r6EDKAlAn0SoEbwOdlOGVh4a6ZHyiJb8mRIY6IhahagfgXvV/EpraZXyx8SoNenQJLPJjLvYkGDQNUEEKBVl5/Bz0GgbwL0fhrLD2UrZajqYsXw06xaW80C9OUq+n8GCr+OfC8P+PfB1XOvrwv8rHm6DHvv9qHS5NgqAQRoq3gJ3mMCfROgRu3z3U/LxPy5iuOnqjW2mgXoAhX86kDR3yvftwf8++C6mZI8KzFRv2FYI9EXNwgMigACdFDlZDAZCfRRgHr43nv0dRk4eDHJw2WRRSkZ0phIiJoFqIF7f9nUQw68C8SqsiHvpuBFRLsn3pkHyu8tib64QWBQBBCggyong8lIoK8C9B5i8F3ZWhlYeE7fwoGLiVGYahegkf1AzfNpslMz3H8lhriPkroxkNjG8r0g4I8rBAZDAAE6mFIykMwE+ipAjcH7MV6YiUdbx4lmSq+VMLUL0I1E9fwAWYtPi9AhtsjhD379vqbMR3HSIFA9AQRo9bcAAGYh0GcB6iG9Teb5eDnapgpybo5APYlRuwBdVnX6hSyyoG1b+Z/ck3o3TdN7f/q0sFQu+8o39aSppjlyHQR6QwAB2ptSkWjHBPouQH3U3xKZz6uOtp8rwMNkv40G6ol/7QLUZXqz7IBAvXzPrC27ORCjNNddlNCnA0n5Z+iSgD+uEBgUAQTooMrJYDIS6LsANQq/7rsyE5PPKM4LM8UqPQwCdJll7q8ieUFRpO0nZ0/hGELzKU/+WUp9+vl9+T5iCCAYAwRyEUCA5iJJnKERGIIAdU28n+enMhXn+YpzTKZYJYdBgN5enU/KXhIs1HryvzQYowT3/ZXEHoFE/ET5AwF/XCEwOAII0MGVlAFlIjAUAeqf8c/LtsvE5SGKE9knMlMarYZBgN6O1ydifSdI+kz5byXr88KbdZW/D3mIND85/XUkAL4QGBoBBOjQKsp4chEYigA1D//yu0rmE1iirYatmRCgd9wlZ+vT6DzilynGYdEbb0L+3nbJC/Ai25q9Vf7vn1D+dAuBYgkgQIstDYlNmMCQBKhRpo5nVBneoS++a8L1abN7BOgddC0+LUKjbScFOC4apGN/r3r3llJbBvr1PNoHy4a0GCuAA1cI3EEAAcrdAIHRBFIFm3/hrFwoVJ/x7bO+c7QnKIifhg6xIUD/saqe9+ujWaOtT1sz+Xej504vCg7ac7AXB2PgDoFBEkCADrKsDCoDgSEK0HuKi49Z9DzOaPM2Oz6q8zfRQAX6I0D/sSir65/XZKrTNopzeqZYbYbx6v3oU37PG/XK9yEfS9pmDYg9cAII0IEXmOElExiiADWMTWTfSqbyj45H6587Z4pVUhgE6D9Xw9Mu9s1UpIWK8/VMsdoI8wIF9bZj0eb/Q06JBsEfAkMlgAAdamUZV5TAUAWoueQUE94bNMcv62i9cvojQP+Zpp+eezul1TKB3lFxjs8UK1cYH97wJtn7MgQ8TTGekiEOISAwWAII0MGWloEFCQxZgN5FbDx/02d+52je8P5HOQIVEgMBOroQj9WXcx7JapG2u8w7NEy6PVQJ+JQjvyGINs8D96lHbLsUJYn/oAkgQAddXgYXIDBkAWosPibxsgCfma4X6B9eLX1rpniTDoMAnb0Cr9W3DspcID+RP1D2p8xxm4TzufdemPfxJhc3vGZjXeefCRoEIDAHAQQotwcERhMYugD1qP2L1yvjc7R3K8g+OQIVEAMBOnsR/DvjBNn2mev0Y8Xz01Bve9RV85P7T8i2ztihT47KdfJYxrQIBYHyCCBAy6sJGZVBoAYB6p9/L5J4aibkmyvONzLFmmQYBOjc9L05u882zzUfdGZvFqLeL/Rk2Xmy3CvIfSiDxfMusugG+0tTOlRf2G2SNy59Q6BPBBCgfaoWuXZJoAYBap6ryPwqPscpSZ77to7spi4L1UJfCND5oXrOpDeot6Brq/1egY+VfUHmIz1TN3NfQb7PkHnHhlx/bC09Zr9y9x9gf24LBnEhMDQCCNChVZTx5CJQiwA1r2fLcq1ItmB4Tq4iTCgOArQZeP+xcb4sxx8vTXr009FrZb+QXS/zHzy/nPpocbqizH9Q2VaVPVDmPUzbeFI7M1/vibupzB9pEIBAQwII0IaguKw6AjUJUBf3CNmiTFXu++kvCNDmN8L6utT7ynYlQptn1s2VFsVPRHx2A5tehkUAATqsejKafARqE6D3ErofyHI9LVpLsa7MV45OIyFAx8O9gS736/jaROgVGvMWsuvGw8XVEICACSBAuQ8gMJpAbQLUFDyHLdcJNZ4T5/Pi/9LDGwwBOn7R/NrbBxJsOb5rLz18f/v/CE8DoEEAAgkEEKAJ0HCpgkCNAtSF9Skwb81UYcfaM1OsLsMgQNNo+yShPWT7pbn3xutgZeoTk27pTcYkCoECCSBACywKKRVBoFYBelfR98ISv1bN0fyKckmOQB3GQIDGYPvJt/cKbXOFfCzDdG9v33RkujueEIDANAEEKPcCBEYTqFWAmoaPEbw4043hV5Trym7MFK+LMAjQOOX7KcThsu3ioYqI4P1tvcfnpUVkQxIQGAABBOgAisgQWiFQswA10JxHLvpp2A6tVKmdoAjQPFz9+8Wi7Z2yvj4N9V6kr5QdJft7HixEgQAETAAByn0AgdEEahegywnL6bJci0p2VSw/EetDQ4DmrdLdFc6vrveW5dplIW+Go6MdoC/vL+v7wQpdsKIPCIxNAAE6NjIcKiFQuwB1mb2R9yWyXNvreOPyy3tw/yBA2ymSFyntKNtLtl47XYSj+omnRechsj5NGwkPnAAQ6JoAArRr4vTXFwJ+8vfVhGS9N+DaCX6lujxXiR2TKbnDFOdlmWK1GWahgn8tsYPHyO/bib61uC2rgT5N9nbZJoUM+gzlcbTMJ3mlHvlZyFBIAwL9IIAA7UedyBICEIDAEAn4lfxmsifJtpF1+Yre58t/TnaizEd60iAAgQ4JIEA7hE1XEIAABFlJf4UAAARoSURBVCAwJ4E1pwSp30B4BX2u6R8+p91Hhp4jO1d2kezP1AICEJgcAQTo5NjTMwQgAAEIzE1geX37vlPmrZ2mbUV9fn/ZfWS3yvza/I8zPt6gz6+W/VRm8elraBCAQEEEEKAFFYNUIAABCEAAAhCAQA0EEKA1VJkxQgACEIAABCAAgYIIIEALKgapQAACEIAABCAAgRoIIEBrqDJjhAAEIAABCEAAAgURQIAWVAxSgQAEIAABCEAAAjUQQIDWUGXGCAEIQAACEIAABAoigAAtqBikAgEIQAACEIAABGoggACtocqMEQIQgAAEIAABCBREAAFaUDFIBQIQgAAEIAABCNRAAAFaQ5UZIwQgAAEIQAACECiIAAK0oGKQCgQgAAEIQAACEKiBAAK0hiozRghAAAIQgAAEIFAQAQRoQcUgFQhAAAIQgAAEIFADAQRoDVVmjBCAAAQgAAEIQKAgAgjQgopBKhCAAAQgAAEIQKAGAgjQGqrMGCEAAQhAAAIQgEBBBBCgBRWDVCAAAQhAAAIQgEANBBCgNVSZMUIAAhCAAAQgAIGCCCBACyoGqUAAAhCAAAQgAIEaCCBAa6gyY4QABCAAAQhAAAIFEUCAFlQMUoEABCAAAQhAAAI1EECA1lBlxggBCEAAAhCAAAQKIoAALagYpAIBCEAAAhCAAARqIIAAraHKjBECEIAABCAAAQgURAABWlAxSAUCEIAABCAAAQjUQAABWkOVGSMEIAABCEAAAhAoiAACtKBikAoEIAABCEAAAhCogQACtIYqM0YIQAACEIAABCBQEAEEaEHFIBUIQAACEIAABCBQAwEEaA1VZowQgAAEIAABCECgIAII0IKKQSoQgAAEIAABCECgBgII0BqqzBghAAEIQAACEIBAQQQQoAUVg1QgAAEIQAACEIBADQQQoDVUmTFCAAIQgAAEIACBggggQAsqBqlAAAIQgAAEIACBGgggQGuoMmOEAAQgAAEIQAACBRFAgBZUDFKBAAQgAAEIQAACNRBAgNZQZcYIAQhAAAIQgAAECiKAAC2oGKQCAQhAAAIQgAAEaiCAAK2hyowRAhCAAAQgAAEIFEQAAVpQMUgFAhCAAAQgAAEI1EAAAVpDlRkjBCAAAQhAAAIQKIgAArSgYpAKBCAAAQhAAAIQqIEAArSGKjNGCEAAAhCAAAQgUBABBGhBxSAVCEAAAhCAAAQgUAMBBGgNVWaMEIAABCAAAQhAoCACCNCCikEqEIAABCAAAQhAoAYCCNAaqswYIQABCEAAAhCAQEEEEKAFFYNUIAABCEAAAhCAQA0EEKA1VJkxQgACEIAABCAAgYIIIEALKgapQAACEIAABCAAgRoIIEBrqDJjhAAEIAABCEAAAgURQIAWVAxSgQAEIAABCEAAAjUQQIDWUGXGCAEIQAACEIAABAoigAAtqBikAgEIQAACEIAABGoggACtocqMEQIQgAAEIAABCBREAAFaUDFIBQIQgAAEIAABCNRA4P8AJKzT9acloM8AAAAASUVORK5CYII="/></switch></g></g><g><ellipse cx="90" cy="55" rx="90" ry="55" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 55px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;"><font style="font-size: 36px;">OAUTH</font></div></div></div></foreignObject><image x="1" y="34" width="178" height="46" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAC4CAYAAAD+FhqeAAAgAElEQVR4Xu2dCdi1RV3GCZcKNQUpt1RcSzRJDLNcIMO9MDXcQxQhUCBRwy0T0dwXTNEQ0S/EvVBzza3vwn0tMTIUEVBUMnBJcEPpvuF9eb/zbufMf56ZM/Oc31zXXN/yPvfMf34zz/fd5znz/OeXtqNAAAIQgAAEIAABCEAAApcT+CVYQAACEIAABCAAAQhAAAIrBDDIrAYIQAACEIAABCAAAQhsQwCDzHKAAAQgAAEIQAACEIAABpk1AAEIQAACEIAABCAAgfUJ8ASZlQEBCEAAAhCAAAQgAAGeILMGIAABCEAAAhCAAAQgwBNk1gAEIAABCEAAAhCAAASmEmCLxVREXAABCEAAAhCAAAQgsEgEMMiLNNuMFQIQgAAEIAABCEBgKgEM8lREXAABCEAAAhCAAAQgsEgEMMiLNNuMFQIQgAAEIAABCEBgKgEM8lREXAABCEAAAhCAAAQgsEgEMMiLNNuMFQIQgAAEIAABCEBgKgEM8lREXAABCEAAAhCAAAQgsEgEMMiLNNuMFQIQgAAEIAABCEBgKgEM8lREXAABCEAAAhCAAAQgsEgEMMiLNNt1x7qDuruR6k1Vf0P1qkv1Kvr1akv1+/r1GqoXqV6o+kPVHy39+n/69RzVs1W/rvrTuuHTGwQgAAEIQAACi0oAg7yoMz/suK+j5vZU3UP1t1R3U/3NYbvY7htq70uqp6t+SvWTqmcM3AfNQQACEIAABCAAge0wyCyCCAE/Bb6D6l1U/1R110gjA2j+R218UPUU1a1L5nmAZmkCAhCAAAQgAIFFJoBBXuTZTx/770lyoOpB6dIqis+oly2q/6Rq80yZTsDz+bfTL9v0in31Uz/R773cUQN4Y3AQRyytu6C8OdkNFdFHg1H9vXQvSNR+Ttd7KxZlGAKHqpl3JDYVnYN3qZ9DEvtq/fKdFKD/P7lyINDI+g90g6Q0AQxyacL9t++nxTZAh6nu3tFw3qlYt6j+i+rFHcVdO9TT1GHuNwCvUBuPqR14gf7+TG2+LdiuDcmxQW2Lst9RUKcGA7NB+KtE7SWJ13P55gT8EOP4REjROfhX9XOPxL5av9xbBP3uS6RE1n+kHzSFCWCQCwPuuPlfVuwHqz5T1S/V9Vq+rMCfqnqy6i96HUShuG+jdj8/QNt+odJP/348QFvzbAKDvEIfgzzPlZjfNwY5jyEGOY/fKNQY5FFM4+CD2EctvkT1xoO3PL8G/TTMWwn8RDn6pGR+0Zfp+cVq1lsDhij3VSNvH6KhObaBQcYgz3H5Ddo1BjkPJwY5j98o1BjkUUzjYIPwU6NjVP3y3ViL98rur+psGItcfkWD9z7tob4d+Ge19eedA8UgY5A7X8KXh49BzptJDHIev1GoMcijmMZBBuF/UI8bpKU+GvGe2X9QXdRtFzlmcKMZ3lk/OL+P6V83yhwm7EFeQRrZg8m3OsPeOBjkPJ4Y5Dx+o1BjkEcxjVmD8BNEG8WHZLXSp/gDCvsA1ejLGH2O+rKovdXEKfqGLJH/lIfsP7ctDPIKQfYg566m+eoj92L0Qwov6U3OdeQD4nxXC72vSwCDvNgL41Yavr8av/kCY/ALZt5zvXWBGFxXYz23wHg/pjadKq3XgkHGIPe6dlfHjUHOm0meIOfxG4UagzyKaQwNwiffLZIpnAbJqeycP3kRymM1SL+EWaLcTI32esIhBhmDXOKemEebGOQ86hjkPH6jUGOQRzGNyYPwS3gfSlaNX+B9yc7pO/YyRO7jjRg9TT94VqcAMcgY5E6X7pqwMch5M4lBzuM3CjUGeRTTmDSIvXW1997WLs6YcLbqN1W/pXqeqv/uh6o7qjqP7rVUr616HVX/AzWPk7WOVr9Prw2nYn8+DdEnRJUqZ6rhm6pG9zOWimuWdjHIK5TYgzzLimn3Ggxy3txgkPP4jUKNQR7FNM48iLvpSr9QUaN4P6qPOn2vqp9YRgzTFaS7teo9VW1e9qgRuPrwFoSXVuqrdjce1+GFO/0Dtd/j0dMYZAxy4VujWvMY5DzUGOQ8fqNQY5BHMY0zDcJG8wszXRm/6C2SOjvC+1W/E29mQ6VfLrPJ90t1PpiiZHGGh3eV7GAObe+gPr+tOlTu442G8LIKJrwEPgzy/AzyDyqsyxJrptU2/0KBnZQYXOQhhrsgi8UkaLJYJC68Vi/HILc6M8PG5S0Mn1UtcTKes0A8SfUE1Z8MG/amrdns+SjsFxXsc3e1/e8F26/d9P3VYY0XEb0mfr3yehiCJQZ5fgZ5e3XtOu/yWwrgP4NBHC/do4PaoWUXBxrEIK9A4wlyYAGNTYJBHtuMrh2Ptyl4q8O9Cwz1uWrzearfK9D2rE163/JRqjbLQxfvkb6NqvdNj6H4iXiJdbAeGz/lf2dn0DDIKxNWew9yK0vFBvm/g8E4n/whQW0LMgzyyixgkFtYkXOOAYM85wmo0L3N49Avnb1BbT5V9awK8c/ahbeQOHXZ0Mdk2+TZ7PVecv7Bj4z9rRI9ICKcowaDjEHGIKffgGyxmGTGFov0NdSkAoPc5LQMFtTQGSu+rMi8t+3Tg0U4fEP3UZOvUx1yn62Nk5/C91wer+BfWHkAO6m/71buM6c7DDIGGYOcfgdhkDHI6aumAwUGuYNJCoZ4Zem+qDrUKXnOSuEnqRcE46kpu4U626o6VJo4b7W4iapT0vVYfJ/7a+PIWni+dEcGB/0o6bw3vZeCQcYgY5DT71YMMgY5fdV0oMAgdzBJwRCPkO7FQe1qmY+j3k/1ooHaq9HMLurEh6EM9WKi91s/uUbgBfq4ndr8VKBdb5PwC5hfDWgt6e3oaQwyBhmDnH6zY5AxyOmrpgMFBrmDSQqE6BfXnM5riOL9VI9T/fkQjVVuwweOvE/V+5OHKLdSI87p3Ftx2rVDA0F7u4rT9n1C9fYBvSV+8u7DQ3ooGOSVWeIlvfQVy0t66cxaVeS8s8Ee5FZnNTEuDHIisE4uf5XiPHCAWP9abdTetzpA2BNNOMXdezIM3raNfUR/2FM1+rb30GObpb1o7uNtU7XZXNtkR8pTJHpORDgHDQYZg8wT5PQbjyfIk8wwyOlrqEkFBrnJackK6rZSO+dxbnmMGnhFbiON6K+qOD6sOsRJfA9XOyc2Mq5ZwthXF/kAl9Sy7WEf15P4G6kNLF3f09HTGGQMMgY5/UbHIGOQ01dNBwoMcgeTlBCi59NPOe+QoFnv0h5TdE0b8s10gbNw5Ba/sOev336W21AlvZ+e+6ju1LL6uOh/UwN7pTaydP3v69eWM58sDwuDjEHGIKff5BhkDHL6qulAgUHuYJISQnywrnWO4pxiA+gsED1kq0gd50ESHJcqWuf65b25AzRVtIkbqPWzAz2s99TXW3a8dSdSjpHIL422XjDIGGQMcvpdikHGIKevmg4UGOQOJmnGEH1i3lmqfrqZU7zH9pScBhrWer374I/c0+R6OTzEe8idpi21+BCYZ68SOWXeeakNLV3v/cw7q/40qK8lwyCvkOYlvfRVx0t66cxaVfCSXqszUzEuDHJF2IW7GuJQkKMV49Cn7hUednLzzmxxumruQSLel9vyEdQ5uY83yjwR3a7hSfoT1Xcnz1ZdAQYZg8wT5PR7jifIk8x4SS99DTWpwCA3OS2hoHx63MNCystEn1S9s2ove2szhrrd/SR2buec8kSJI09nc/pM0Totm9OzpRbvYfc6WK/4FMXoC4p+UfCBqcFUvh6DvAKcJ8jpi48nyOnMWlXwBLnVmakYFwa5IuyCXTmVWe6eYb/EdkbBGFtr2obNGR6ipfXsDM5AckhgcI+U5rUb6HLXWetHT2OQMcg8QU7/R4MnyJPMeIKcvoaaVGCQm5yW5KByXqByZ36x76HJvfYtiJ4ut+2oW92vfRUFGT0We5qJPVlt3zc49Y+QbktQW0OGQcYgY5DT7zQMMgY5fdV0oMAgdzBJM4ToFFo5OX6dFu7jM/QztktyTogzC5s9m77WyoMU0BsDQb1JGmdC2axE8yq7za2qfxSIq5YEg4xBxiCn320YZAxy+qrpQIFB7mCSpoS4q36ec/zxqdLv1j+G0Ai8J9amMKf4EJILcxoooPXx2ncPtDvLi3Qer7NSRMuNJDwrKi6swyBjkDHI6TcZBhmDnL5qOlBgkDuYpCkh+hjfJ2UMo/WvvTOGNlV6ZV3xdVWnMIuW1p6+76KBfC0wGJvea6rO8pLm63XdQwJ9WOK1+rygtrQMg4xBxiCn32UYZAxy+qrpQIFB7mCSNgnxivrZuRkGz6bo2qoX9Y0hK/onS706529Kg4fp4penCApfawPqD02p5SUSPG5G0T667h0zXrv6Mp9maBPSYsEgr8wKWSzSVyhZLNKZtaogi0WrM1MxLgxyRdgFurqN2vx8Rrs2Uk/J0I9BmnMAhsfv9Hr7NQJie8XxFdUbB+LxHvbPzqj7VV2X86Eqpa8ZQxrkMgwyBpknyOm3Ek+QJ5mRxSJ9DTWpwCA3OS0zB+WUXCfMfPXaC1veD5oxrGTpm6V4QLLqMoHTvflgjRbKHyqIjwUCiTzV9brz+ouUlKfVkfajGgwyBhmDnH73YJAxyOmrpgMFBrmDSdokxFfqZwcHh+Anz7cNascmc75g5w2OFh+jfH5UPKDuOLV1UKC9yKEnd1M//o8xUlL2O0faj2owyBhkDHL63YNBxiCnr5oOFBjkDiZpkxC/oJ/dOjiEl0l3eFA7NlnuVpW7CsgH5wzFR2f/IBjDDaU7J1HrFxz/VzV6ZPe9pH1vYp+lL8cgY5AxyOl3GQYZg5y+ajpQYJA7mKQNQsxNt+Vjg0/qd/iDRu6XHWfJ3rBRpy1kZnD+Yh/4klo+LMEfp4qWro+e1md5i4fTYJAxyBjk9H8MMMgY5PRV04ECg9zBJG0QYnS/6XJzv63fnN7v8AeP/P1q0U+CI+VtEt0vIhxQ8yG1dZdAew+X5sSAzpK9VP8tqLXsGqrfz9APLcUgrxAli0X66iKLRTqzVhVksWh1ZirGhUGuCHvgrg5Ve94mESneA2pz8ouIeKSap2lcRwfH9j/SXSuoHULmrBVfDTZ0demiWzNy0wzmmPPgcDeVYZAxyDxBTr+zeII8yYwsFulrqEkFBrnJaZkpKKcXe9hMV669yHs/vQeUskJgb/32AxlAriTtxRn6HKlT9f1doAFvsfFWm5zyYomPCDaQs70j2CUGeUZwPEGeEdQ2l/EEOZ1ZqwqeILc6MxXjwiBXhD1wV35iGMl36zD+VvWZA8fTe3N+ov7djEHslKmPdu3cx2er+h/01OLjqL21JKfcXuJPZDQQeUEwo7tNpTxBXsGDQU5fZRjkdGatKjDIrc5MxbgwyBVhD9jVDmrrwoz2hjBGGd03Kz1PkUWPnZ5XTuk7KeZTAkS9LeR6qrlPvXMMusM+UvUFgfhLSDDIGGS2WKTfWf8lSfTo+fTe6ij8wT16WihbLOrMUfFeMMjFERfp4Dpq9ZsZLdsEfidDP1ZpTtq83QTl1DmAebX6PCDQ7/Olcf7jIYqP6vaR3ZESOaQk0s8sGgwyBhmDPMudwjWbEcAgj2R9YJD7nMicf8Q9Yj/1u6TPoReNOpoJwkHdWfUjRaNb2/iv6a+iWSB2l/bfB4o3N4/0kLHkDAmDjEHO+bd1UbdY5NxzY9RikEcyqxjkPify9xX2J4OhO4OFjRVlLYGcI6f3UXPvrAzVL2n6Zc3U4q9Eb5kqmnJ9zp54b7HwVot5FwwyBhmDPO+7sP/+Mcj9z+GlI8Ag9zmROcf8nqkh36TPYRePOufo7nkcvOIcxHsFqDxeGmefGLL4xc9nBBscaj90sPvLZRhkDDIGOfcuQo9BHskawCD3OZH7Kuy3BEP/jHS3C2rHLnOqNKdMixTnpT42IgxqbirdV4Jav6F9blC7kWxX/eC0jDZbeHEUg4xBxiBn3MRILyWAQR7JQsAg9zmRByrsVwVDJwfyxuD8ZPWFQa4+aORZQW1EFj3YpGRSfxtkG+VI8VaR/SLCATUYZAwyBnnAG2pBm8Igj2TiMch9TuRfK2xnIYiUN0j00IhwATSP1BhPCI7zRdI9IahNlV1BgrNUI7mPvW/59akdzni99xE/b8Zr17ss51S/jG4vl2KQMcgY5CHupMVuA4M8kvnHIPc5kTlptV6uIR/W57CLR/1A9fCmYC8+9vvwoDZVtqcEW1NFS9dfTb/+MKidJsvZ9uG257GPe9sxYZAxyBjkaXc5P59GAIM8jVAnP8cgdzJRq8J8hf58SDB0bwPw1/OUtQQeob96TRCMTyb0i2o1ymvVyf6BjrZI4zGWLJ9W43sEO/BR334BdV4Fg7xCnpP00lchad7SmY1RgUEeyaxikPucSO/X9FflkeLtGdF9tpH+etI8VsG+JBhwicwQ64XibQjfC8a4t3TO9Vyy/JUaPyajg+tL+40MfY4Ug4xB5glyzh2E1gQwyCNZBxjkPicyJx3ZYzRkP4GmrCXwdP3VUUEw3r/sJ7uli19k+8dAJ7VSqdngnhOIb1lS64PGeiFikDHIGOSMmxfppQQwyCNZCBjkPifyOQr7ScHQ/SKVD2agrCXgp8d+ihwp95fo5IgwUXOKrr9TosaXP1c1ehx0anfRGN1PiUNMZo0fg7xCii0Ws66alevYYpHObIwKDPJIZhWD3OdE5mSxsLmO5vrtk9bsUW/RpQ+f/fKJK/9Yf/pwUDurLOfp1q3VyRdn7Sjzur+U3mYhWn5Xwi9ExRk6DDIGOeceW2SDHM3Ln3G7FpXurNbvEuwBgxwE15oMg9zajMwWz6N02fGzXbrmqt7/EQ8OeybZ23XVfWa6cu1Ft9VffT6onVUWPa3uVHWw26ydDHDdtdTGtzPacaq46DckGd1uh0HGIGOQ0++gkrnV06MZRuEUml8PNoVBDoJrTYZBbm1GZovHX+f/02yXrrnKn/SdzoyylkDO1gCnOPtqQahXVNtfU43kPnb6Oaehq1nep858Ol6k1NovvTo2DPIKEbZYpK/c3h8+XJI+5EsVGORJcBjk4EJqTYZBbm1GZovHX+d/cLZL11w171RawbCryE5XLzcP9uSv5M4PameR+eu+aAaK60r7rVk6GfCa/dVWzkuLd81Y49FhYJAxyDxBTr97MMgY5PRV04ECg9zBJK0T4u76u88FQ/c2AG8HoEwS2EF/vDADypWkvThDP026RRdE9ke/W7o/mdZ4gZ/vpDZzPjA4U4dNds1yT3X2nmCHh0p3bFDboiznCbJP+Xxii4OaISYM8gyQVl2CQZ4EwhPk9DXUpAKD3OS0TA3qJrrijKlXrX+Bc8w6FRdlksDt9MdPZUApeS/tqLguCMb2IOneHNTmynL2dLvvkqf+rTe2P9JfRl+0xCCvEH2GfntU7uKZkx6DnA4eg4xBTl81HShK/qfewfC7DTH36Zz3s/6829GXCfxANfuqYNNnSucPLaVKzgl/jun/SgU2pV0b3JzyEInfmNNAovb2uv4TiZrlyzHIK+CcTtBpBXssGOT0WcMgTzLjCXL6GmpSgUFuclqmBmWD+7OpV218wa760Zcy9GOU5hy+UvrFx48K+B3GCH3KmGr/x3sbxRPNRIJBXplM5xJ/aafrFYOcPnG179P0CNMVZLFIZzY6BQa53yn9gUKPPqH7C2lP6nfoRSL3nm7v7Y6UIyTKOV55sz5voR/68IxFLdfTwL9ZafC/rX6iHxzHZpCdNzuai9p5sKPfxlSa6g27wSCnzwAGeZIZT5DT11CTCgxyk9MyU1D+KthfCUfKyyU6LCIcqeZXNK4fZYzNT3c/nqHfTOr9nM5/vKil5IeP1Ux30V84lV6kzPOI7Ei80zQ5LwL3/AEcgzxtZaz9OQZ5kgkGOX0NNanAIDc5LTMF5T1+0TfFyWQxiTjnq3W3dBXVi2aatbSLvJXmXNXfSJON6uqah5zkHHDydFE/ekTk/aHPW3siZV+JonnaI/0NqcEgp9PEIGOQ01dNBwoMcgeTtEGIOTlb3eRVVXPSmvVLbm3kB+uvvAc5Ukp+2NhbATlv9aIXnwJoo1y6XF0dfC/YyQukOzKobVF2NwVl4xMpTivo9II9Fgxy+qxhkCeZ8QQ5fQ01qcAgNzktMwXlwx/8dDFaSm4LiMY0L13OCXol/zF8nYA8bF5QGurX35Y4M0LpcmV18JNgJ72forZ62D5y3Wn6IsUHGUXT5UX6G1KDQU6niUHGIKevmg4UGOQOJmmTEH1WfOToYTfZ85vmQ87aDdTY2RkNlkpFlpvKL2NIzUlrHj0dffn1DaL20ObIxQN6sKQeU6TcUqJeXyzFIKfPOAYZg5y+ajpQYJA7mKRNQjxRP/MLMZGyVSIfjLDoxS+BvTgDgo+m/kqGfiPpAfrBqwu022uTtZ5KflqA9ghAGptJeLQYRE8G9FYVf9DosWCQ02dtbGvfBEjzlr4ORqfAIPc9pTl7Zz1yp7U6vW8E2dE7lZVTWkWKD+CwGbgkIp6iyclSUiCcuTf5GkXgDw2liw8m8emDqcVPuf2S31jKCzUQZ+ZILb4nfi1V1ND1GOT0ycAgTzIrue0ufXZQhAlgkMPomhDmZl94jkbxlCZGMp8gcnMMv1Nh71MgdH9F/Z8F2u29yRovlj5bkKL7na8h7fd7h7wUf/SY8JIvrdZAi0FOp4xBxiCnr5oOFBjkDiZpkxCvpJ/9NGMIftqzc2YbGd3PXer8ws4zHC1+0vjmqHgT3TP1s78p0G7vTXpf7JsKD8KHXPiFu0jx1ozPRoQNavzNkrcPpZa3SvCAVFFD12OQ0ycDgzzJjCfI6WuoSQUGuclpSQrqQ7r6LkmKyYvvqz9G31bP6Hbu0u0VgfcO3zgYiT9cOD/xj4P6jWQ5uY8/okadYqvl4nR6frExUt4r0b0iwgTNPXXtexKu3/ZSZxx5fVDbkuwKCubiYEDPly6anz3Y5aAyDHI6TgzyJDMMcvoaalKBQW5yWpKCeoyu9sl40VLDdERjK6m7vxrPOczgedI/qUCAOflnH6F4thSIacgmbeC9NSVanN7wW1HxDLrf0TXRnMt+2TOyb3eGsKpeciv19sVgj70fuY1BTp94DPIkMwxy+hpqUoFBbnJakoLaUVdfkKRYe/Eu+qucVGeZ3VeX+yntaaqRr5CXgy31gqOfQEafsDo13Her00zr0Md6+4W2q6XJLr/6cP3uZUHtLDK/YBbdR3ymtDeZpZPGr8nJYNHzISGeFgxy+uLEIE8ywyCnr6EmFRjkJqclOahXSHFIsmpFsEW/9dPHRSn7a6CvzRisD0Fw2rGhyzXV4P8GG32LdA8MamvLTlCHjwx2WuMlMH942jUYn1/8/O+gthXZyQrEW68i5doSnRcRNqLBIKdPBAZ5khkGOX0NNanAIDc5LclBOU2Z05XllDtL7D2sYy9+gum9x9EDVsxnX9Wc7RkbMT5IPzguOAF/Kt27gtraspx9vo7VWwBsYksV/wd3WLBx59U+JqhtQeZvV/yNVOQJ/5els8HsuWCQ02cPgzzJDIOcvoaaVGCQm5yWUFAflcrHR0eLT776XdWfRRvoRJe7Z9sv5/26avRI4s0wRQ+p6C0biY909pPyiAkzv2epPq3gevOT+Gi2DH/I9IfNXosPD4oeEz2G47YxyOkrF4OMQU5fNR0oMMgdTNKMIfqppr9mzylPkPhFOQ00rrUhOzfDmHl4pXJH53wL4D253pvbU/GTcj8xjxTvYfbLej+PiGfQ5B4/vpv6iL7oN0N4RS/xvyH+tyRSfKrnSRFhQxoMcvpkYJAnmfEEOX0NNanAIDc5LaGgflmqc1Sdeiyn3HCpnZw2WtX6qePRmcHdTPozMttYT27jHc2K8QfSfrJATCWb3FuNfyCjAz/p3Jqhnyb1PtrovfQ6afeb1kGDP79+5r1f6t6oiQqDnE4bgzzJDIOcvoaaVGCQm5yWcFC5B1+447ep3i8cQbvC3FMHPTKn04vuTd2MjA98+UbQkDlzwk1VSxx3XXI2PebzVaPbLPyi36MKBrhFbT88o33n1/5ahn4e0pwDasZy1DYGOX3lYZAxyOmrpgMFBrmDSUoI0S+efT3h+o0u7T2X6epxXUV/4ewHOWndbACsj6YA22xacl5a81Nx78ntsRyroJ1SLFo8rxdFxVN0PvTDT4KjxZllvN+9l7K7Av1cRrCvkfaADH0rUgxy+kxgkCeZ8QQ5fQ01qcAgNzktWUHlmo7lzg/Ub16dFUk74lcpFI8np/ipup+ulyg+rjp6PG/PX2vnvBDmeTAzH21coth8/zCz4btL//7MNmrI/RT/P1Sjp0o6xjup+kXh3gsGOX0GMciTzDDI6WuoSQUGuclpyQrKBx04jVl0/+S2nfsr5hOzopm/+KkKIfcJ6zvUxp8VGoozYvjpdKR437H3H/daclKKecw+kW+fgoP3y4/+NiVanF3EB8p8M9pAJZ3vcb9gFy1O7+Zx9rbNZ73xYpDTVwEGeZIZBjl9DTWpwCA3OS3ZQeUcV7y68wfrL6Ipr7IHktmAzc0Qp645q8EQW1fWG87B+stXBsdpbTRvcrDLwWUvVYs5GThKHkwxxL71rRrfXVUvHpzcMA36ZcJ/zGyq99zP2w4fg5y+GDDIGOT0VdOBAoPcwSQFQ8w5rWx1l3+uv/jnYBzzkuXmO16Ou/R+bO/79P7PSPHT5+jJe5H+SmjuqEZzDqhpeX6WeR2l3zyjBLzMNnPM4LZdX0t/iH4LkjmEweU5THrPAx39BgCDjEEe/EZsoUEMcguzUCaGHdWsj7wdYquFIzxS1U9jf1wm3MFa9Ul5zjYxxAtDn1E7f6ha6umf8+V672eklNz2EYknqrmChN6CEF2npY+edqaM46OD20Z3H/3+XwZoZ6gmvGfYp0FGuS/H4W+X/C3TWAoGOX0mMciTzNhikb6GmlRgkJuclsGC8vHDQ/6n7JRij1X13s8Wy40UlF9422Og4HyyYNyoC54AAAvjSURBVO4R3puF8lz98InBWO8v3clBbWsyH07zuIygdpX2Sxn6zaQ76Ienq+YcTb7cvnNdP111nqdVOr2eM58MdRJhz4eirDfvGOT0GwmDPMkMg5y+hppUYJCbnJZBg3q9WnvIoC1edsCD9x2eNnC70eZsYh6vmnsIyLb9l/7qPue4Zb/85a+1fxQF1pju9ornExkxed5tPEsVv6A5VAaTjy3djz7Up3Zxvuw3qA71AfKYpX8Hao+jZH8Y5HS6GORJZhjk9DXUpAKD3OS0DBrUzmrNT36jBzJsFoz/g/ThAhcMGvHsjfn0QKdfe77qEE/4lnuu8R//vdXZu2Yf6sSVve91XD3s7fUX31KNft3vQ1Z8AuQvgjxnkb1PFzlt2xDFH3AeqlrrmxhvY3GWitcOEfxSGx6DmX93wDZbaAqDnD4LGORJZhjk9DXUpAKD3OS0DB5U7rG+0wJ6ry54t+oHVf11dOnirBKPVPXX8kMbf5sWm+5S+46X2bxFv9k3CGpP6U4JaluV5Ww38ZhKM3Eas6G3cdhY+DASb4Oy4Ryy+EOHn8z7BVub8eiHj41iGkMKyPXGhkFOX4UY5ElmGOT0NdSkAoPc5LQUCcr5Yv1iV+nip3l++cf/aNrEDXHSmbcj/J6qjb5PnfN//CWKX/iy0co9IGJabN4e8e1pF23w8xpPS4OhZcn8tf+nM1qo8VR9iKPcNxqiU62dpLpVNfrhzKbYHP0Bb3/VoU3xcuzeYnUP1ZJP7DOWQpYUg5yOD4M8yQyDnL6GmlRgkJuclmJB+Ymln1zWLM4E4SwFTkfmVFDfWarn61dXm9GfqPrlIZ9e5ur0ZT4hzv9Z3VJ1qD2Tm437v/RDG3B/1V+65KSg85YWG7WxFf9b5H250a0yfgLrnMhDfCDbiK23KjjdoTNSlCq+R3zPOO+216LvHf/qD1TfU/VBQP6A5XvE412u19Xv/bJiKVO8PF5v17qdqu/dMRYMcvqsYpAnmWGQ09dQkwoMcpPTUjSoh6l1f61LWSHgF6ec8aPWfkpnxrh1cAL8gcFmfozl7zSop2QMrEa+bm/p8QmGNqOLWMa8/jyfGOT0VY1BxiCnr5oOFBjkDiapQIhDp38rEGK1Jr3n+EGqJZ88bjuYnNzHpXP+VoO+QUe5J9fVyg3tdIL+kDP0/vd585/W/710gd83GHPBIKfPLgYZg5y+ajpQYJA7mKRCId5q6T+76FfahcKq2uwW9XaQas28tC9Uf05JFymHSeRDUMZcvqrB3ThjgN5i4G08pYu3/XxIdVFM8lhfylu9TjDI6XcOBhmDnL5qOlBgkDuYpIIhOgXcW1X3KthHq00fqMBeXTk4p6WzeYuaKu8zrbFHujKWie6O0p9ycho/WvpXVhqA8wrbHOQY+kqhZnXj9Hbvz2qhHzEGOX2uMMgY5PRV04ECg9zBJBUO0S/H+TQ3v/y1CMXbFHxwSo10dKt55mxt8Vfb/op77MV7s3NOL/QLbn6JrFbxy3JO01Yqs0qtcazXj18YvFvmfMwz/kjfGOR0ahjkSWa8pJe+hppUYJCbnJa5BHUL9Xq86h3m0nudTp+tbp6h+tM63a3pxUdD3zfY94Ole1NQ25vMH15unhG0cxbX/ADkkxz9n+IBGTG3Jt2qgPZTdTaNRSoY5PTZxiBPMsMgp6+hJhUY5CanZW5BOY3VX6oeO7cIynTsQ0ycHeHUMs3P1Op1dJVTdkWLt2WUzs8cjW1o3dPUYM6x4d6ikaOPjmcvCU9Q7XnLhdPlHa56ouoY8xxPm1sM8jRCa3+OQZ5kgkFOX0NNKjDITU7L3IPaSREcqvoE1eh+2bkPQgE4HdeRqh9pIBjzfFkwji3SPSKo7VHmFGqnZQQ+z8NUfnVpzR2VEf+8pE7/6HveWysWtWCQ02ceg4xBTl81HSgwyB1M0hxDvIb6PkT1yZ0Z5a2K9yWqTuF2yRz5bdt1Tu7ju6ohH+O9SMUGOSfX8B2ld37reZVd1PHBqn5psPUPmT7Fzx/ePjcvWA31i0FOnwwM8iQzniCnr6EmFRjkJqeluaB8up1fMPMhI/duLrrLAvJTr+NU/dXwGY3FuKPiuSAYk8d1PdXo8cPBbucu84cy7xmPlsdK+NKoeEDdVZfumyP0a86+6gFDurQpb6VwykG/dzD2zCgp7G6oi89KEWxz7Yv0ez+B77X8QIFHPsy9TTofbz6m4nSR5wUH9Bzpcg48CnaLbGgCGOShiY6/Pf/D4X8MbZbn/UKfv0p/j6qzCPgpxqKZyPGvtvGMcHsNxbmT/W2AP2TOI+vFl9Xv21U/oPpR1R+PBy8jgQAEIDAsAQzysDwXrTU/WfZ/+jbKey7951+SgZ+m2gh/WPUU1TNLdkbbEChI4Jpqey/VO6s6g4xPWPSHz6GKnxD7pVQfS/7xpXvmnKEapx0IQAACYyeAQR77DNcd3xXV3Q1U/TXlLqp+m9+HKVxf1V/d+etm19VGwP+Zf1/VX/G5+vdnq35F1dslbIRdFyWLQ91Zo7dWCFx9m3vGh8Is3y/Lv/oecko5P/n1veDqe+fCpd/7EBrfMz6NsMZpgq1wIw4IQAACgxPAIA+OlAZnJOC157RybIuYERiXQQACEIAABCBQhwAGuQ5neoEABCAAAQhAAAIQ6IQABrmTiSJMCEAAAhCAAAQgAIE6BDDIdTjTCwQgAAEIQAACEIBAJwQwyJ1MFGFCAAIQgAAEIAABCNQhgEGuw5leIAABCEAAAhCAAAQ6IYBB7mSiCBMCEIAABCAAAQhAoA4BDHIdzvQCAQhAAAIQgAAEINAJAQxyJxNFmBCAAAQgAAEIQAACdQhgkOtwphcIQAACEIAABCAAgU4IYJA7mSjChAAEIAABCEAAAhCoQwCDXIczvUAAAhCAAAQgAAEIdEIAg9zJRBEmBCAAAQhAAAIQgEAdAhjkOpzpBQIQgAAEIAABCECgEwIY5E4mijAhAAEIQAACEIAABOoQwCDX4UwvEIAABCAAAQhAAAKdEMAgdzJRhAkBCEAAAhCAAAQgUIcABrkOZ3qBAAQgAAEIQAACEOiEAAa5k4kiTAhAAAIQgAAEIACBOgQwyHU40wsEIAABCEAAAhCAQCcEMMidTBRhQgACEIAABCAAAQjUIYBBrsOZXiAAAQhAAAIQgAAEOiGAQe5koggTAhCAAAQgAAEIQKAOAQxyHc70AgEIQAACEIAABCDQCQEMcicTRZgQgAAEIAABCEAAAnUIYJDrcKYXCEAAAhCAAAQgAIFOCGCQO5kowoQABCAAAQhAAAIQqEMAg1yHM71AAAIQgAAEIAABCHRCAIPcyUQRJgQgAAEIQAACEIBAHQIY5Dqc6QUCEIAABCAAAQhAoBMCGOROJoowIQABCEAAAhCAAATqEMAg1+FMLxCAAAQgAAEIQAACnRDAIHcyUYQJAQhAAAIQgAAEIFCHAAa5Dmd6gQAEIAABCEAAAhDohAAGuZOJIkwIQAACEIAABCAAgToEMMh1ONMLBCAAAQhAAAIQgEAnBDDInUwUYUIAAhCAAAQgAAEI1CGAQa7DmV4gAAEIQAACEIAABDohgEHuZKIIEwIQgAAEIAABCECgDgEMch3O9AIBCEAAAhCAAAQg0AkBDHInE0WYEIAABCAAAQhAAAJ1CGCQ63CmFwhAAAIQgAAEIACBTghgkDuZKMKEAAQgAAEIQAACEKhDAINchzO9QAACEIAABCAAAQh0QgCD3MlEESYEIAABCEAAAhCAQB0CGOQ6nOkFAhCAAAQgAAEIQKATAhjkTiaKMCEAAQhAAAIQgAAE6hDAINfhTC8QgAAEIAABCEAAAp0QwCB3MlGECQEIQAACEIAABCBQhwAGuQ5neoEABCAAAQhAAAIQ6IQABrmTiSJMCEAAAhCAAAQgAIE6BDDIdTjTCwQgAAEIQAACEIBAJwQwyJ1MFGFCAAIQgAAEIAABCNQhgEGuw5leIAABCEAAAhCAAAQ6IYBB7mSiCBMCEIAABCAAAQhAoA4BDHIdzvQCAQhAAAIQgAAEINAJAQxyJxNFmBCAAAQgAAEIQAACdQj8P9yXgiKMBi1bAAAAAElFTkSuQmCC"/></switch></g></g><g><path d="M 180 55 L 420 55" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 55px; margin-left: 201px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><font style="font-size: 36px;">U</font></div></div></div></foreignObject><image x="188" y="34" width="26" height="45.75" xlink:href="data:image/png;base64,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"/></switch></g></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 57px; margin-left: 392px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;"><div><font style="font-size: 36px;">D</font></div></div></div></div></foreignObject><image x="379" y="36" width="26" height="45.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></svg> +\ No newline at end of file diff --git a/docs/figures/old/context-map.png b/docs/figures/old/context-map.png Binary files differ. diff --git a/docs/figures/old/detail-context-map.png b/docs/figures/old/detail-context-map.png Binary files differ. diff --git a/docs/figures/old/general-taler-working.png b/docs/figures/old/general-taler-working.png Binary files differ. diff --git a/docs/figures/old/seq.mermaid b/docs/figures/old/seq.mermaid @@ -0,0 +1,32 @@ +sequenceDiagram + Customer->>Exchange: Start KYC Process + Exchange-->>Customer: Redirect authorize endpoint + Customer->>KYCID: + KYCID-->>Customer: Ask email + Customer->>KYCID: + alt customer registration + KYCID-->>Customer Mail: Verification code + KYCID-->>Customer: Ask verification code + Customer->>Customer Mail: Get verification code + Customer Mail-->>Customer: + Customer->>KYCID: + KYCID-->>Customer: Ask to password register + Customer->>KYCID: + else customer login + KYCID-->>Customer: Ask to login + Customer->>KYCID: + end + opt verify phone number + KYCID-->>Customer: Ask phone number + Customer->>KYCID: + KYCID-->>Customer SMS: Verification code + KYCID-->>Customer: Ask verification code + Customer->>KYCID: + end + opt verify id card + KYCID-->>Customer: Ask IDCard scan + Customer->>KYCID: + KYCID-->>Customer: Face phone challenge + Customer->>KYCID: + end + diff --git a/docs/figures/old/toplevel-architecture.png b/docs/figures/old/toplevel-architecture.png Binary files differ. diff --git a/docs/figures/old/wallpaper.png b/docs/figures/old/wallpaper.png Binary files differ. diff --git a/docs/figures/phone-ekyc-process.pdf b/docs/figures/phone-ekyc-process.pdf Binary files differ. diff --git a/docs/figures/phone-ekyc-step-1.png b/docs/figures/phone-ekyc-step-1.png Binary files differ. diff --git a/docs/figures/phone-ekyc-step-2.png b/docs/figures/phone-ekyc-step-2.png Binary files differ. diff --git a/docs/figures/phone-ekyc-step-3.png b/docs/figures/phone-ekyc-step-3.png Binary files differ. diff --git a/docs/figures/phone-ekyc-steps.png b/docs/figures/phone-ekyc-steps.png Binary files differ. diff --git a/docs/figures/phone-ekyc.pdf b/docs/figures/phone-ekyc.pdf Binary files differ. diff --git a/docs/figures/project-arch.drawio b/docs/figures/project-arch.drawio @@ -0,0 +1,886 @@ +<mxfile host="app.diagrams.net" modified="2024-06-13T04:04:28.852Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0" etag="XYIyCK-HxrwRCw-S8VqH" version="24.5.3" type="device" pages="8"> + <diagram id="o8P-bL9D7UgNYaoWqKV_" name="toplevel"> + <mxGraphModel dx="4643" dy="2336" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="73i81SIOLEijjcjUkOuc-1" value="KYCID SERVER" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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TzDDQwABBP4uoNsBV69eLRMmTJD169fL0aNH5erVq2wR5FJBAAEEEHCMQNSoUSVFihRmNValSpWkSpUqkipVKsf0j44ggAACCARegABW4M1pEQEEEAi4wIMHD+TWrVsya9Ys6d+/v9kiSEEAAQQQQMAtAnHjxpVatWpJ69atTVBLV2rpg4IAAgggYI8AASx75pqRIoCAZQL379+XkJAQ2bNnj0nGPnPmTPN3CgIIIIAAAm4V0LxYJUqUkKpVq0q+fPlMEvg4ceK4dTj0GwEEEEAgDAIEsMKAxVMRQAABNwho4Grr1q2ycOFCk9dq48aNcvnyZTd0nT4igAACCCAQKgHdYpg1a1YpXLiwCWiVLFlSkiRJEqrX8iQEEEAAAXcKEMBy57zRawQQQOB/BHSboCZj//bbb+XXX3+VM2fOyO3bt5FCAAEEEEDAswKRI0eWBAkSmPxYmiurbt26kilTJs+Ol4EhgAACNgsQwLJ59hk7Agi4XuDu3bsmAbueJNivXz8TuLp3757rx8UAEEAAAQQQCI+AnlioCd/btm0radKkkdixY4sGuSgIIIAAAu4XIIDl/jlkBAggYKGABq10m+CyZctMYnZNyv7w4UMLJRgyAggggAAC/yuggauyZctKxYoVpUCBAmZVFknfuVIQQAABdwsQwHL3/NF7BBCwTODcuXPyww8/yPz582XDhg1y5MgR0ZxXFAQQQAABBBD4XwE9vfDFF1+UV155Rd59912T+D1atGhQIYAAAgi4UIAAlgsnjS4jgIB9ApcuXTK5rcaOHWtOErx58yYrruy7DBgxAggggEA4BaJEiWJyZRUsWFA6duxoAloUBBBAAAF3CRDActd80VsEELBIQLcJHj58WGbMmCHfffedScpOQQABBBBAAIGIC7z66qvStGlTc4phihQpJHr06BGvlBoQQAABBPwqQADLr7xUjgACCIRd4NSpU7J69Wr58ccfZeHChXLy5ElWW4WdkVcggAACCCDwRAHdSpgjRw6TK+uNN96QvHnzmqTvFAQQQAABZwoQwHLmvNArBBCwUOD06dMyadIkk99q+/btovmuKAgggAACCCDgXwE9pTBt2rRme2H9+vWlePHiolsOKQgggAACzhIggOWs+aA3CCBgocDFixelb9++MnToULly5Yo8ePDAQgWGjAACCCCAQHAF9JRCDWblz59f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sG/fPqlXr56cOHHCkfpRKXUJJE+e3EoHS5kypbpGuKH5tWvXpG7durJ582Y37uKl/yYAB9amTZsEGUD/FaYQ8llRkkCuXLlk586dxjhSDh8+LHXq1JFjx47Zul6NGjWyosACy0e2VTFOTgIkQAIkQAIkQAIk4DEBlKioVauWrF+/3uMxeCMJBEagSJEismHDBkEqoQmCwu1wBp86dcoEc31iI/b6cGAh64oOLJ8g5qD+JoAcapPakq5du1aqVasmqFFgp5QuXVqmT58uCRIksFMNzk0CJEACJEACJEACJOBlAr169ZJvvvlGXr586eWROZzJBL7++mvp0aOHMQgWL14sDRo0YFfPUKw4HFiIYIsaNSodWKHgyFsdQiBMmDCCjnyZM2d2iEa+VQMfEUjb69+/v28ncmH0zz//3GqBmyJFCheu5iUkQAIkQAIkQAIkQAKqEECUDLpNP336VBWVqacCBA4cOGDMvu3Zs2fSt29fGTZsmAIr41wVc+fObTmwokSJQgeWc5eJmrlKIHHixILWpKZ0H8SLsEyZMrJlyxZXEfnsuiRJksiaNWskQ4YMPpuDA5MACZAACZAACZAACfifwJ07dyRt2rSCGj4UEvAGgQ8//FCuXLnijaGUGOPu3btSoUIF2bFjhxL6OlVJOLCw940cOTIdWE5dJOrlOgG0JEUnC1Pk9u3bkixZMrl//77tJkeKFEm2bdsmKKxHIQESIAESIAESIAES0ItA9erVZcmSJXoZRWtsI9CyZUuZMGGCbfP7e+Lz589bB/0PHjzw99RazZcnTx7LgYW953+FRdy1WmozjPn++++lfPnyZhj7j5XLly+XKlWqOMbelStXWicLFBIgARIgARIgARIgAb0IrFixQipXrqyXUbTGNgLoPli8eHHb5vf3xHPnzrUKuFNCRwAOrK1bt0rEiBHpwAodSt5tN4F48eLJb7/9JmjHaorUrFlTFi1a5BhzkdPdpUsXx+hDRUiABEiABEiABEiABLxDAA2D8L396NEj7wzIUYwlED9+fKuDOp4nU6Rq1aqybNkyU8z1mZ158+a1HFgRIkSgA8tnlDmwXwh88cUXMnv2bIkbN65f5rN7ksePHwtqft26dctuVf53/vr168usWbMcow8VIQESIAESIAESIAES8B6BkiVLCiJnKCQQGgLImJk3b55EixYtNMMocy+cvti3ofwLJXQE8uXLJz/++KOECxeODqzQoeTddhNAVwe0+A3MG2u3br6YHwUACxYs6IuhPR4za9assm/fPo/v540kQAIkQAIkQAImE3j1j/FhTQbgeNtHjRolnTp1cryeVNDZBIYOHWo9R4E5IZytuWfaIWKoaNGint3Mu94iQAcWHwgtCMSMGdMq3l6jRg0t7HHFiD59+sigQYNcudRv14QPH16eP3/ut/k4EQmQAAmQAAmQAAmQgP8I4KASG8inT5/6b1LOpBWBWLFiyZw5c6Rs2bJa2RWcMXDWwflLCT0BvH/QOOy99957ZzAWcQ89X47gJwKffvqp9SJEBJAJ8uzZM0EI9/bt2x1n7qFDhyRTpkyO04sKkQAJkAAJkAAJkAAJhI7AH3/8IdWqVWPEfegwGn33Z599Zu3b0JHPBIGzN3fu3HLw4EETzPW5jfnz57ccWGHDvhutSweWz/FzAm8RQAcLtPVFJJYJcvToUav74KlTpxxnLiLhmjVr5ji9qBAJkAAJkAAJkAAJkEDoCNy/f186duwoM2bMCN1AvNtYAhUrVrQcWKbUvzpw4ICUK1dOLl++bOyae9PwAgUKBBnEQQeWN0lzLJ8RgPcVYZnffPONhAkTxmfzOGnghQsXSuvWrR1ZCJCF3J30pFAXEiABEiABEiABEvAegdevX8uYMWOkR48egowACgm4QwDlRvDsDBgwwJ3blL52+vTpltP3wYMHStvhFOVddmChav7Fixedojf1IIH/JYAXIVqSwrNtgrx8+VL69esnX3/9teAjwmmSPHlyOXPmjDHORKfxpz4kQAIkQAIkQAIk4EsC6ELYuHFjRpT4ErKmY0ePHl0WLVok6B5vgrx69UratWsn3377rQnm+sXG0qVLy9q1awOd660ILNQYOnHihF+U4iQk4A4BvAjhMIkfP747tyl77fXr16Vp06ayatUqR9oQMWJEOXnypCRNmtSR+lEpEiABEiABEiABEiABzwkgqAEHx6h7SiEBdwgkTJjQqgVlyr7t0qVL0qhRI9m8ebM7mHhtMARQRmfp0qUhO7By5swpu3fvJkwScBwBtCQ16aUQEBAgFSpUsJx2ThRExOFkpVKlSk5UjzqRAAmQAAmQAAmQAAmEggCyAWrVqmXVn6WQgDsEypQpI2vWrHHnFqWv3bNnj9X04Pz580rb4STlmzRpItOmTQvZgVW4cGGr2juFBJxGYOrUqfLll186TS2f6bN+/Xrr1AsfD04U1CRDbvugQYOcqB51IgESIAESIAESIAESCCXcSVjSAAAgAElEQVSBCRMmWPVYKSTgDgE4HuCAMEVwqF+7dm1BKiHFOwTatm0rY8eODdmBhVCt5cuXBzErCmc7rxaPdxBxFCcTQLTPX3/9JXHixHGyml7VrUuXLjJixAivjuntwcqWLWu9L7A+FBIgARIgARIgARIgAb0IHD9+XNKnT+/Ieqx6kdbHGuwLkFJnSvognFZwtsDZS/Eega5du1rN2wKTt2pgwVPKdqneA8+RvEMge/bsxqW2Zs6c2fE1B7Au6JSIgu4UEiABEiABEiABEiABvQhgc54yZUr5448/9DKM1viMgGn7thcvXkjWrFnl6NGjPmNq4sCDBw+Wnj17huzAgvdw/PjxJjKizQ4mgFQ1dOMzRS5cuGB9LOCF6GRB19KZM2cKUo8pJEACJEACJEACJEAC+hFQIStAP+rqWtS3b18ZMGCAuga4qfnZs2clbdq0jt+3uWmW7Zcjoq1ly5YhO7D69esnAwcOtF1hKkACbwig1tKGDRukWLFixkBRpd5AhAgRrHaxJtUmM+YhpKEkQAIkQAIkQAIk8A+BvXv3CqJqKCTgCoFff/1V0BjOFBk1apR06tTJFHP9Zud3330nDRs2DNmBNWbMGOnQoYPfFONEJBASgU8++URWrlwpn376aUiXavHvr1+/tiKatm/froQ9bdq0kaFDh0qUKFGU0JdKkgAJqEYAtTdRg5NCAiRAAiRgBwFkBCRLlkwuX75sx/ScUyECadKkkR9++EGSJk2qkNahUzV37twCpx3FuwRQpqZGjRqBDvpWDSx0emvWrJl3Z+doJBAKApUqVZLJkydLvHjxQjGKOreiWD3SBx89eqSE0vny5ZOlS5fKBx98oIS+VJIESIAESIAESIAESMB1AuiIXadOHUGnNQoJBEegZs2aVjHz2LFjGwEK+zaUVHF62RcVFwOO0JIlS4bswFq8eHGQni4VDafOahNA+iCKt/Xv31/ee+89tY1xUfsVK1ZYP4OqvAhjxowpe/bsEUTKUUiABEiABEiABEjAUwKMt/SUnG/vQ3YAghyaN2/u24k4utIEsG9DVgbS6fDfJgiihGrVqmWCqX63cceOHZI/f/6QHVjr1q2TMmXK+F1BTkgCgRF4//33ZeLEiVKtWjVjAHXs2FHGjh0r6PqiisybN09q166tirrUkwRIgARIgARIgARIwA0C2ExWrlxZbt265cZdvNQkAsjGgKOzXLlyxpjdtGlTmTZtmjH2+tPQ3bt3B1l7760UwkOHDknmzJn9qRvnIoEgCaROndqqf4XODibI3bt3pUqVKrJ161alzMXJw/z585XSmcqSAAmQAAmQAAl4iwBjp7xF0qnjnD59WurXr89aP05dIAfo9dlnn1lppti/mSC3b9+WUqVKWZkoFO8TOHnyZJDP0lsOrIsXL1p5nBQScAKBokWLytq1ayVixIhOUMfnOqDLS7169QQ/sCoJ6pNduHBBIkWKpJLa1JUESIAESIAESIAESMAFAg8fPpTWrVvL7NmzXbial5hIoGzZslZdXFP2bbt27ZK6devKn3/+aeJy+9zmq1evSoIECQKd5y0H1uPHjyVq1Kg+V4gTkIArBFD7ql+/fq5cqsU1SMVr0aKF4CNBNQmu0J5qtlBfEiABEiABEiABEiCB/yOAOlgjR46UPn36yNOnT4mGBN4iECZMGBk8eLD06NHDGDJoMoZ6X/CfULxP4MmTJ0EGR7zlwMLUiKJ49uyZ97XgiCTgJoGff/5Z0JrUBMHP3IABA2TIkCFKmtuoUSOZMWOGkrpTaRIgARIgARIgARIggeAJbNmyxap5ev36daIigbcIoNnWzp07JVeuXEaQgdOqe/fuMn78eCPs9beRkSNHDtYx+I4DC6Fa165d87eenI8E3iJgWlrajRs3rDDUjRs3KvkkJE+eXPbv3y+xYsVSUn8qTQIkQAIkQAIkQAJBEmCZL8G3ar58+eT333/ng0ICbxFAAffz588bkz546dIlqVOnjqC5AcX7BD7++GOrPE1Q8o4DK02aNHwxeX8dOKKbBFALyqQ8+3PnzlmnFqqeasFxtWTJEilWrJibK83LSYAESIAESIAESIAEnE4AaYQ1a9aUxYsXO11V6udnAg0aNJCZM2f6eVb7pjt8+LCgVvPNmzftU0LjmdEQ4ODBg647sHLmzCloW0ghATsJrFmzRsqUKWOnCn6de/ny5VK1alXBx4GKEj58eCvvHWmQFBIgARIgARIgARIgAf0I4HAZzgoKCfybgGm1cGfNmiUon6Lqvs3pTy98APAFBCXvRGCVLFlS2TQmpy8G9XONQIwYMQQdMfG3KdKkSRPla0ih+whOX95//31Tlo12kgAJkAAJkAAJkIAxBC5fvixJkyaVv//+2xibaWjwBNAATsUGVKFZV6QPzp8/PzRD8N5gCDRv3lwmTZrkugOrRo0aDA3lI2UrgVKlSsnKlSuNyaN+8eKFpEiRwnLaqSz4oEEnxTx58qhsBnUnARIgARIgARIgARIIgkC2bNmsuqcUEgCBkKJldKOEfVuSJEnk6tWrupnmGHt69+4tX331lesOLHi8pkyZ4hgDvKZImH9GUjM7y2sIVBkIbVi7desm6Ghhguzbt0+yZ8+ufBhquHDhZPTo0dKiRQtj1s6E55M2kgAJkAAJkAAJkMAbAvhOxwaTQgIgMHLkSOnYsaMxMH777Tdjui3atajYT7Zv3951B1bfvn2D9XjZZQjnNYNAlChRZNmyZYIoLFOkX79+MnDgQC3MLVeunCxcuFCwjhQSIAESIAESIAESIAG9CBw5ckQyZcqkl1G0xiMCSB9EB3WTsi+6du0qw4cP94gXb3KNwNy5c60uj0HJOzWwxo8fL23btnVtdF5FAl4mgF+IeGgzZMjg5ZGdORxqCOTNm1ebxgmoW4YPG4TWUkiABEiABEiABEiABPQigM5r+fPnlxMnTuhlGK1xmwDSSRcsWCCpUqVy+14Vb8C+LWPGjHz2fbx4ITUFeMeBNWfOHKlfv76P1eLwJBA4gSpVqsjUqVMlduzYRiA6deqU5MuXT65fv66NvaaFEmuzcDREUQKv/tE7rKK6U20SIAESIAHVCDx69EhatWol6EhIMZsAfAbjxo0zpvFWQECAVfbl8ePHZi+8j63fu3evwDkalLzjwEIYIDoRUkjA3wQiRIgg3bt3l/79+0uYMChapr8g2qxly5Zade9Injy5wDFnSg0z/Z9SWkgCJEACJEACJEAC/0Pg1atXMnnyZGndurXy9Vu5pp4TiBgxolUCpUuXLsbs2/Dct2vXTp4/f+45ON4ZIgF0O02YMKHrDix4vHLnzs32qCGi5QXeJhAnThyZOXOmoI6SCYIPABSomzBhgvUxoJOsWbPG6kpCIQESIAESIAESIAES0IvA5s2brYwddmLTa13dsSZBggTy3XffGVO3GHu1Ro0aCbLVXr9mZzh3nhV3rg0bNqw8efJEENgSlLwTgXXo0CEpVKiQ3L171525eC0JhJpA0qRJZefOnfLRRx+FeiwVBvjrr7+kQYMGVvFD3QSpoPPnzw/25aObzbSHBEiABEiABEiABEwgcObMGalbt66gIxvFTAKffvqpbNq0SRIlSmQEgAsXLkitWrXk559/NsJeu4yMHz++XLp0ScKHD++6AwsF+b744gv5888/7dKb8xpKoHTp0rJ69WqB59UE2b17t/XL//Tp09qZC2fk8uXLJUuWLNrZRoNIgARIgARIgARIwGQCz549s6JR0Hma0ShmPgmVK1eWJUuWGLNv27ZtmzRs2FDOnz9v5oL7yer06dPLgQMH3HNgnT17VhA9gUgsCgn4kwA6YCKf3gTBL3u89OHAevHihXYmIy9+wIABglazptQz024RaRAJkAAJkAAJkAAJBEEATXt69eolcGZRzCMwadIkad68uTGGT5s2zbJXt7IvTlvAwoULW9lJ4cKFC1y1f7I330khvHjxorWp3rFjh9PsoT4aE0DU1e+//y4pU6bU2Mr/Mw3F//BLf8SIEdraixpY6Cj54YcfamsjDSMBEiABEiABEiABEwkglQpZO/fv3zfRfKNtRqMmZG2lSpXKCA7ovNm5c2ereQHFtwSqV69ulaEJrhnYOw4s1OVp0qSJrFu3zrfacXQS+BcB5FEfO3bMmGidhw8fWt0+dc6jjhs3rhVaXrRoUT7rJEACJEACJEACJEACGhHAt2yGDBlYdkajNXXVFOzbAgICXL1c+euuXbsmKHWzf/9+5W1xugFt2rSRMWPGBJua+o4D686dO4Ib4fmikIC/CHTr1k2GDh3qr+lsnwfF6VKnTi2PHz+2XRdfKtCiRQuZOHGiL6fg2CRAAiRAAiRAAiRAAjYQQE2gWbNm2TAzp7STALJIBg0a9D8qoCFfGDu18f3ccNZly5ZNnj596vvJDJ9h4MCBVpZScDWx33FgYUONujUTJkwwHB/N9ycBRCLlzp3bn1PaOhfazjZu3NhWHfwxedSoUeX69esSJUoUf0zHOUiABEiABEiABEiABPxEAM2Xypcv76fZOI1TCOzbt0+yZs3qFHV8rsfYsWOlffv2Pp+HE4iVptm0adNgs7LecWD9/fff0rdvXxkyZAgZkoBfCCRPnlx27dplVK2ksmXLytq1a/3C1+5JunfvzveJ3YvA+UmABEiABEiABEjAywRQG+iDDz4Q/E0xgwA6jR8+fFhixIhhhsH/WFm8eHHZvHmzMfbaZSgafy1dulTQ4TI4eceBhe5ocF716dOHVfbtWj3D5kWxNhT7NuVFePfuXUmcOLE8ePDAiJWOHTu2HD16VBIlSmSEvTSSBEiABEiABEiABEwhUKpUKdmwYYMp5hpvZ506dQQd+SJFimQEi9u3b0uSJEkENd8oviUQOXJkWbVqlRQrVsw9BxauRlvMTp06yZMnT3yrJUc3ngA8rejE165du2C7DegEav369VYhQJNk+PDhVvcOCgmQAAmQAAmQAAmQgD4EUHC5Q4cO+hhES4IlgNq2zZo1C7ZGkU4IV6xYEWJEkE722mlL/PjxZfny5ZI3b173HViLFi2SVq1aCTyOFBLwJYF48eIJ6kGVKVPGl9M4amw468aNG+conXytTI4cOeT777+XBAkS+Hoqjk8CJEACJEACJEACJOAnAocOHRJ85z1//txPM3IauwggXXTBggVSuHBhu1Tw+7yNGjWSmTNn+n1eEydMkSKFLF68OMT6au+kEAIWwkBRYPrKlSsmsqPNfiSAAoBz586VtGnT+nFW+6ZCjYCCBQsKih+aJEgjhNOuVq1axpzYmLS+tJUESIAESIAESMBMAhcuXJBKlSrJ/v37zQRgkNW5cuWS2bNnS6pUqYywGmmD2KueOnXKCHvtNjJTpkwyf/58SZcuXbCqBOrA2r17t9SuXVvOnj1rtx2cX3MC+IUHB5YpXer27t0rVapUEfyyN02qVatmpSfHiRPHNNNpLwmQAAmQAAmQAAloSeD+/ftWCiEyKij6EkDZl3r16lld4kypf7Vz507LOXvz5k19F9ZBluXOnVvmzJkjiMQKTgJ1YJ08edLK9Tx+/LiDTKIquhEIHz689OvXT3r16qWbaUHaM336dOnYsaMxBdz/DSJatGiyZcsWK8ycQgIkQAIkQAIkQAIkoD4BNABDHayuXbsKutlT9CQAp9XgwYOtfYwpMnr0aGufyrrg/lnxL774QrBX/vDD/8feWUBZcS1fv4K7Qxh8cAkBAgR3gobg7u4OwQOE4MGDDe5OcAgJEiwEggUnyODu7l/2eY/v8U+AudZ9u/vsWmsWT7rPqfp1z53b1VW7AtxPYF2/fl2wgG5tTuZcGu7yhkDkyJFl1apVqqVOB4M2AP64o5UOf+x1NLQQzp49W/AWh0YCJEACJEACJEACJGB/Aj/99JOSn7l48aL9g2EE7yQQO3ZsgaB5/vz5tSD09OlTJVaPlkmaOQQw4RJDAqJGjep+Auv58+dqfOGvv/5qjrfcRUsCCRMmlMOHD0v06NG1iP/ChQsCIcCff/5Zi3jfFSTe3mzbti1EcT5tATFwEiABEiABEiABErAZAUhjoHuHxQ82u3BuuAvdK0ih6PLcdvLkSalXr55s377dDUo81FMCKG5o3bq1DB8+XEKHDu1+AgtnlC9fXk0No5GAUQSqV6+uJlnoYvijjt8rJLJ0NiTHV6xYoU3/vM7XmrGTAAmQAAmQAAk4n8DLly+VfjImiNGcSQD6VzpVI23evFnwrHrlyhVnXlCLRQVpIbRrQl4oJHunBhZOatOmjYwZMyak8/n/k4DHBBYtWqQEzXWxJUuWSOXKlbVtH3xzndE6iv7matWq6XLpGScJkAAJkAAJkAAJOJoAnhvx/EhzJoHFixerKjsd7NWrVzJlyhTVQqir7IvZ1xkD3QYNGqSqsEKy9yawhg4dqvR6aCRgBAHcpFevXhUIe+tizZs3V5M7aCIlSpRQb3HixYtHHCRAAiRAAiRAAiRAAjYn8Oeff0qWLFkED/80ZxGIGDGiXL58WZv2QegWN27cWE3Eo5lDIGbMmGpafdWqVUPc8L0JLFywunXrhrgADyABTwgULVpUOy2oNGnSyIkTJzzB5bhz8CEFMXuIuocKFcpx8TEgEiABEiABEiABEtCJACYQQicpODhYp7C1iBXyH+vXr9ciVgT58OFD+fTTT+X06dPaxOzvQD/++GOZP3++S8Pd3pvA2rhxoxQpUsTfsXB/hxIYMmSIdO7c2aHR/Tusv/76S9KlSyfQCKD9h0ChQoXUNJMYMWIQCQmQAAmQAAmQAAmQgM0JtGvXTkaNGmXzKOj+PwmMHDlS2rZtqw0Y6BbnzJmTz20mXvHEiRPLmjVr5JNPPglx1/cmsFApgooRGgn4mgBE2rZu3So5cuTw9dKWXQ89vd26dbOsf/5ybM6cOaoKi0YCJEACJEACJEACJGBvAjt27JA8efLYOwh6/38IYDrc8ePHVXWdLtazZ0/p37+/LuFaIs7kyZPLli1bJGHChCH6894E1pMnTyRq1KiCclAaCfiSQObMmVXlTWBgoC+Xtexa0ALInj277N2717I++ssxfEjt2rVLEiRI4C8XuC8JkAAJkAAJkAAJkIAPCKDTAN/toHNLcwaBrFmzyqpVqyR+/PjOCMiFKDJkyCBHjhxx4Uge4isCqLzas2ePhAsXLsQl35vAwpnIhJ05cybERXgACbhDAGNYoX8UPXp0d06z7bFnz56VlClTMhn8nivYsmVLQWlymDBhbHuN6TgJkAAJkAAJkAAJkIBIlSpVBJPGac4g0KRJExk2bJg2g7eQ+0AOhGYugWLFislPP/3k0qYfTGCVLFlS1q1b59JCPIgEXCGA9sEBAwZIx44dBSWpOtjs2bMFSTuOYX331Ub11dy5c6VAgQI63A6MkQRIgARIgARIgAQcS2DcuHGCl5M0+xPAy2UUHTRr1kyb57aJEyeqeGnmEgBzTCF0xT6YwGrfvr2qjKCRgK8IBAQEyOTJk6VUqVK+WtLS6yBphTcXiJn2bgJIZGLi6ZgxY7R5u8N7gQRIgARIgARIgAScSGDbtm1SunRpuXfvnhPD0yqmJEmSyNSpU7UZ7IbntqpVq7KC0A93+cCBA6Vr164u7fzBBBYzkC4x5EFuEID+1Y8//ijJkiVz4yz7Hnrjxg0pW7asQNSS9n4CSGxOmTJFSpQooc0bHt4PJEACJEACJEACJOA0AqdOnZLatWvLb7/95rTQtIsnd+7cMm/ePEEiSwe7dOmSFC9eXA4dOqRDuJaKcfHixVKxYkWXfPpgAmvz5s1q1D2NBHxFoFKlSuqDUBe9I0xbRHURteRCvoOKFi0qq1evdkm8L+TVeAQJkAAJkAAJkAAJkIDZBB48eCBt2rSRadOmmb019/MhAXRIQAIFXSS6PLdBg6l+/fpy+fJlH5LkUq4QwLCzLFmyuHKofDCBdeXKFUFlBI0EfEUALalt27b11XKWXwdVjO3atRNM9aR9mECoUKHUyFpXy0fJkwRIgARIgARIgARIwHoEIPrds2dPfv+13qVx2SPoFo8aNUqaN2/u8jl2P3Do0KHqvn327JndQ7Gd/3fu3HF5wNsHE1jPnz+XePHiCRakkYC3BJDJP3DggGTMmNHbpWxx/qNHj6Rbt25K/JDmGoHQoUPLzp07JVu2bK6dwKNIgARIgARIgARIgAQsReCXX35R1TusZLHUZXHLmYgRI8rvv/+uzXMbNNtQOThjxgy3OPFg7wkkSpRIzp8/7/JCH0xgvXjxQnLlyiV//PGHywvyQBJ4H4GkSZMK+uKRpNDB0EddvXp12bJliw7h+ixGTD+FYGT8+PF9tiYXIgESIAESIAESIAESMIfA1atXlfD34cOHzdmQu/icQKpUqeTIkSPatA+ePHlSatSoIbt37/Y5Sy74YQLFihUTtG+6ah9MYL18+VIp8S9ZssTV9XgcCbyXAFrpRowYoQ0hCADmy5ePFYxuXvEoUaKoVsIWLVpo80fTTUQ8nARIgARIgARIgAQsSwDT3JAMmD9/vmV9pGMfJtCpUydBS50uhoFb0ON9/PixLiFbJk48840dO9Zlfz6YwHr16pV07NhRoFtEIwFvCeCDARV9utj06dOVECDNfQLJkyeXVatWSbp06dw/mWeQAAmQAAmQAAmQAAn4lQCmSzdq1MivPnBzzwlgimTOnDk9X8BmZyLf0b59e5t57Qx3hw8f7hb7DyawkD3HgsjA0kjAGwIYBnDu3DmtKmqqVasmCxYs8Aab1ufWq1dPIIIfLlw4rTkweBIgARIgARIgARKwG4Hg4GBBGxokaWj2IvDxxx8LhrnpZF999ZWsXLlSp5AtEys089By7Kp9MIGFRRYtWqR0fNBOSCMBTwmgFXXu3LmCSXM6GKZXJE6cWK5du6ZDuIbEiOknY8aMkaZNmxqyPhclARIgARIgARIgARIwjkCWLFlk//79xm3AlQ0hgPbPOXPmGLK2FRdF2yCExG/dumVF9xztE573jh8/LoGBgS7HGWICa/PmzVKxYkVeUJeR8sB3EZgwYYI0adJEMIlQB4Nwe4ECBXQI1dAY8QZo3bp1kjlzZkP34eIkQAIkQAIkQAIkQAK+JdC3b1/p06ePbxflaoYTwDAlnWRQICBeokQJw7lyg38TSJAggezdu1fwzOeqhZjA2rNnj6AVCsr8NBLwhECsWLFk2bJlStBcF+vQoYNWgvVGXVckPJFAxx/SqFGjGrUN1yUBEiABEiABEiABEvAxAVRfZc2aVaCrTLMHATy3/fzzz/LZZ5/Zw2EfeNmwYUP1rEEzn0C2bNnUBELcd65aiAksJK7q1q0rEOCmkYAnBCDcPnPmTEmZMqUnp9vunKdPn6o/1hwd7JtLhw+0IUOGqM+hMGHC+GZRrkICJEACJEACJEACJGAogbt37woeUFkIYShmny6eP39+mTVrliRJksSn61p1MbQPYniUbppfVrkeFSpUEAw+c6dQIcQE1vXr11XrFypoaCTgCQGUoELLKHLkyJ6cbrtzDhw4IAULFpQ7d+7YznerOoxphBDEz5gxo1VdpF8kQAIkQAIkQAIkQAJvEXjy5Ik0a9ZMZsyYQS42IdCyZUv14jhSpEg28dg7NzFtEUk7DhvwjqOnZ7dt21YGDRokESJEcHmJEBNYEKNu3bq1BAUFubwoDySBNwQiRowo/fr1k44dO2oDBXpfGMOKP9o03xBAKyHe4G3bto1TCX2DlKuQAAmQAAmQAAmQgKEE0Do4adIklcSiWZ8Aig2GDh0qzZs3t76zPvJw8ODB0r17d7a5+oinu8sMHz5c2rRpI6FDh3b51BATWFipZ8+egovLzKTLXHngfwnEjx9fTbEoXLiwFkwwrbNRo0bqTdPr16+1iNnMIPEFaMSIEW5l6c30j3uRAAmQAAmQAAmQAAn8j8DGjRulZs2abNGywU2RNGlS1T6oi24xchvQ2l2xYoUNro7zXETV1bRp05TeujvmUgJr4sSJ0qlTJ3nw4IE7a/NYEpD06dPLr7/+KnHixNGCxrlz56R27dqCKYQ03xOIFi2aSmCBMcau0kiABEiABEiABEiABKxLAPpXderUEbRq0axNABq+ENSOHTu2tR31kXcnTpxQyZN9+/b5aEUu4w4BTCCE/tUXX3zhzmniUgJr9erVUq9ePblx44Zbi/NgEqhVq5YScEcLmA6GZB3Exs+ePatDuH6JMW3atCpbnzNnTr/sz01JgARIgARIgARIgARcIwBJDXQnzJ07l90JriHz21ENGjSQKVOm+G1/szdetWqVNG7cmNWBZoP/736ffPKJyhNkyZLFLQ9cSmD9+eef8uWXX8r58+fdWpwHkwDKUJHE0sHQMojECj4IOS7Y2CueO3du+eWXXwQaazQSIAESIAESIAESIAHrEhg2bJiSpKE+rHWvETxDkrF69erWdtJH3uFZDfpLnTt39tGKXMZdAp5OvHQpgXXt2jXJkycPR6C6e1U0Px4tXsHBwYLyQB0MY1g7dOggEHGnGU8A01HxhShKlCjGb8YdSMBKBF797UwoKzlEX0iABEiABEjg/QQgrVG+fHm5desWMVmUAJ7bzpw5IwkTJrSoh7516+7du4KJi9BqpvmHQIUKFZRutLvPci4lsCBwVrBgQdm+fbt/ouOutiSQI0cO2blzpy1998Tpmzdvqh5e9lF7Qs/9c9CW+t1336kJl+HDh3d/AZ5BAiRAAiSgAQFmfDW4yAzR4gTu3bun2oROnz5tcU/1dQ/SHDrplEG3uESJEnL06FF9L7ofI8fUwRYtWsjo0aPd9sKlBBZWRbUDxqDSSMBVAphc+fXXX7t6uO2Pwwdg5syZ5dmzZ7aPxS4BxIsXT0aNGiVVq1bVRmfNLteGfpIACZAACZAACZDAGwIQcoe0CM2aBNDVgE4SXez3339X0xafP3+uS8iWihPFB5/x7NYAACAASURBVAMGDPDonnM5gTVy5Ehp3769pQKnM9YlECpUKDl27JikSpXKuk762DNMx9Ppg9/H+DxeDgKA6NnPmDGjx2vwRBIgARIgARIgARIgAeMILF68WCpXrmzcBlzZYwJ4boPsS+LEiT1ew24n9u3bV/r06WM3tx3jb+TIkVVCG63F7prLCSxMV0MbIY0EXCGAZALumZgxY7pyuCOOwe8HYqaZT6BUqVJqakr8+PHN35w7kgAJkAAJkAAJkAAJfJDA7du3JVGiRPLo0SOSshgBPLft3r1bK0kOSN3s2rXLYldCH3eiR48umzdvVt1L7prLCSwIuQcEBHC6mruENT0ek/jQ2qXLlLjr169LkiRJOF3FT/c79LCQwR8/frygrZBGAiRAAiRAAiRAAiRgLQJFixaVDRs2WMspeqO0iPDcFiZMGC1oXLp0SZIlS8b2QT9e7bhx48rx48c9KnZxOYH1+vVrCQwMlLNnz/oxVG5tBwIoQ504caI0bNhQG12ihQsXKh0mmv8I4L5r0KCBoN0ZZak0EiABEiABEiABEiAB6xAYPny4Gr5DsxYBPMfo1N45bdo09cxA8x8BDHXYs2ePR7kClxNYCK9SpUqyZMkS/0XKnW1BAOXBM2fOlEKFCtnCX184Wb9+fZk+fbovluIaXhBA4qp3797Spk0brcqgvUDGU0mABEiABEiABEjAFAIHDhyQ7Nmzs/LFFNqubZI0aVKZP3++YAqhLlauXDlZvny5LuFaMs7atWurfIEn5lYCi2JnniDW75y8efOqGxIVezrYnTt3BDEfPnxYh3AtHyNKUr///nvBtBsaCZAACZAACZAACZCANQhcvHhRypQpI/v27bOGQ/RC0NY5depUbQTcb926JRkyZJArV67w6vuRwA8//CAtW7b0yAO3ElgrV66Ur776yqONeJIeBKBFhIzqpEmTJFy4cFoEvWXLFtU+yA9C61xuiLmPGTNGVY3SSIAESIAESIAESIAE/E/g/v37aqo9Bu/Q/E8A8hvNmzcXTFIPGzas/x0ywYO1a9dK9erV5e7duybsxi3eR+CPP/6QrFmzegTIrQTWuXPnJHXq1PL06VOPNuNJzicQIUIEGTp0qLRq1cr5wf43Qmgu9ejRg1NVLHbFIeaOnv4CBQpYzDO6QwIkQAIkQAIkQAL6EYCm8tixY6Vdu3by8uVL/QBYLOKoUaMKdMkaNWpkMc+Mc6dPnz4yYMAAtrEahzjElZEvQDLb06EBbiWwMGktV65ccurUqRAd4wF6EogRI4b8/PPPki1bNi0APH78WCXrUHpLsx4BZPYxmRD3I6oDaSRAAiRAAiRAAiRAAv4jsH79ejXo6cKFC/5zgjsrAgkSJBB0WH322WdaEHn48KHUq1dPFi9erEW8Vg0SOni7du3y2D23ElgotcOEAiQoaCTwLgJp06aV/fv3ayOgjWQuPgi3bdvGG8KCBJC0QgVWUFCQpEqVyoIe0iUSIAESIAESIAES0IfAmTNnpFq1al49wOpDy9hIM2XKJDt27JBIkSIZu5FFVj906JDSyKUGm38vSNOmTWXChAkeO+FWAgvVJhh9iooGGgm8iwDE2CDKpott3bpV6Sxdu3ZNl5BtFyeSWDly5JClS5dKQECA7fynwyRAAiRAAiRAAiTgFAIvXryQmjVryqJFiwQthTT/EfBmEpz/vPZ851WrVkmtWrWof+U5Qp+cOXHiRGnSpInHa7mVwEKvMvqW27Zt6/GGPNHZBFCdh2kWOhj+6E6fPl0aNGigQ7i2jxHjgTEyF9pYNBIgARIgARIgARIgAf8QGDVqlCqKoA6Wf/i/2RX6VxDV18GQOEW8Xbp00SFcS8eIApC8efN67KNbCSzsgioGtExBeItGAm8TiBkzply+fFmb9kH80a1fv77MmjWLN4INCIQOHVrKlSunhgwEBgbawGO6SAIkQAIkQAIkQALOI7B3716lq/zs2TPnBWejiDZu3CiFChWykceeuwr9K1RfLVu2zPNFeKbXBOLEiSNIYEF2yFNzO4G1fft2qVu3LoXcPSXu4PMqVKggS5YscXCE/zc0/NFNkyaNBAcHaxOz3QPFiOAyZcooTazYsWPbPRz6TwIkQAIkQAIkQAK2I4CJ9unSpRPoYdH8R+D27duCAVw62M2bN+XTTz+VS5cu6RCuZWP8/PPPlYh+4sSJPfbR7QTWyZMnlfjZb7/95vGmPNGZBCZNmqTVGFa8PcIUhVevXjnzgjo0KlRi4a3fjz/+KHgLQCMBEiABEiABEiABEjCXAKZ4Q5qG5h8C4cOHlydPnvhncz/sCpmb4sWLU3fND+zf3rJq1aoybtw4iRUrlseeuJ3AunfvnkpgQUuGRgJvCGB6xe7duyV9+vTaQOnRo4cMGDBAm3idFmiJEiVk8uTJaoQwhN5pJEACJEACJEACJEAC5hDYvHmzNu1r5hB1b5f48eMr6RddjAlTa1zprl27Sp8+fbySHHI7gYXQW7durTJnrDyxxo1gBS/y5MkjCxcuVMkAHQz6V5988okcO3ZMh3AdGSPaCcuXLy+DBg2iJpYjrzCDIgESIAESIAESsCoBiGpjOvSNGzes6qKj/YIG0dGjRx0d45vgcK+lTJlSzp49q0W8Vg0SVX8jR46UZs2aeeWiRwmsMWPGSOfOnQX9yzQSAAFktZEIiBw5shZAjh8/rnr3Of7X3pc7TJgwUqxYMUH7q7+TrxgkzTowe99P9J4ESIAESIAESMB1AhUrVlQDwmjmE8BzzJEjR8zf2A87HjhwQDJnzuyHnbnl2wRQ9QcdYugRe2MeJbDWr18vlSpV4iRCb8g76NwIESKobGqTJk20acWaOHGi19ljB90Ctg4F7YMQdVy5cqVXgoK2hkDnSYAESIAESIAESMBkAujoadmypcm7cjsQgIj2uXPntIAxZMgQ6dKlixaxWjnIDBkyyNy5c9VzlzfmUQIL6v2ZMmViyac35B10brJkyWT69OlSoEABB0X1/lDQOluzZk2ZP3++FvHqECSSWAULFlRioiippiaWDledMZIACZAACZAACfiTwO+//y5FixaVBw8e+NMNLfeOFi2a3L171/GxQ/alZMmSAhF3mn8JIFcAHfXo0aN75YhHCSy0TWXLlk0whY1GArlz55YlS5YIygJ1sIsXL6rSx3379ukQrjYxhgoVSgoXLix4S5MlSxZt4magJEACJEACJEACJOAPAmfOnJEaNWrIzp07/bG99nveuXPH62SC1SGePn1ayYWcOnXK6q463r9atWrJzJkzvS4U8CiBBbrNmzeXCRMmOB40A/wwAVSqNGjQQPWzIgGgg6GFFjEjkUVzFgHczyhvhc4fKrJoJEACJEACJEACJEACxhC4f/++tG/fXqZMmWLMBlz1gwR27dol2bNndzQlFFk0bdpUbt686eg47RDc999/Lx07dvTaVY8TWPigadSokdcOcAF7E0DSaurUqVK3bl17B+KG9yNGjBCMAH327JkbZ/FQOxGIHTu2EnbHlEIaCZAACZAACZAACZCAMQSGDx8u3bt353AwY/B+cFVo+kLD2MnWq1cvGThwoKCVkOY/AigS2Lhxo08KBDxOYB07dkxVKkAPiKYvgbBhwwruheTJk2sB4d69e9KhQwe+KdLgaidMmFD69esnKHfFfU4jARIgARIgARIgARLwLQFoE9WvX5+dDb7F6tJq9erVk2nTprl0rB0PunHjhhq6hSosmn8JhA4dWqCjHi9ePK8d8TiB9eLFC4F4N9uovL4Gtl4AUwT279/vdS+rXSAEBwdL1apVBSW3NOcTiBMnjiptb9OmjUSJEsX5ATNCEiABEiABEiABEjCRwJUrV6REiRJy4MABE3flViCA57itW7cKBN2daIcPH5bq1avLwYMHnRierWJKkyaNHD161Cc5A48TWCBWsWJFWbp0qa3g0VnfEvj2228FpZm62O7du1Xp46NHj3QJWfs4I0aMKFWqVJHBgwfLxx9/rD0PAiABEiABEiABEiABXxHgdG9fkXR/HXyvXbBggWMnya9Zs0bJgVD2xf17w9dntG7dWkaPHu2TZb1KYEGIq3Pnzj5xhIvYjwB6WY8cOSJp06a1n/MeeoxfvLZt23p4Nk+zKwHc66VLl1YfvIGBgXYNg36TAAmQAAmQAAmQgOUIQHfU6VpMloP+t0Phw4eXb775Rrp16+aTyhirxYguipEjR1rNLS39WbRokVSqVMknsXuVwNqwYYMq+UQ7IU0/AilSpJCTJ09qFXiZMmVk1apVWsXMYP9HIEeOHKoSK2/evIJebhoJkAAJkAAJkAAJkIB3BPA8gRYjait7x9GTs0uVKiWTJ0+WgIAAT0637DnolsmUKZN2z6pWvCDhwoWT06dPC/SFfWFeJbBOnDghRYoUkQsXLvjCF65hMwKNGzeWoKAgm3ntubsPHjyQxIkTy507dzxfhGfankCSJEnUtJzatWtLpEiRbB8PAyABEiABEiABEiABfxJA4gp6TNAsoplLIG7cuDJ37lwpWrSouRsbvBvE6Rs0aGDwLlzeFQKpU6dWQ9/Q0eIL8yqBdfnyZTWhCyMRafoRmD9/vhI018XQR402MhoJQOwSwu4ouWYSi/cDCZAACZAACZAACXhHAJq63333nXeL8Gy3CSCpgPbNH374QcKECeP2+VY84cmTJ0ryAwMCaP4nAN30xYsX+8wRrxJYqEiBBtaECRN85hAXsgcBlAAuX75csmbNag+HfeAlsvhOHjXrA0TaLVGtWjWBFiDKrkOFCqVd/AyYBEiABEiABEiABHxBYM+ePfL555+zjdAXMN1cA5O2MSEuUaJEbp5pvcNRzTd8+HDqdFvo0gwaNEi6dOniM4+8SmC9fPlS3SBop6EOls+uiS0WQpkpkjlO+KBzBfjDhw8lXbp0cv78eVcO5zEaEYAuVt++faVQoUKCHm8aCZAACZAACZAACZCAewSgWZQhQwYJDg5270Qe7RMC0MKC0LbdOwsOHTqkOoQwaIzmfwIRIkSQZcuWSfHixX3mjFcJLHiBcrBmzZrJzZs3feYUF7I2AZSaYhTmkCFD1PQKHWz79u3yxRdfyOPHj3UIlzG6QQC/DyhTRjthvXr1HFN+7QYCHkoCJEACJEACJEACXhF49uyZNGrUSGbNmuXVOjzZMwLoJBg7dqx6rrer3b9/X01VHDdunOB+ovmfQMqUKVW+CIL6vjKvE1h//PGH0sE6fvy4r3ziOhYnEDVqVBk2bJhAxF0XQ7KuR48erDTU5YJ7ECd0A/DFa/z48R6czVNIgARIgARIgARIQF8CaP3CNLymTZvqC8HPkadNm1agcezLZIOZIW3dulXpFSORRbMGARSATJ061addW14nsK5duybly5eXHTt2WIMSvTCcQNKkSWXhwoWqT10He/r0qdSsWVOWLFmiQ7iM0UsCBQsWFPR6Z8mShS2FXrLk6SRAAiRAAiRAAvoQ2Lx5s2r/wvMlzXwCqMJCN8HQoUMlVqxY5jvgxY4QbEeyBC2ENGsQQJcKEtIofPFla6rXCSxkyyFuPWPGDGuQoheGE8iePbv88ssvgklsOhiqC1FliGpDGgmERAAf1mnSpJGWLVuqqS7UxQqJGP9/EiABEiABEiABEhA5efKk1K1bl4URfrwZIOgOwe2ePXv60Qv3toaUERIlLDZwj5vRR0eMGFH69+8v7du39+lWXiew4A3GbkITiaYHgVatWsmYMWP0CPbvKNesWaOStFevXtUmZgbqPYHo0aNLkSJFZNSoUT4tm/XeM65AAiRAAiRAAiRAAtYj8OTJE6XBxMII/14bFCl89913tni+h/h/7969ZeTIkZR68e9t86/d48WLp9oH0dbpS/NJAmvnzp2SO3duef36tS9941oWJbBixQopU6aMRb3zrVuoMBw9erTPM8e+9ZKrWZkAxAunTJkiefLkkdChQ1vZVfpGAiRAAiRAAiRAAn4lgHajXr16cXCSX6+CqA6C6dOnq5ZOtBZa0SDUPmHCBOnevbtgYjzNWgTwDIRCkFSpUvnUMZ8ksJD5TJQokdy+fdunznEx6xGIHDmyXLhwQWLEiGE95wzw6N69e9K8eXOZO3euAatzSV0IxI0bV9q2bau01JIlS6ZL2IyTBEiABEiABEiABNwi8Ouvv0rlypXl+vXrbp3Hg31PALrHaAHD9bCaJMbdu3clKChIvv32W3nw4IHvg+eKXhPImzevkh0KHz6812u9vYBPElhYsEKFCvLjjz/61DkuZj0CJUqUkLVr11rPMYM8unTpkhQqVEhOnDhh0A5cVhcCqL6CwDtacEuWLOnzD3NdODJOEiABEiABEiAB5xK4c+eO5MiRg9+9LXKJEydOrL674kWsrxMRnoaI5zJMiJ89e7Zg2BbNmgQ6dOigBNx9bT5LYKF8D5UqNGcTQKa7cePGzg7yrejQHovs8cuXL7WJmYEaRwAC77Fjx5aGDRuqfn2IG9JIgARIgARIgARIgAT+R6BOnToya9YsIrEIAUyQK1q0qNJATpIkid+8glzRtm3b5Ouvv5bdu3fz+cxvV8K1jRctWiSVKlVy7WA3jvJZAgttZSgzhGYQzZkEwoYNK2fPnpWAgABnBviOqNCDDxFDGgn4mkC2bNlU6XO6dOkkQoQIvl6e65EACZAACZAACZCALQnMnz9fqlevbkvfnex0ihQpVEth8eLFTZWTefHihdy6dUtGjBghw4cPF2hf0axNALppwcHBggo+X5vPElhwLHny5HLmzBlf+8j1LEIA5bwbNmwQ6GDpYlmyZJH9+/frEi7jNJlAnDhxpEWLFmpkND4/aSRAAiRAAiRAAiSgO4Fr166pwghMJaRZiwC0sEqVKqW6CTDELVasWIY6eO7cOSVfM27cOPnzzz8N3YuL+45AmjRp5OjRo4LuE1+bTxNYNWrUkHnz5vnaR65nEQJNmjRRE/ms0v9sNBZkjVOnTi3Pnz83eiuurzEBVF+hGqtdu3ZSvnx5y0560fgSMXQSIAESIAESIAGTCeTPn1+2bt1q8q7czlUCGFCEa4QWsWrVqrl6msvHnTp1ShYvXiyrVq1SiSsM1qLZh0D79u1VtZwR5tMEFjKjLVu2NMJPrmkBAhBhg4AfxKh1MOq62e8qQ1+qYsWKsmzZMsHbOzsZ9LBQLj948GBBZRaNBEiABEiABEiABHQlMHToUKV1RLMuAVTXoLAhUaJEUqVKFTWk6PPPP/d4YiEq7tavXy8zZsyQzZs3y/3791lIYN3L/0HPMH2wSJEihnjv0wQWbjSUFD5+/NgQZ7mo/wigXBTVdZg2qYNBJLBs2bKycuVKHcJ1TIyFCxeWOXPmyOXLl6VBgwZy6NAhQd+8neyzzz6TgQMHqi8AMWLEsJPr9JUESIAESIAESIAEfEIAVTfZs2en3pFPaJq3SJQoUQQSLJCewfULDAwU6CiHCRNGFUG8aSmDbja6XJA3QKUdZGo2bdrE623epTJsJ7yIP378uGHtpT5NYB0+fFiqVq0q+JfmLALIrCMxgFJRHezSpUuqrxui9TR7EIBYIN7WYWQr7PTp09KzZ09VjWW3pDr++KMkG9pYuXLl0qZt1x53Gr0kARIgARIgARIwmgAq6b/44gvqHhkN2uD1kbiCXAY6DfCD/45CASSvUGF19+5dgz3g8mYTKFGihGr/NEo326cJrBs3bkjz5s2VwzRnEUifPr0aZ4vqEB0MlVdIHty+fVuHcB0RI6oET5w4oUQ/YfjjePXqVdWSN3bsWNuVIOMNFWLBSwGU0BstkumIm4BBkAAJkAAJkAAJOILAw4cPlXTJlClTHBEPgyABXQj06tVL8IPKOyPMpwksPDB+++238t1339mubccIuE5aM2vWrKofOUOGDE4K672x9O7dW7VxUcDdPpcbI33XrVv3TocxdrdTp06CcmU7WkBAgEybNk29iUSlGY0ESIAESIAESIAEnEwAz5XQo23VqpVtv785+fowNhJ4FwFoos2dO9dQ2SGfJrAQBKqvmjVrJjdv3uRVdRABtNMhgZUyZUoHRfXuUO7cuSONGzdmJaHNrjRaXDEJ9X32448/So8ePVSV1suXL20Wnag2QghkYmwx9LFQhk0jARIgARIgARIgAacSgBB0vXr15OLFi04NkXGRgKMIpE6dWnVt4VnFKPN5Auvo0aNSpkwZwehLmnMIQPtq+vTpSojP6Xbw4EGpU6eO7N+/3+mhOiY+JHPOnz8vmEL4PoOY+86dO+Wbb75RIpF2tSRJkqhhGbhH8cdBl6mgdr1e9JsESIAESIAESMAzAtAzrVWrlvz222+eLcCzSIAETCWAbhHkDBIkSGDYvj5PYKHlCpPAtm3bZpjTXNh8AqjAws2YKlUq8zc3ecc1a9Yo3aEHDx6YvDO385RAvnz5ZMuWLSGejnJ0vMXr0qWLKm+1q6GNMHHixEroHfpY8eLFs2so9JsESIAESIAESIAE3kkALx9r164tCxYsUNqmNBIgAesSwPNJkyZN5IcffjD0BbvPE1hAigqHfv36WZcuPXObADSwZs6cKRBzd7KhtQyi32g1o9mHQJ8+fQS6Ze7YgAEDlM6Z3ROVmBCK6YuoysL0QmpkuXMX8FgSIAESIAESIAErExg1apR6Wffs2TMru0nfSEB7ApEiRZJhw4YpOSkjzZAE1vbt2yVv3rxG+s21TSaAftbZs2dL9uzZTd7Z3O2ePHkiFStWFFRh0exBAKN5V6xYoQTO3bHHjx8LdLOQ/IEulp0NEwsLFiyo9LHAgRVZdr6a9J0ESIAESIAESOANgd27d6vuHru/cOQVJQGnE4gTJ46sXr3aUP0rMDQkgYUHQ1QF3Lp1y+nXyYHxYcLZvye14YEYLVdFihRxYMz/Cwn3bIoUKQRC7jR7EMBkzEWLFkm6dOncdhgtz7t27ZL+/fvL2rVr3T7faifEjBlTcuTIofSxvvrqK4kcObLVXKQ/JEACJEACJEACJOAyATxX4rvemTNnXD6HB5IACZhPAMPeoCFt9POHIQks4EIVy9KlS80nxx0NIQChaCSwMAXNybZy5Ur14E+zDwHck+PGjfuggHtI0SBxidZRlKk/ffo0pMMt//+jlTBXrlyCNkm0/6JCi0YCJEACJEACJEACdiTQvHlzmTBhgh1dp88koA2Bxo0bS1BQkOHxGpbAmjZtmjRo0MDwALiBeQT69u0r3bt3lzBhwpi3qck7YVTvjBkzTN6V23lKAInVXr16Kd09b5M0SFxNmjRJhgwZoiYaOsEwnRHVWC1atFATRJHY8paTE7gwBhIgARIgARIgAfsQWL9+vRQvXtw+DtNTEtCQwKpVq6R06dKGR25YAgtjT7NkySL37t0zPAhuYA6BsmXLyrx58wQPxU406F8lS5ZMrl696sTwHBlT3Lhx1Ru5ChUq+CQ+TLjZuHGj0sXCv2gxdIKBExjhd7hQoUIC3TAaCZAACZAACZAACdiBAL6jJ0yYkPI0drhY9FFLAtGjR5fg4GCJESOG4fEblsCC0B6mYm3dutXwILiBOQQgzHby5EnBDepE27Fjh+TJk8eJoTk2prRp0yoB91SpUvk0xnPnzqnE2Pjx4x2jh4bphAEBAaqlENNBoGcXLlw4n3LjYiRAAiRAAiRAAiRgBAG8hMN3PhoJkID1CHz55ZcCKR4zzLAEFioX0NoDXRmacwgsWLDAsTpYnTt3lu+//945F0uDSJCE+fnnnw1pi0M1FiZp1KhRQ+7fv+8ommHDhpWiRYuqSjMIo9JIgARIgARIgARIwMoEfvjhB2ndurWVXaRvJKAtgYkTJ0qTJk1Mid+wBBa8X7JkidSuXVswPYLmDAKoUNq8ebPjdLBu3rwpxYoVk7179zrjQmkSxaBBg6RLly6GRnvx4kVp166d/PLLL46pxnoDDBpi6FWvX7++ZMuWTRIkSCCo1KKRAAmQAAmQAAmQgJUI/PHHH0oGAV0+NBIgAesQgMYuprp7MhHekygMTWAhGYAE1pEjRzzxjedYlABa7TDhzEm2aNEiwYQTJLJo9iGAzxho7Rltd+7cUfpvI0eOlBMnThi9nenr4w9Pzpw5lUAqElpp0qRhIsv0q8ANSYAESIAESIAE3kfg7NmzUrVqVfn9998JiQRIwEIEcufOrQqX4sePb4pXhiawrl+/rt7sow2H5hwC+OMxZ84cQfWGE+zu3bvSoUMHmT59urx69coJIWkRQ6JEiQTDItAOZ4ahLfr48eOCaZyLFy82Y0vT94C4e9KkSVUiC2X6KVOmNN0HbkgCJEACJEACJEAC/yQAOYeOHTuqidE0EngngY/+/l9fk43ZBNq0aSMDBw6USJEimbK1oQksRNC1a1cZNmyYvHjxwpSAuInxBJIkSaKqUZBtdYL99ttvUq5cObl27ZoTwtEmhhYtWsjYsWNNjxdJTiQ7ofF35coVxyY9w4cPL7Vq1VJfFgMDAwX//aOP8M2ARgIkQAIk8C8CeP/FDmzeGCRgKAFUwn/99deOmRJtKCwuTgImEEDSaty4cVK3bl0TdvvPFoYnsNCa1bBhQ8eJIJt2hSy4ESqvmjZtKtAfiho1qgU9dN0lVNVApNupFTWuk7DXkUikQLwdIu7+MCSx9uzZIyNGjFAVpvfu3fOHG6bsid/xr776SsqXLy/Zs2eXxIkTM5FlCnluQgIkQAIkQAIk8DYBfPdr0KCBXLhwgWBIgAQsQADdGnixD51ss8zwBBZafFCpc/XqVbNi4j4mEPj4449l1qxZ8sUXX5iwm3FbTJ06VVDJ8/TpU+M24co+JxAQEKC09WLEiOHztd1ZEImrZcuWqUowiIs6uQU1WrRoSugd0wsxyjpt2rTUyXLnZuGxJEACJEACJEACXhHAYB28VOPQJa8w8mQS8BmBfPnyCQqWkBswywxPYOGBDg88mzZtMism7mMSgRw5cggE3e06d5pjPAAAIABJREFUteyvv/4SxHD79m2TiHEbXxFAyyfaWKHZ5G/DZ9z58+dl8ODBSpfB6e3SaCWMGTOm+t1p1KiRSmLjf6ORAAmQAAmQAAmQgJEE8J2rZs2aMn/+fCO34dokQAIuEEBHDDrtJk6caGo+wPAEFmIfNWqUGkNPcx4BaJxB1DpcuHC2Cg5JK/zCoXrm9Wuq/dnp4uHDcsiQIdK+fXvLDRJAO2GXLl3k5MmTWlT14VokT55c9b1XrlxZvX1BpZZTBjzY6feCvpIACZAACZCADgQmTJigJofTSIAE/EsAg7TQkYUBb2aaKQmsM2fOSOrUqR1fmWDmhbPKXrhxx48fL7Vr17ZNEgvtgqNHj5Z+/fpRm80qN5IbfqBtENVXJUqUcOMs8w6FLgO+XGFSZ3BwsHkb+3mnKFGiqGrbQoUKqVbDTJkySeTIkf3sFbcnARIgARIgARJwEgFMhIaMAY0ESMC/BPDS+sSJE6a2DyJiUxJY2Ojzzz+X3bt3+5cydzeEQLJkyWTMmDFSqlQpU8sHPQ1mxYoV6s3NpUuXPF2C5/mRQNasWWXmzJmSPn16P3rx4a0fP36sRN5Rffrjjz/Ky5cvLeurrx1DOyEmleKlBZKMX375pSRNmpTC774GzfVIgARIgARIQEMC+E6F74B4cKaRAAn4j0Dx4sVl3bp1pjtgWgKrf//+0rNnT9MD5IbGE0AbUYoUKWT58uWWTiqAxMGDByVv3ryOnhpn/BX37w4oUw0KClKtala3Z8+eqQmXnTt31jJhGiZMGFWFhURW69at1UAPfF7QSIAESIAESIAESMBTApAwgfYojQRIwH8E0BFTrVo10x0wLYH1+++/S8GCBeXJkyemB8kNzSHwySefyIIFCyRNmjSW08BBIgGDBOrXry+XL182Bwh38TkBaK0hEd6rVy+fr23kghgYMHDgQPnpp5/U/aej7hqGPeAzAuKrhQsXloQJE0qcOHEEbcg0EiABEiABEiABEnCVACY/Y5iMk6c/u8qCx5GAPwhEihRJrl275he5ENMSWHhow+SwXbt2+YMx93SVQKi/D3zl6sH/Pg5tQ4MGDVLthFaZTIbkFVrOIPwNcW0dkweeX1FrnRkrViylLWVV/asP0cJ0wl9++UVmzJgha9eulbt371oLroneIHEFnSx8+cyePbtqMY8bN66JHnArEiABEiABEiABuxJ4/vy5pEyZUs6dO2fXEOg3CfiBALogfDO8rGTJkrJmzRo/xGCiBhY0YXr06CEjRozwS6Dc1BwCaA9KkCCBtGjRQjp27Oj3JNadO3eke/fusnDhQrl586Y5ELiLYQSgpQRtqdixYxu2h5ELI3l669Yt2bJli3zzzTdy6NAhI7ez/NqovkIyKyAgQPLkySOVKlWSnDlz2mYghOUB00ESIAESIAEScCABVF7VqVNHvdSkkQAJmE9g3LhxfpsGaloFFrCiCgbi2Y8ePTKfMnc0nQAmkk2aNEkSJ05sekshql02bNggzZo102oSnOkX2eQNUcUJUXSnGLQBhw0bJki0sjLwP1cVb1TxpbR69epKDB46Wmg/pJEACZAACZAACZAACOA7E54xmjZtSiAkQAImE4gZM6asX79edVP4w0xNYKF9EA8mGH9K04NA9OjRpV27dlKxYkWlf2O0gDMq/Y4cOSLTpk2TWbNmUazdYbfZlClTpEGDBo6JCm8QUYX1ww8/qPbC4OBgJrL+e3UjRoyo2gvRjowWw8DAQFXdCR00GgmQAAmQAAmQgN4Etm3bpuRp2GGh933A6M0nUKBAAVWYhBfN/jBTE1jQfMFbdei/0PQhgAqKjBkzqj8ylStXlnTp0vk8eOhc7dixQ5YuXaqEsjla1+eI/b4g7qOzZ8+qJIbT7OnTp7Jz5041sRA/V65ccVqIXsUD7bNPP/1UMmXKpCYZ5sqVSxIlSmR4Qtwrp3kyCZAACZAACZCAYQROnToldevWle3btxu2BxcmARL4vwRQjNKmTRuleR0hQgS/4DE1gYUI+/XrJ3379pWXL1/6JWBu6j8CqJxA8gETyKpWrSrI3nor9H716lVZtWqVqrY6evSoegvDe8t/19jInVGNg2mmRlfxGRlDSGs/fPhQDh48qAYOOKlVMqS4Xf3/Q4cOLVGjRlW6WUhiVahQQYoVKyaYhGKkQe4Sspc0EiABEiABEiABaxCAJA0epFGdTyMBEjCHQLRo0ZSmuT87YkxPYG3dulWgjYSKGZreBPAwmj9/fsmbN68ScEaLIZJc0Lt58/MmWYFedySmoG2F6hT03a5cuVJNtXzy5IneIDWJvk+fPtK7d29NohU1rbBevXraxOtpoBCCx9+UsmXLSpEiRQTVWkhoITnu5GSnp7x4HgmQAAmQAAk4hQAepDEkDBIiNBIgAeMJQKt2wYIF8tlnnxm/2Xt2MD2BhQqD9OnTc+yp3y65dTeOHDmy6qWNEiWKegDFzxu9G4zLhdD1tWvXlE4QElk0fQggSbF582bVPqaLDR48WLp27apLuD6JE6XM+IMKzawsWbJIqlSplHZWvHjxKATvE8JchARIgARIgASsQ2DTpk1So0YNSi9Y55LQE4cTKF68uCxfvtzrLipvMJmewIKz7du3l5EjR3rjN88lARLQiAB00yBy7kT9q/ddxhw5cqgKQ5pnBJAAT5gwoUqK420REltoQ8ULFG9blz3ziGeRAAmQAAmQAAn4ksCtW7dUJwdkRGgkQALGE8D09A4dOhi/0Qd28EsCC1O3IOpNIwESIAFXCNSuXVvGjh2r9I90sOvXr0v8+PEFUwpp3hNASzKq+FDRGTt2bClUqJCULl1avvjiC0EvP40ESIAESIAESMCeBPAdcfbs2fZ0nl6TgM0I/PXXX+rFsD/NLwksBAy9o8OHD/szdu5NAiRgAwLQSkO2v3Xr1tq0gWEoQZ06dWxwdeztIiZbot2wYMGCKqmFyYYxYsSQ6NGjS8SIEe0dHL0nARIgARIgAQ0IIHmFJBaNBEjAWAL58uWTLVu2GLuJC6v7LYH17bffaiXI7MK14CEkQALvIBAQEKAmzJQsWVIbPkheIYlFM5cAElhoMcyQIYOkSZNGvWGCjhZaEZFIpZEACZAACZAACViLwOXLlyVp0qQCvVwaCZCAcQTmzJmjNOf8bX5LYGEa4Zdffin37t3zNwPuTwIkYGEC0C3CByYSCToY2gfR2nbgwAEdwrVsjKjAihs3rvpBYguVWpiWCnF4th1a9rLRMRIgARIgAQ0J5MqVS3bu3Klh5AyZBMwhECdOHKU1h3/9bX5LYGGSXK1atWT79u3+ZsD9SYAELEygYsWKalyrLhUwmKiDUviLFy9a+Kro6xraDlGhVaBAAdV6CPHYN3/MP/roI33BMHISIAESIAES8BOBQYMGSbdu3fy0O7clAecTqFChgsybN0/pyfrb/JbAevTokfTo0UNGjx5NoWJ/3wXcnwQsSgDC2wMGDJBOnTpZ1EPfuvX69WsZM2aM+hKGz0ia9QkgsYrWhUyZMqkf6Dui5fCNlhb0tDARkUYC/ibw+m8HmGL191Xg/iRAAkYQ2L9/v6qUZhuhEXS5pu4E8F131KhR0rx5c0voEfstgYUbAVUVLVu2lJs3b+p+XzB+EiCBdxBAG9fGjRslZ86cWvB58OCBGk07adIkLeJ1apAff/yxJEiQQKDfhn/xgyTXmx+0JEaIEMGp4TMuEiABEiABEjCVwK1btyR//vwcEGYqdW6mC4EkSZKo6qvcuXNbImS/JrBOnjwpZcuWlSNHjlgCBp0gARKwFgE8+J8+fVrChw9vLccM8ubMmTOqfZCt1QYB9tOyaDtEFRZ+IkeOLFGjRpXUqVNLxowZVTtiunTpJFmyZExq+en6cFsSIAESIAF7E3j8+LG0atVKpk6dau9A6D0JWJAAdMsnT54seEFrBfNrAgsAoG+zdOlSK7CgDyRAAhYj0LhxYwkKCrKYV8a5AwHS0qVLC94k0vQigCQtph5++umnqg0R/yK5BcF4tNIiCYYS7jf/6kWH0ZIACZAACZDA+wlAggETq5s2bUppGt4oJOBDAvje2aVLF/nuu+98uKp3S/k9gYVR8RgZTyMBEiCBfxJYt26dFC9eXBswaB1s0qSJNvEy0JAJoA0R1Vko30brIfS14seP/380tqCzhZ8oUaIIheRDZsojSIAESIAEnEcAkhN4puQQHOddW0bkPwKxY8eW2bNnS4kSJfznxD929nsCC/pX+HIO7RcaCZAACbwhECtWLDl//rxWAtjVqlVT2oA0BxAI9XcMr4yJA2/DUJkFofi3f5DEQpILCa548eKpUm/8i5+YMWMa4wxXJQESIAESIAELEIDkBGQYduzYYQFv6AIJOIMA5C42b94seC6zivk9gQUQNWvWlLlz51qFCf0gARKwAIGvvvpKli9fbgFPzHMBCYdr166ZtyF3chQBVF8hufX2z5u2Q/xvqVKlUi+M3vy8XdWFgQk0EiABEiABErArAUwgbNCggcyZM0fQUkgjARLwnsDXX38tgwcP9n4hH65giQTWr7/+KkWKFJGXL1/6MDQuRQIkYGcCo0ePltatW9s5BLd8h/5Vrly53DqHB5OArwigogvtiqjeevMv/vObH1RxQYT+TXLs7cTY2/pcb/5zqFAoQaORAAmQAAmQgHkERowYId26dZOnT5+atyl3IgGHEsB3vb179ypdViuZJRJYjx49kuzZs3MaoZXuDPpCAn4kgCltv/zyi3z++ed+9MLcrdu3by8jR440d1PuRgIuEkB1F6q08LsZ0g+0uJDsihAhgpog+ubn7f/+z/8PQvVvxOrxb7hw4ajn5eK14WEkQAIkQAL/IfDbb79JqVKl5M6dO0RCAiTgJQE8h+EFu9X0VS2RwHrx4oX06NFDhgwZ4iVmnk4CJOAEAjly5JD58+erVicdDJ+ByZMnV5pfNBJwAgG8tXuTlArp37erunDem+ouVHFFjhxZJcCQ8HqT9EJy60OVYNjv7Qqx9/FEiwlaTvCm/tmzZ//698152DcwMFBNhUybNq3yiUYCJEACJGA9AiiKwCTfM2fOWM85ekQCNiMwYcIENdnTamaJBBag/PTTT1K1alW5e/eu1RjRHxIgAZMJNGrUSIYPH64qPXSwAwcOSNasWdlGrcPFZoxuE/jnm78PvQn09C1hSHopWBc/SJ599tlngoELEAtG6yWNBEiABEjAOgQaN24skydPto5D9IQEbEgA32/+/PNPSZo0qeW8t0wC6+TJk1K3bl1OjrDcLUKHSMBcAqi2GDRokLRt29ZyJatGkRgzZoy0a9dOXr0yaGydUY5zXRLQmAA+q5DEqlGjhmTOnJmTHjW+Fxg6CZCAdQisXr1avvzyS+s4RE9IwIYEypUrJ9OnTxdMuLaaWSaBhRL+Tp06yfjx41mFYLW7hP6QwD8IQJ7ZqFRLokSJZNq0aVK0aFEtuKN9EA/BaJmkkQAJ2I8ABO7xeVWnTh01kAbtjTQSIAFzCWDm3EfmbsndLErg/v37kjhxYnb1WPT60C3rE0C1+dChQ6Vly5ZKksFqZpkEFsAsXLhQ9VlSeM9qtwn9IQHzCKA9Z+XKlZIgQQLzNvXjTsHBwVK5cmX5448//OgFtyYBEvCWQMKECQXtzx07dtSm/dlbZjyfBEiABIwgULp0aVmzZo0RS3NNEnA8AejyovoqX758lozVUgmsa9euqTHyp0+ftiQsOkUCJGA8AWjLzJs3z/iNLLID9P8aNmwoFy9etIhHdIMESMBTAhCQb926tfTu3Zv6WJ5C5HkkQAIk4CUBSDO0adPGy1WcerqRfRROZaZXXCVKlJA5c+ZIrFixLBm4pRJYIIQKrKCgIEvColMkQALGE8DvPwQ4dTBoXo0ePVq6dOmipqDRSIAE7E8A0xPxXQZJrI8//tj+ATECEiABErAZgf3790uePHkEUwlpJEACrhPAi7hevXqpH6ua5RJY27Zts2y5mlUvIv0iAacQwJQvDHRA6aoOdu/ePSXeDs0vGgmQgLMIYDANpqla9Q2ms2gzGhIgARL4H4ELFy5IhQoVZPfu3cRCAiTgBoEoUaLIxo0bJXv27G6cZe6hlktgQdAYwJA5p5EACehFIEOGDGpkKyoYdLBz585J2bJl+Xmnw8VmjNoRwJTCbt26SY8ePSjsrt3VZ8AkQAL+JAAhd+gRTpo0yZ9ucG8SsB2BHDlyCAqKrDyQxnIJLFzlcePGKdV7GgmQgF4EvvnmG+nbt682QePNIErcnz9/rk3MDJQEdCKQJEkSmTp1qhQuXFhQYUojARIgARIwnsDr169l7Nix0qFDB37HMh43d3AIAXxPmTFjhpqObmWzZAILIu45c+aU69evW5kdfSMBEvAhAVRd7d27VzJlyuTDVa29FEbUfv3119Z2kt6RAAl4RQBiqPPnz5fo0aN7tQ5PJgESIAEScJ3Azz//rIbknD9/3vWTeCQJaEwgUaJEcvToUUEboZXNkgks6MI0adJEFixYYGV29I0ESMCHBFKmTCmHDh0StN3oYkWKFFF95jQSIAHnEkAZ/oABA6Rz587ODZKRkQAJkIDFCECmoXLlyrJr1y6LeUZ3SMCaBNB2+/3331vTube8smQCC2WfEDVu0aKFPH361PIQ6SAJkID3BOrVqyeTJ0+W0KFDe7+YDVZ4/PixRI0aVV6+fGkDb+kiCZCANwSQmMeACrzdpJEACZAACRhPAM+T1atXZ0GE8ai5gwMIRIoUSb1UhwaW1c2SCSxA27dvn9SpU0dVZNBIgAScTQDtgxDarF+/vjY6MYsWLZIqVao4+8IyOhIggf9PoFGjRkqTJVy4cKRCAiRAAiRgAgHoKrdu3VpevXplwm7cggTsS6BgwYIye/ZsSZgwoeWDsGwC68GDB4IvewsXLhRk0GkkQALOJRA/fnxZsmSJ5M6d27lB/iOyWrVqyZw5c7SJl4GSgO4EEidOrH7n8+XLpzsKxk8CJEACphA4cuSIfPrpp6x2N4U2N7ErAUgddO3aVXr27GkLKRfLJrBwA6CdqFWrVmwjtOtvA/0mARcJ5M+fX6ZPny6BgYEunmHvw6DzlzFjRoE+A40ESEAPAviC2L59e/n2228lQoQIegTNKEmABEjAjwRevHghadOmlVOnTvnRC25NAtYmkCBBApkyZYpg6IwdzNIJrGvXrqkPndu3b9uBJX0kARLwkACGNowZM0ab1ppNmzZJuXLlBIksGgmQgD4EUAmAATX4bkMjARIgARIwnkCnTp1k2LBhxm/EHUjApgTQAbNmzRrbTEu2dAIL90DTpk0lKCjIprcD3SYBEgiJAEQDBw8erKotdbGBAwdKnz595NmzZ7qEzDhJgAT+JgC9P+hgNWvWjDxIgARIgARMILBz504lUUFJGhNgcwtbEujfv790797dNr5bPoF18OBByZw5M8X3bHNL0VEScI9AQECALF68WBv9q4cPH0qDBg0EIu78MuXevcKjScAJBNA+/Mcff2hTceqEa8YYSIAE7Evg+fPnSqLi4sWL9g2CnpOAQQQwWObw4cOSMmVKg3bw/bKWT2BhagT0cbZv3+776LkiCZCA3wmkS5dOdu3aJVGiRPG7L2Y4cPz4cTVhFTHTSMBxBEL9HRGHPX3wsqIKC0Mr0EZMIwESIAESMJ5AzZo1Ze7cucZvxB1IwGYESpYsKatXr7bVFHjLJ7BwD0ybNk1NJOQIVJv9RtBdEnCBQOPGjbVqE/7pp59UAgsafzQSIAE9CeTNm1d+/fVX1VJIIwESIAESMJbApEmTlCwNK9+N5czV7UUA30HwXQTfSexktkhgoWKhdOnSnCBhpzuLvpKAiwSWLl0q5cuXd/Foex/28uVLpX+DSWRMyNv7WtJ7EvCGACYSogozS5Ys3izDc0mABEiABFwgAB0sPEveunXLhaN5CAnoQSBTpkxK0gDfSexktkhg3b9/Xzp27CiTJ09m5txOdxd9JYEQCESMGFEuXbokMWLE0IIV9K8wcZFl7FpcbgZJAu8l8NFHH0mXLl0EAx1oJEACJEACxhI4c+aMqn7ftm2bsRtxdRKwCQF8Dxk0aJB07tzZVu2DwGuLBBbKPTF2umXLlsyc2+SXgm6SgCsEihUrJmip08Vu3rwpn3/+uZw+fVqXkBknCZDAewjkyZNHfbdJmDAhGZEACZAACRhIAC8QO3TooJVkhYE4ubQDCCRLlkx9B8Fzid3MFgksQA0ODpZKlSrJnj177MaY/pIACbyHANrpWrRooQ0ffH5ly5ZNm3gZKAmQwPsJxIsXTz1MlS1blphIgARIgAQMJjBy5Ejp3r27PH782OCduDwJWJsAqq+qVKmiZE1ix45tbWff4Z1tEliowkIb4YgRI2wHmQ6TAAn8m0CkSJFk7969kiZNGm3w4IsTW4a0udwMlAQ+SABfIDt16iR9+/YVtFPTSIAESIAEjCOwadMmqV27tly8eNG4TbgyCdiAQNSoUWXYsGFqSB6+i9jNbJPAAtiDBw8KxMY4QcJutxn9JYF/E8iePbusW7dOYsWKpQ0eJOtOnDihTbwMlARI4MMEUJG5bNkythHyRiEBEiABgwlAwL1gwYLqeZJGAjoTSJEihfzyyy+CNkI7mq0SWABcoEAB2bJlix1Z02cSIIG3CLRu3VoGDx6sTeUBdK/wB4NGAiRAAm8TwHSsHDlyEAoJkAAJkIDBBFCBNXv2bIN34fIkYG0C9evXl6lTp1rbyQ94Z7sE1qpVq6R8+fLy4sUL20Kn4ySgO4Fw4cIp7RdMhLFj6aon12/cuHFqEAWNBEiABN4m0KNHD/nuu+8IhQRIgARIwGACM2fOlLp16xq8C5cnAesSCBs2rJrGaUfx9jdUbZfAevLkieTOnVv27dtn3TuDnpEACXyQQGBgoMyYMUPy5cunBSm0PZcrV05WrFihRbwMkgRIwHUCn376qRw4cMD1E3gkCZAACZCARwQuXLgg+A7KQgiP8PEkBxDInz+/QA8uVKhQto3GdgksPAii7ahbt262hU7HSUB3AtAgmDVrliRKlEgLFPjCVKRIEepfaXG1GSQJuEcgdOjQcvToUUmVKpV7J/JoEiABEiABtwjgORIt27t373brPB5MAk4hsGjRIqlUqZKtw7FdAgu0f/vtN6lQoYJcuXLF1vDpPAnoSAAtgw0bNlQthLq0D6L1uUGDBnL9+nUdLzljJgESCIHA0KFD1URCGgmQAAmQgLEEBgwYIGjdppGAbgTSpk0r27dvt/0ALVsmsPAQ2KJFC1myZAknEur2m8d4bU8A4+LHjBmjklg62KtXrwRflvr16yfPnj3TIWTGSAIk4CaBQoUKqYlAdi7pdzNkHk4CJEACfiGAlm1MgGUboV/wc1M/EUDRQNeuXaVPnz4CLWI7my0TWCj/HD9+vHTp0kUePHhgZ/70nQS0IxAjRgwlHpghQwYtYr9z545KuM+bN0+LeBkkCZCA+wTix4+vWlp0aat2nxDPIAESIAHfELh//74SsD527JhvFuQqJGADAgEBATJt2jQpXry4Dbz9sIu2TGAhpLNnz0rRokXl5MmTtr8IDIAEdCKQJk0aOXz4sED3RQeDtk2tWrVk7969OoTLGEmABDwgEC1aNMF0rLJly3pwNk8hARIgARJwlcDTp0/Vi8WpU6e6egqPIwHbEyhdurQaoBU7dmzbx2LbBBbIt23bVkaPHm37i8AASEAnAihfHThwoDYhoy0Imn1440cjARIggXcRQDl/9+7dpXfv3gREAiRAAiRgIAFIOyB51bRpU8F/ppGA0wmEDx9eDcFD7sQJZusEFqo4cubMyTZCJ9yJjEEbArt27ZLs2bNrES/anYcNGyadO3fWIl4GSQIk4DmBqlWrqoeqSJEieb4IzyQBEiABEgiRwObNm6VmzZpy6dKlEI/lAT4iEOrvdZgv9BFM95ZJkiSJ4J4PDAx070SLHm3rBBYeDuvWrSuzZs2yKF66RQIk8DYB6LucOXNGwoQJowUYvNkrU6aMrFmzRot4GSQJkIDnBHLnzq3K+1OmTOn5IjyTBKxMAA+veIilkYCfCZw+fVo9Q0KTlUYCTieAF+mowHLK9HdbJ7Bwsx06dEgyZcrEElCn/+YxPkcQqFOnjnpA08WeP3+ues3ZPqjLFWecJOA5gcSJEysdrIIFC3q+CM8kARIgARIIkQC+nzVp0kSmT58e4rE8gATsTACaw1euXJE4ceLYOYz/47vtE1h4MKxSpYqsW7fOMReFgZCAEwkg6z979mypUaOGE8N7Z0xr166VUqVKaRMvAyUBEvCcACpTJ0+eLEj0O+Utqec0eCYJkAAJGEtg1KhR0q1bN3n8+LGxG3F1EvAjgdq1a6uXY04y2yewXr58qUZCQpTs0aNHTro2jIUEHEUgbty4smnTJsmQIYOj4vpQMPXr1+fbPW2uNgMlAe8JdOzYUfr37y8QXKWRAAmQAAkYR2DHjh1q8uuNGzeM24Qrk4AfCUSPHl2WL18uBQoU8KMXvt/a9gksIIGYO7KL+/bt8z0hrkgCJOATAkWKFFEVWPHjx/fJelZf5NmzZyrW27dvW91V+kcCJGARAkWLFpWlS5dK1KhRLeIR3SABEiABZxJA4UPmzJnlr7/+cmaAjEp7AkjQorLbSe2DuKiOSGChCqtVq1YSFBRELSztf1UJwKoEUFnw3XffSYQIEazqok/9wpu9PHny+HRNLkYCJOBsAvHixVMv5Zz2ZdPZV43RkQAJ2JVAo0aNZMqUKXZ1n36TwHsJoJJ7+PDh0rx5c8fJEjgigYUrh9ak8uXLy927d3krkwAJWIxA5MiRZfTo0dKgQQOLeWacO0jW9erVy7gNuDIJkIAjCSD5nStXLkfGxqBIgARIwEoEli1bpp4faSTgNAIZM2aUOXPmCP51mjkmgfXkyRMpXbq0bNy40WnXiPGQgO0CNLUYAAAgAElEQVQJYCz8rFmzJGfOnLaPxZUA0D6IL0Rr1qxx5XAeQwIkQAL/nwA0sLp3704iJEACJEACBhO4c+eOJEqUSB4+fGjwTlyeBMwjgEEwLVq0kBEjRkjYsGHN29iknRyTwAIviJSVK1fOJHTchgRIwFUC+fLlk5UrVwrEBHWwY8eOSaVKlVQrEI0ESIAE3CEAHayff/7ZnVN4LAmQAAmQgIcEihcvLuvXr/fwbJ5GAtYjEDp0aNm6datjq7kdlcB6/fq1EuP7888/rXcn0SMS0JgA3gKMHTtWGwIQYW7WrJlcv35dm5gZqEEEPvp73dcGrc1lLUkAuhX37t2TcOHCWdI/OkUCJEACTiIAiQtMs6eRgFMI5M6dW7Zt2+Y47as318dRCSwEBSE+PDi+ePHCKfcg4yABWxNAGeuCBQukcuXKto7DVefx2TNw4EDp27evYMAEjQRIgATcJfDbb79p03LtLhseTwIkQAK+JIDCB+gOYiohjQTsTgAtg+vWrZPChQvbPZT3+u+4BFZwcLBqIzxw4IBjLxoDIwE7EQgTJoycP39e4sePbye3Pfb15s2bauLHokWLPF6DJ5IACehNYNiwYdKhQwe9ITB6EiABEjCBwJUrV+TLL7+UPXv2mLAbtyABYwkUKFBANmzYIGgjdKo5LoEF8WQIoGIC2KtXr5x63RgXCdiGQJ48eVQfNiqxdLC//vpLypQpI8ePH9chXMZIAiRgAIGKFSvK4sWL/7Uyukn1+CQ1ACqXJAESIIF3EHjw4IF07NhRgoKCyIcEbE0ARQOzZ8+WqlWr2jqOkJx3XAILAaP0vk6dOnLy5MmQ4uf/TwIkYDABaAu0bt3a4F2sszzeekAQlO2D1rkm9IQE7EYgffr06rtMtGjR7OY6/SUBEiABWxGAhvLEiROlTZs28vz5c1v5TmdJ4G0CefPmlZkzZ0pgYKCjwTgygfX48WOlgzVr1izBhxKNBEjAPwQgQoxEcuLEif3jgB927dmzp6oCpZEACZCApwTwmYlhENmyZfN0CZ5HAiRAAiTgIgG8fGzQoIGcO3fOxTN4GAlYi0CECBEEzyBff/21QAfLyebIBBYu2JYtW5R4GasgnHz7MjarE8BU0H379lndTZ/6lyNHDtm1a5dP1+RiJEACehGIGTOmmtxavXp1vQJntCRAAiTgBwJnz55Vn7eofKWRgB0JpEiRQn788UfJmDGjHd13y2fHJrBAIV++fGqEJI0ESMA/BNq1aycjRozwz+Z+2PXOnTuCB08aCZAACXhDADoWeJPau3dvb5bhuSRAAiRAAi4SqFGjhsyfP5/dOy7y4mHWIoDus/Hjx1vLKYO8cXQCC1l0VGE9efLEIHxclgRI4H0E8ACGLwIQI9bFJk2aJE2aNNElXMZJAiRgIIH69esLNASjRIli4C5cmgRIgARIAARQ9YoXry9evCAQErAVgUiRIskff/wh6dKls5Xfnjrr6AQWoGAs6urVqz3lw/NIgAQ8JAABwSVLlkiWLFk8XMF+p5UqVUrWrl1rP8fpMQmQgOUI4AXctGnTJEmSJJbzjQ6RAAmQgNMIHDhwQHLmzMnCB6ddWA3igX7blClTNIj0PyE6PoG1YsUKQUnow4cPtbmoDJQErEAAyZzJkydLQECAFdwx3Ifr168LJofduHHD8L24AQmQgPMJQM9i0aJFWr0EcP5VZYQkQAJWJYAJhMmTJ5cLFy5Y1UX6RQL/IoBpxdAbxr2rizk+gYUPIWQlf/75Z12uKeMkAb8T+Oijj6RDhw4yaNAgQSuhDrZq1SqpUqWKYAoqjQRIgAS8JYDPTlSQFytWzNuleD4JkAAJkIALBNBCOGrUKBeO5CEk4H8CeN6qV6+e0r4KHz68/x0yyQPHJ7AwhRAfRBBD5YOlSXcVt9GeQIwYMdTvXZ06dbRg8fr1a+nRo4cMHTqU2glaXHEGSQLmEPj++++lY8eO5mzGXUiABEhAcwIY/oUhYDQSsAOBePHiydSpUwVdL0hm6WKOT2DhQp48eVLKlCkjx44d0+W6Mk4S8CsB6F9hlGumTJn86odZm9+9e1dq1qxJvT2zgHMfEtCEACQQZs+erdUXU00uLcMkARKwIIFnz54p3cGrV69a0Du6RAL/lwC0vqF9hUSWTqZFAgvVEZ06dZLhw4frdG0ZKwn4jQBEMLds2SJhw4b1mw9mbrx//35VbXbw4EEzt+VeJEACDieAiUKHDx9mAsvh15nhkQAJWIcA5CCgP0gjASsTiBw5sgwbNkxNP9ep+grXRIsEFgK9fPmypE2bVu7du2fle5G+kYAjCHTt2lUGDhzoiFhcCQLTFhs1aiR37txx5XAeQwIkQAIuEQgdOrTcunVLINJKIwESIAESMJ7AxIkTpXnz5oICCBoJWJUAXnCh5TVWrFhWddEwv7RJYIHgN998I/369TMMJhcmARL4D4GNGzdKoUKFtMCBqTVI1vXu3VuLeBkkCZCAuQRWrlwpaBOgkQAJkAAJGE9g9+7dUrx4cbl9+7bxm3EHEvCQwLhx41SiVUfTKoF18eJFKVy4sJw4cULHa82YScAUAtGjR5dLly5JpEiRTNnP35ug6qp27dqCKYQ0EiABEvA1gfbt21MCwddQuR4JkAAJvIdAcHCw0jXdsWMHGZGAJQlkyZJFSbVEiRLFkv4Z7ZRWCawXL17IoEGDpFevXkZz5fokoC2BatWqybx587SJH4nxrFmzUvBTmyvOQEnAXAKZM2eWffv2mbspdyMBEiABTQk8ePBATX8NCgrSlADDtjqBBQsWCLTadDWtEli4yLt27VLVEqzC0vWWZ9xGE9DtQ3Xt2rVqfC2NBEjAqgQwWtq+WiahQoVS+npRo0a1KmD6RQIkQAKOIjB69Gjp0qWLPHnyxFFxMRj7E8CgrGXLlsnHH39s/2A8jEC7BNajR48EAtPjx48XVGTRSIAEfEcgRowYcujQIUmYMKHvFrX4Sug/nzBhgsW9pHskQAJ2JrB161bJmzevnUOg7yRAAqYRePX3TqFM282JG23YsEHq1asnFy5ccGJ4jMmmBCDPAt3dFi1aSJgwYWwahfdua5fAAjL0NJctW1Zu3LjhPUGuQAIk8P8JFClSRJYvXy4Y7aqDYUJNokSJlOYXjQRIgASMIjBmzBhp1aqVUctzXRIgARIggbcIXLt2TUqWLCl79+4lFxKwDIHPPvtM5syZI2nTprWMT/5wRMsEFh460Te6ePFifzDnniTgWALQl8NP2LBhHRvj24Ht379fIKRIIwESIAEjCTRs2FAmT55s5BZcmwRIgARI4C0CNWrU0ErTlRff2gRChw4tnTt3VhVYupuWCSxc9AMHDkiePHnk4cOHut8DjJ8EfEIAVVezZs2S8uXL+2Q9OyzSv39/6dmzpx1cpY8kQAI2JlCgQAFZs2aNNtNdbXyp6DoJkIBDCEyZMkUaNWrkkGgYht0JBAQEyK+//iqpUqWyeyhe+69tAgvk0Ns8Y8YMryFyARIgAZH06dOrBBbKW3Wwly9fSsGCBWXbtm06hMsYSYAE/Ejgk08+kYULF0q6dOn86AW3JgESIAF9CJw5c0ZSpEgh6NyhkYC/CfTu3Vv69Onjbzcssb/WCayDBw9K4cKFqYVliVuRTtidwJdffinTpk2TOHHi2D0Ul/z/66+/1OcHBT5dwsWDSIAEvCCAwRioBihevLgXq/BUEiABEiABVwm8evVKMmfOLHhepJGAPwnEjx9fjh8/LtGiRfOnG5bZW+sE1oMHD6RTp04SFBTE7Lplbkk6YkcC6Mtu166dfP/993Z03yOf582bJ5hAePfuXY/O50kkQAIk4CoBTB4aMWKENGnSxNVTeBwJkAAJkICXBFD18u2333q5Ck8nAc8J4BmrX79+0q1bN88XcdiZWiewcC1XrVoljRs3litXrjjs0jIcEjCPQNSoUVV1QOXKlc3b1I87oX0Qf0jwQPnixQs/esKtSYAEdCHQtWtX6du3r4QLF06XkBknCZAACfiVADSTIY2BaiwaCfiDACRaMHiOEgL/o699Auv27dtSv359WbFiBauw/PFbyT0dQQClrbt375ZEiRI5Ip6QgsB4ZUwFQwKcRgIkQAJmEKhUqZJMmDBBYseObcZ23IMESIAEtCfw5MkTgQbhqVOntGdBAOYTCBMmjLRv3169vIoYMaL5Dlh0R+0TWLguq1evlooVK8rTp08tepnoFglYmwAmZG3atEk++ugjazvqI+/27t0rNWvWlGPHjvloRS5DAiRAAh8mgCqAJUuWSLJkyYiKBEiABEjABAKossckQg79MgE2t/gXgeTJk8vcuXMlR44cpPMWASaw/oaBslAIUK9du5Y3BwmQgAcEhg4dqvTkdLGlS5dKjRo1mPTW5YIzThKwAIFYsWKpEdqoBqCRAAmQAAkYTwATCCdPnizNmjVjG6HxuLnDPwi0bNlSxowZo02BgKs3ABNY/yW1f/9+QRXJvXv3XGXH40iABP4mECpUKDly5IikSZNGCx54G/fNN9/IwIEDtYiXQZIACViDACpc0bZcqlQpazhEL0iABEhAAwJbtmxRGq+Qj6CRgFkEYsSIIb///rukTp3arC1tsw8TWP+9VMiwN23aVCZNmmSbi0dHScAKBNKmTSuHDx9WiSwdDHoIxYoVk61bt+oQLmMkARKwEAFMIurZs6eFPKIrJEACJOBsAqdPn5Z69erxe5+zL7PlosPf+x49erD66h1Xhgmst6Ds27dPypQpIxcvXrTcTUyHSMCqBNq1a6em8elit27dEojWP3/+XJeQGScJkIBFCJQvX17QwkwjARIgARIwh8CzZ88ErVxoJaSRgBkEUqZMKYcOHZLw4cObsZ3t9mAC661Ldv/+fenevbua8oM2IZoVCaDKh6NsrXJlUHWFIQglSpSwikuG+zFz5kypW7eu4ftwAxIgARL4J4HEiRPL2bNn+UaWtwYJkAAJmEhg5MiRqhrm0aNHJu7KrXQkEC5cOBk8eLC0adNGm+4Wd68zE1j/ILZhwwZVJnrhwgV3WfJ4EtCOAB6moA2g01SssmXLyooVK7S71gyYBEjA/wTw0uD8+fOSIEEC/ztDD0iABEhAEwL4rlulShW5evWqJhEzTH8RyJ49u+BlOSRaaO8mwATWP7g8ffpUWrRoIVOnTuU9QwIkEAKBcuXKyZQpUwTTsXQwvHmLEyeOPH78WIdwGSMJkIAFCSxatEgqVapkGc9QE62HAqJlkNMREiABkwk8ePBAsmXLJsePHzd5Z26nE4EIESKoQVFff/21hA4dWqfQ3YqVCax34IIgddasWQXJLBoJkMB7st9/T8Tq06ePdOvWTcKGDasFpnXr1knJkiW1iJVBkgAJWJNA+/btZfjw4dZ0jl6RAAmQgEMJoENnxowZDo2OYVmBQKpUqeSnn36SwMBAK7hjWR+YwHrPpUHf6ZgxYyx74egYCfibQMyYMSUoKMhSlQBGM+nYsSMfHI2GzPVJgAQ+SABVALt27aIOFu8TEiABEjCRwMKFC6Vq1aom7sitdCMwcOBA6dq1q25hux0vE1jvQQaNifz580twcLDbUHkCCehAIGPGjDJ79mz59NNPdQhXUD6O6qtt27ZpES+DJAESsCYBtGyfOHFCYseObU0H6RUJkAAJOJDAjRs3JGHChIKphDQS8DUBPE9t2rRJG1kWb/gxgfUeeq9evZLvv/9eunTp4g1fnksCjiWAyYMY5x4xYkTHxvh2YHv27FFv3k6dOqVFvAySBEjAmgSiRIkia9eulbx581rTQXpFAiRAAg4lUKhQIdm8ebNDo2NY/iSwbNkywaAoWsgEmMD6AKM///xTatasKYcOHQqZJI8gAY0IYBJW9+7dpV+/ftpEDd2Dtm3byt27d7WJmYGSAAlYj0D48OFl1KhR0rRpU+s5R49IgARIwMEEhg0bJp06dXJwhAzNHwSQGF2yZIlAnoUWMgEmsD7A6MmTJ4Je1CFDhgj+M40ESOA/BCDavmrVKilWrJgWSFAu3qNHD8EXl9evX2sRM4MkARKwJgG8QGjZsqWMHj3amg7SKxIgARJwKIH9+/dLjhw52Ebo0Ovrj7BixIihXkqhaIaTB127AkxghcAJGlhffPGFnDx50jWiPIoENCAQNWpUuXDhgkSLFk2DaEUuX74sDRs2VG07NBIgARLwN4EyZcrInDlzBJ/FNBIgARIgAXMIXL9+XYoWLSro0qGRgC8IQJJl5syZEjduXF8sp8UaTGC5cJkxrhrTx2gkQAL/IVC+fHmlf6WL4YsKHhjPnTunS8iMkwRIwMIEPv/8c5k1a5akTp3awl7SNRIgARJwFoGHDx9K+/btZdKkSc4KjNH4hQB0hKdMmSLVq1f3y/523ZQJLBeu3OPHjyVfvnwCEWcaCZCAqDf/NWrU0AYFknWVKlVi+6A2V5yBkoC1CQQGBsr06dPVtGQaCZAACZCAOQQw5CsoKEhat24tL168MGdT7uJYAsWLF5fly5cLtC1prhNgAstFVuvXr5cKFSoIMu80EtCZAN4WnD9/XqsR7q1atZKxY8fqfNkZOwmQgIUIRI4cWaZOnSpVqlSxkFd0hQRIgAScT2DDhg1Sr149JaVBIwFPCcSOHVs2bdokGTNm9HQJbc9jAsvFS3///n1p3LixLFiwwMUzeBgJOJMA3vj/+uuvzgzuPVGlS5dOjh07plXMDJYESMC6BD766CM1YAatLBR9te51omckQALOI3DmzBmpVauW7Nixw3nBMSLTCHTr1k369+8v+HtOc48AE1hu8Fq3bp3Ur19frly54sZZPPTfBPCLykludr0zvv32W+nVq5dd3Xfb79OnT0uKFCncPo8nkAAJkICRBJo0aSIjRoyQSJEiGbkN1yYBEiABEniLwMuXL6Vu3boyd+5cSkvwzvCIQKpUqWTNmjWSMmVKj87X/aT/x95ZgFtVbW9/SB66S1IkJFQaBAmRDunuku5upLu7U7q7JQQ8dKc0SEq34Oc77+f/qhfknL1Xz3c8D4/e615zjvGbi73XGnPMdzCBFYw74OHDh9KsWTMlnIoz0DQS0I1AQECArFq1Sr7++mttQkeVQ/v27bWJl4GSAAm4g0CePHlUM41o0aK5w2F6SQIkQAIeITBy5Ehp166dvHjxwiMRMQyrCOBdqnPnztK2bVtqX/kInQmsYIILDAyUAgUKyIMHD4J5JT9OAu4nkDZtWlm0aJGkTJnS/cEEMYKMGTPKgQMHgvhpfowESIAErCHw4YcfquYycePGtWZCzkICJEACJKAI7Nu3T/LmzSuQmKGRQHAIfP7557JgwQJ2EQ4OtH98lgmsYMJD5VXjxo1l/PjxwbySHycBkwhYeCKzYsWKSsw8evToJgXjrGEvXbok0L9CJ1IaCZAACTiJQIgQIVRyHQ/DNBIgARIgAesIoAMhjoFdvHjRukk5kycI9OvXT1Xv4Tec5hsBJrB84Hbv3j3VMeDatWs+XM1LSMCdBEKFCiU9evSQTp06aSM4OGfOHNVphq2S3XnP0msS+JMARFLRphpdVPEndOjQ6nvs999/V5IA0DTBn1evXqkddfzTDYZ27mgwQyMBEiABErCWQKNGjWTcuHHWTsrZXE0gadKkcujQIYkUKZKr47DbeSawfFwBfGE1b97cNQ+5PobJy0jg/wjEjh1bJkyYICVLltSCCl5s/6y2xL/TSIAE3EUA3fkSJUqkKpTix48vCRMmFDw84v9DFemfCaznz5/L06dPVaXlnTt35MiRI6rr6NmzZ+XMmTPqvznV6tSpI5MnT3aqe/SLBEiABDxLYOPGjUpWhkYCQSGAhiuLFy+WQoUKBeXj/My/EGACy8fb4/Lly6qF6o4dO3wcgZeRgLsIpE6dWlasWKFNR75bt25J+fLlZdu2be5aKHpLAiQg+fPnl9KlSws07JIkSaKEzlFFGhRDRdb9+/dVx2H81m/YsEF996EjqdOS2dAlPHr0aFDC4mdIgARIgAQMJIDNjQQJEghO5tBI4H0EIMMye/ZsweYazT8CTGD5yA8PsZMmTZJWrVrJkydPfByFl5GAewig8yBe5HQ5s/3jjz+q44Pnzp1zzyLRUxLQmACOCJYrV0569eqlXirwkIgqK3/tzyOGS5culW7dusnp06f9HdKw6xEfXqLQ1YhGAiRAAiRgLQGcSli+fLm1k3I21xFA1Te6BufOndt1vjvRYSaw/FgV7M7WqFFDvdTTSMDrBFq3bi2DBw/2epgqPiSop0+fLk2bNmWCWosVZ5BuJYAkVeLEiSVHjhzSrFkzyZAhg6lJdrRMX7VqlWpmsXv3bsHxQ7tt69atkidPHrvd4PwkQAIkoB0BSMpAC4tGAu8igOpvaFX2799fIkeOTFAGEGACy0+I69evl2LFilHk2U+OvNz5BJDQQcJWB4MWTpcuXWTo0KE6hMsYScCVBCCCimOC3377rWTPnt3SGNDEBW2wZ8yYIYcPH7Z07n9ONmjQIGnTpo2tPnByEiABEtCRwP79+yVv3rzy8OFDHcNnzEEgABmDhQsXSqZMmYLwaX4kKASYwAoKpX/5DDoVQegZxwlpJOBlAvv27VN6MjrYzZs3pUKFCtS/0mGxGaMrCeC4ICpCK1eurPStjDgqGFwQOFp44sQJGTlypMyaNcu2aiwcm0QyjUYCJEACJGAtgStXrii91D179lg7MWdzDQF0cMemOLWvjFsyJrAMYIkjBR9//LFgR5ZGAl4l8PjxY4kQIYJXw/tbXOg8ljlzZu6oabHaDNJNBKDBh26C0KNKnz69Y1yfM2eOOiKA6k2r7ZNPPlFC7kEVqbfaP85HAiRAAl4lgGdjVMCiSzeNBP5J4KOPPlK6maFDhyYcAwkwgWUQzNGjR0vbtm1t24E1KAwOQwJvJQCBYDtezOxajpkzZ2pzXNIuxpyXBIJLAA+A0HoaNWqUpEyZMriXm/55dCyFbt7x48cF1VlWGRJ6kDNIlSqVVVNyHhIgARIggT8IQDMVmohIYqGggUYCfxKA3tXcuXOlSJEihGIwASawDAJ66dIlqVWrlkBMlUYCXiOAjl4ok9bF0Op2/vz5uoTLOEnAFQQKFy6sdOmQvLLjyOD7IOFFBsdIWrZsKYGBgerFxgqLESOGTJs2TYoXL27FdJyDBEiABEjgLwQ2bdoktWvX1uo5mTfAvxPAM0qdOnWUxEC4cOGIy2ACTGAZBBS7rbNnz5YWLVrIvXv3DBqVw5CAMwh89tln5goV4z3P/273hsGKGjWqPHjwwLDxOBAJkIB/BFCGv2PHDokfP75/A5l8NZ4FfvzxRylbtqzcunXL5Nn+Mzwejvv06aMSZzQSIAESIAFrCUBCpmTJkgKtWBoJgEDSpEnVxlKuXLkIxAQCTGAZCPXp06fqC2zjxo0GjsqhSMB+AmnTplUaKzoYjgGxJb0OK80Y3ULALcmrv/KEqDqqsvFcYLZhpxfNZEaMGCHQCKORAAmQAAlYS4CV+9bydvJsEGtv2LChDBkyRMKECeNkV13rGxNYBi/dTz/9JIUKFZL79+8bPDKHIwH7CEBj5fLly/Y5YOHMrVu3VseUaCRAAvYTwHcP9EWKFSvmyGOD/0YIVVH4Y4V+YOnSpWXixImC44Q0EiABEiABawlAxL1BgwbWTsrZHEkA1VcrV66U1KlTO9I/LzjFBJbBqwjNC7TL7Nmzp8EjczgSsI8ARNxRSeBE3RkjqUCAM1OmTHLs2DEjh+VYJEACPhDA9w6EcTt16uRKDQnICeBY36xZs0wXdc+aNaug+USKFCl8IM1LSIAESIAE/CGA7tVObC7iT0y81jcC2HRDBZbX35l8o2PMVUxgGcPxb6PcuXNHHUFCJyIaCXiFwM2bNyV27NheCeetcRw8eFAKFCgg+DtMIwESsJdAunTp1JH8mDFj2uuIH7Pv3btXdTQ9efKkH6O8/1JUqqHxxBdffPH+D/MTJEACJEAChhJAAUPy5Mnl559/NnRcDuYuAtC82rx5s4QKFcpdjrvMWyawTFiw169fy9SpU9XO65MnT0yYgUOSgPUE0F0Lu/xeNpSAt2rVyhLdGi9zZGwk4C+B0KFDy/LlywWdB91uvXr1UlXZv/32m2mhgNfChQulRIkSps3BgUmABEiABN5NoGPHjtK/f38i0pRA9OjRZfXq1ZItWzZNCVgXNhNYJrG+evWqOgu9du1a048OmBQChyWBvxFAcufbb7/1LJWXL19KkyZNZMqUKfw769lVZmBuIVCqVClZtGiRJ0TJUb2aM2dOOXv2rKn4Bw8erDbOKORuKmYOTgIkQAJvJXDo0CFJnz496WhIABVX9evXVwnMiBEjakjA2pCZwDKJN0pJkbyqXLmyPHjwwKRZOCwJWEegXr16SiTYqwaR+po1a8rWrVu9GiLjIgFXEIgUKZLs2LFDPv/8c1f4GxQn0SVw7NixQfmoz59B10N8R/Pogs8IeSEJkAAJ+EwAVbbJkiWTS5cu+TwGL3QngVSpUikdyowZM1L7yoIlZALLZMioWJk0aZLJs3B4EjCfAL6Uca47SpQo5k9mwww//vijVK1aVS5evGjD7JySBEjgTwLY+EEiJkKECJ6BAn0qtFk307JkyaISf2zbbSZljk0CJEACbyeA4oVq1arJnDlziEgjAqh67t27t+AIKc0aAkxgmcz5119/lS+//NJ0AVeTw+DwJCAQCcbuAhoUeM3evHkjM2bMUOW/r1698lp4jIcEXEMApfeTJ0+W8uXLe2oX88qVK5IkSRJTjydjcwHzoIKNRgIkQAIkYD0BFC1AQgbPlTQ9CEAfeMOGDRI5cmQ9AnZAlExgWbAIEFatU6eOPHr0yILZOAUJmEMgbNiw0qNHD2nbtq2EDBnSnElsGvXZs2fq7+jcuXNt8oDTkgAJgACODSJR/tlnn3kKCHbmkcDCUWUzDV0PM2XKZOYUHGNC+PYAACAASURBVJsESIAESOAdBHbt2iUlS5aU27dvk5EGBKJFi6ZOp1D7zNrFZgLLAt7379+X5s2bq4dyGgm4mUCRIkVUdUS8ePHcHMb/+A6R5dSpUwsqJmkkQAL2EShdurT6rfTS8cE/aUKYftmyZabCHTZsmLRo0cLUOTg4CZAACZDA2wmcP39eatSoITt37iQiDQh07dpVvvvuO09VjLth2ZjAsmiVtm3bJrVr1xZ8sdFIwK0EcDQFLWLRUctL1rlzZ+nbt6+XQmIsJOA6AqFDh5YuXbpIt27dXOd7UByGRgYeds20smXLCqq+aSRAAiRAAtYTePLkiSpaQEdrmrcJQHcSemcQ7qdZS4AJLIt4Q1cHGdp+/frxXLRFzDmNOQQgdD5r1ixzBrdhVHSLSZcunaBSkkYCJGAfAehHLFiwQAoWLGifEybOjOT/N998Y+ozQPz48ZUO1gcffGBiJByaBEiABEjgXQRQCYuNUchT0LxJAJqTgwcPFnT/9ZqsihtWjAksC1fpxo0bkjt3bjlz5oyFs3IqEjCWAKqwNm7cKBAtdLshsdy0aVOZMGGC20Oh/yTgegI4mnzs2DGJHj2662N5WwCHDx+W/Pnzm6qNgsQVElhIZNFIgARIgASsJ7B161apUqWK/PLLL9ZPzhktIQCdM1TZefV5xRKIfkzCBJYf8Hy5FEcJ8+bNa+oOrC9+8RoSCA6BTz/9VPbt2+f6du3oGoLdk+vXrwcnfH6WBEjABALQv1q8eLEJIztjyIsXL0qFChUkMDDQVIdQ6QW9QhoJkAAJkID1BB48eCDZs2eXEydOWD85ZzSdACqujh49KqlSpTJ9Lk7wdgJMYNlwZ6C9KoSwX79+bcPsnJIE/CeAL+8BAwaoc/6hQoXyf0AbRrh165Zqdbx06VIbZueUJEAC/yQwY8YMqV69umfBoElEo0aNZP78+abGCD2/jh07mjoHBycBEiABEng3AchtQB+J5i0CeOeBVmf37t29FZjLomECy4YFQ9YWX2xHjhyxYXZOSQLGEEiZMqVMmzZNsmXL5kq9lVGjRqmXPAhu0kiABOwlEBAQIKhQihMnjr2OmDg7jizjobd///7y+++/mzYTqrzmzZtn2vgcmARIgARI4N8JzJ49W6pVq0ZMHiOQJ08e1U0YGlg0+wgwgWUDezzE4uUZD7KPHz+2wQNOSQL+E0AVVtGiRdUZ8JgxY/o/oIUjHD9+XGnRUJ/AQuicigT+hQCOW/z444+eZzRx4kRp1aqVqYlz6BPieDRE8WkkQAIkQALWE7h586bSIuRpG+vZmzVj7NixlWZuiRIlXLlxbxYXO8ZlAssO6n/M+fDhQylcuLDs2rXLJg84LQkYQwAvY0OGDDFmMAtGQbfBtGnTyrVr1yyYjVOQAAkEhUCvXr1UWb7Xbf369VKnTh1Tv39QHbto0SL1PUcjARIgARKwh8AXX3whe/bssWdyzmoogRAhQkjt2rVl5MiREi5cOEPH5mDBJ8AEVvCZGXbFzp07pXjx4oIXahoJuJkA9LAaN24sESJEcHQYEGuHBs3y5csd7SedIwGdCIQJE0bQ4ATHkb1up06dkjJlypgq7hs3blyls4kKWRoJkAAJkIA9BHBcnHqE9rA3etYUKVKojSE0saLZT4AJLJvXYNCgQdKhQwd2JbR5HTi9fwTChw8vffr0kXr16jk2iQXR9k6dOsn3338vz5498y9gXk0CJGAYAVQKrVq1ShInTmzYmE4dCJp7BQsWNPW4JHaH8WyBTQUaCZAACZCAPQSgdZwxY0b57bff7HGAsxpCAJIpkEupUaOGIeNxEP8JMIHlP0O/RkCr1cqVK8uaNWv8GocXk4DdBGLEiKGOAOGlKXTo0Ha787f5Hz16pBon4PjOixcvHOUbnSEB3Qng7yZ0IaNGjaoFCrO7U33wwQfStm1b6d27t+O+i7VYYAZJAiRAAn8QwAmbHDlymFpxS9DmE0DiCvqVqBanOYMAE1gOWIetW7dKlSpVKCjtgLWgC/4TQBILVYWoysKLlJ0G8UwItleqVIkPEHYuBOcmgXcQwHfEwIEDpXXr1rZ/X1i1SCVLljT9GDM6EY4ZM0awsUAjARIgARKwngCq/Zs2baqqd2juJJAsWTLBe3qCBAncGYBHvWYCywEL+/TpU9WREMJwL1++dIBHdIEE/COABgVIYmXJkkUCAgL8G8zHq9EBZsmSJeoozYULF3wchZeRAAmYSQB6TZMmTZJixYqZOY1jxkY1aIECBUwX9oWeGI5Lf/TRR46JnY6QAAmQgE4E3rx5o37fmjRpwmOELlz4KFGiCDR+0XglVKhQLozAuy4zgeWQtcULdqlSpeTw4cPB9CjEH59/E8xr+HESMJcAunXgxQmVBs2aNZNEiRKZO+FfRkcSePXq1arcF40SHj9+bNncnIgESCB4BNKnTy8LFiwQ7HLqYCdOnJBy5cqZXhEaL148Wbt2rXz++ec6YGWMJEACJOBIAqjeqVatmqmdZx0ZuMudQnU43mEmTJggsWLFcnk03nOfCSwHrenGjRulUKFCFHR30JrQFf8IQAsLR1ggno72s2Z3Kbxy5Yp07txZCULfu3fPP+d5NQmQgOkEsHGzcOFCgUiqDoakUt26dQUdUc00bCJA8y9fvnxmTsOxSYAESIAE/oXA+fPnpXr16qY27uACGE8gYsSIsmXLFsmcObPxg3NEvwkwgeU3QmMHgA7IiBEjBNo9NBLwEoF06dIpYeE8efJI5MiRlUYWXrL8MXR2gUjm1atXZebMmapUmxVX/hDltSRgHQHscOKIL373dLDff/9dxo0bp74HIR1gtoFtmzZtzJ6G45MACZAACbyDwKtXr1SHbjyj4jeA5nwC2FDr16+f+q2mOZMAE1gOWxe8iJcpU0YCAwMd5hndIQFjCGTIkEFpY6VKlUqSJk0qCRMmVH/QgSwoCS20oceO1tmzZ9UxnB9//FF27Ngh+P9pJEAC7iGAh8Tdu3drs8OJpFX79u1l9OjRliwSmsPMnj3bkrk4CQmQAAmQwNsJoDABurDPnz8nIhcQwGmoZcuWSdiwYV3grZ4uMoHlsHVH5dW8efOkZcuWcvv2bYd5R3dIwDgCOF4YPXp0dbYcf6CZhYQWRJ3jxImj/uDvw507d+Tu3bvqD47dnDx5UnBUEP+O/49GAiTgTgL4u37x4kVtHhLxvVW1alXZvn27JQuWJk0aOXbsmCVzcRISIAESIIG3E8BGTdGiRSlt4YIbBO8hqJbLkSOHC7zV10UmsBy49tilhV4QhG1ZburABaJLphDAcSJUYOGff/7BRPg78Nc/6OpCIwEScD+B+vXry/jx490fSBAjOHTokHz11Vfq2LMVhgo3PE+ECRPGiuk4BwmQAAmQwFsIoLlQypQp1YYNzbkE8FvZrVs3adeunWCTneZcAkxgOXRtjhw5IsWLF5fLly871EO6RQIkQAIkQAK+E9i8ebPkzZvX9wFcduXUqVNVO24rDdVeOXPmtHJKzkUCJEACJPAPAtDBmjx5Mrk4mEDu3LllxowZkjhxYgd7SddAgAksB98H8+fPV5VYVoi9OhgDXSMBEiABEvAYARwbxgZNQECAxyJ7dziVKlVSEgFW2oABA9RuMo0ESIAESMA+AitXrpRvvvnGPgc4878SQNfBJUuWSP78+UnKBQSYwHLwIqHDWseOHWXw4MEO9pKukQAJkAAJkEDwCJQqVUo9LOpi0POLFy+e5dqWJUqUUGK0NBIgARIgAfsIoNFQ7NixWZRg3xL868wQ2m/cuLHg6D3N+QSYwHL4Gl26dEmwawsBQBoJkAAJkAAJeIHAyJEjpWnTpl4IJUgxoFvql19+GaTPGvkhvDDduHFD6QrSSIAESIAE7CMAIfc1a9bY5wBn/h8C+G2EZA821Ji8cs8NwgSWw9cKgtWLFi2SZs2ayc2bNx3uLd0jARIgARIggX8nECVKFFm9erVWXX5atWolw4YNs/zWCB8+vEBT8+OPP7Z8bk5IAiRAAiTwXwKjR4/WauPGDWuPbr3Tp0+XTJkyucFd+vj/CTCB5YJb4fHjx9KrVy8ZOHCgC7yliyRAAiRAAiTwbgJZs2aVOXPmaJNUgRxA6tSp5ezZs5bfFmHDhlWbYMWKFbN8bk5IAiRAAiTwXwIHDx6UXLlyCd7raPYTiBQpkvTv318gsM+ug/avR3A8YAIrOLRs/OzDhw8F3RHQhptGAiRAAiRAAm4lUKtWLYHeBB4edbDDhw9L9uzZbdE+CRUqlPTp04dC7jrcaIyRBEjA0QSuXbsm0H/cu3evo/3UxTloRGIzLUKECLqE7Jk4mcBy0VL+/PPPki1bNrlz546LvKarJEACJEACJPAfAmHChJHevXtL27ZttUEyduxYadGihbx69crymKHvUaNGDZk6dSp1sCynzwlJgARI4L8EUHnVunVrmThxIrHYTODDDz+Uffv2qeYqNPcRYALLRWsGPSwI33bt2pXlpy5aN7pKAiRAAiTwHwJ4WITeRIECBbRAgqRV3bp1ZdasWfL777/bEjPagi9cuFCgPUYjARIgARKwhwDe48aNGyfQRHz58qU9TnBWiRYtmtrUKVmyJGm4lAATWC5bOAi5o83n0qVLBV+ENBIgARIgARJwCwEIpm7atEnixo3rFpf98hOdhCtXriy7du3yaxx/Lk6fPr3Mnj1b6XDRSIAESIAE7COA37/atWvLlStX7HNC45lxrB6N0XC0PiAgQGMS7g6dCSyXrR92cH/66ScpU6aMXL9+3WXe010SIAESIAGdCVSoUEHmzp2rzXG2zZs3CzS/7HxZSZgwodptzpcvn863HmMnARIgAdsJXL58WcqVKyeBgYG2+6KjA5DimTFjhqRIkULH8D0TMxNYLl3KoUOHSocOHWzR1HApMrpNAiRAAiRgM4HJkydLnTp1bPbCmulRJT1hwgS124tOhHZZ+PDh1bGV6tWr2+UC5yUBEiABEviDAAoRUJU7f/58246V67oQODo4adIkVQRCczcBJrBcun4vXrxQLwHonkAjARIgARIgAacTCBkypJw7d06SJEnidFcN8e/JkydK68QJgr29evWS9u3bs1W4ISvLQUiABEjAdwJjxoxRGxuUgvGdoS9XovADv4U4RkhzNwEmsFy8fhcuXFBZ/D179rg4CrpOAiRAAiSgA4F06dLJgQMHtDk+CM3KIkWKqJjttpo1a6omMJEiRbLbFc5PAiRAAloTOHr0qGTMmJGnaCy8C4oXL66aqbCZiYXQTZyKCSwT4Zo9NMpQV61apSqxbt++bfZ0HJ8ESIAESIAEfCbQo0cP6d69u8/Xu+3CkydPStq0aR2xy54jRw5ZsmSJxI4d220Y6S8JkAAJeI5AokSJbNVG9BzQfwkIVd/r16+n7pWHFp0JLJcv5rNnz6Rbt24yYsQIZvJdvpZ0nwRIgAS8SgDHByFamyFDBq+G+D9xQauydevWjogXiSvwT5w4sSP8oRMkQAIkoDMBHC8fNmyYzggsiT1q1KgycOBA1UyFRwctQW7JJExgWYLZ3EmuXr0qVapUke3bt5s7EUcnARIgARIgAR8IJE+eXPbv36/VEba8efPK1q1bfaBlziW7du2SL774wpzBOSoJkAAJkECQCWBDIWvWrEH+PD/oGwEkrgYPHizRo0f3bQBe5UgCTGA5clmC79SpU6ckT548As0NGgmQAAmQAAk4iQA0mMaPHy9hw4Z1klum+XL//n2JGzeuoOGKU2z06NHSuHFjp7hDP0iABEhAWwLoTItjhL/88ou2DMwOPEGCBEonOn78+GZPxfEtJsAElsXAzZxuwYIFUqNGDXn+/LmZ03BsEiABEiABEggygQ8++EAlr+rWrSshQoQI8nVu/uDChQulfPnyjgoBScRp06Y5yic6QwIkQAK6EqhYsaLMnz9f1/BNjRsNS3744QetZAtMBeqwwZnActiC+OPOgwcPBC1Cp06dKi9fvvRnKF5LAiRAAiRAAoYQiBcvnnz//feqSlgXq169uup45CRLkyaNHDt2zEku0RcSIAES0JbAhAkTpGHDhoKmXDTjCESMGFG6du0q7dq1M25QjuQoAkxgOWo5/Hfm+PHjgl3Wffv2+T8YRyABEiABEiABPwl8+eWXMn36dPn444/9HMkdl+P4ILRNzpw54yiHQ4cOrToWs424o5aFzpAACWhKAMfbihUrJnfv3tWUgPFho8q7bNmyMnLkSIkTJ47xE3BERxBgAssRy2CcE8jir1mzRooXL86MvnFYORIJkAAJkICPBLCpgp3mMGHC+DiCuy7btm2beoC+c+eO4xxHs5ecOXM6zi86RAIkQAK6Ebhw4YJUrVpV0GCDZgwBdNrFEf5MmTIJ5Ato3iTABJY311U6d+6s2oZCJJBGAiRAAiRAAnYQCBcunPTr10+aN29ux/S2zDlkyBDp0qWLI/Uo0Y2pdevWtnDhpCRAAiRAAv8l8PjxY2nVqpVMmjSJWAwggCYxqLz69ttvDRiNQziZABNYTl4dP3yDBlaFChVk+fLlrMTygyMvJQESIAES8J1AzJgx1e9Q9uzZfR/ERVc+ffpUGjRoILNnz3bkby9Eg+fOnesionSVBEiABLxJAKdmRowYIZ06dZJnz555M0iLosLRwSZNmgg2aXBcnuZtAkxgeXh99+7dK/Xq1ZPDhw97OEqGRgIkQAIk4FQCyZMnl0OHDkn48OGd6qKhfp09e1bpUDr1SMgnn3wiR44c4QO+oavOwUiABEjANwKbN29WHeSvXbvm2wC8ShHInz+/apxC3Ss9bggmsDy8zsjsQzi3ZcuWgg6FNBIgARIgARKwkgA2USZOnGjllLbOtXXrVkGV061bt2z1412ToyPkzp07JWnSpI70j06RAAmQgE4E8FuB5As2Fmi+EUiYMKFKXuXOndu3AXiV6wgwgeW6JQuewzhKCL2LsWPHyps3b4J3MT9NAiRAAiRAAn4QWLFihWoqooPhNxZi9Y0aNXJsuNGjR1dHCAsUKOBYH+kYCZAACehEAJse8+fP1ylkw2KNECGCfPfdd0pnM1SoUIaNy4GcTYAJLGevjyHeoRMSBO2WLl1qyHgchARIgARIgATeRyBSpEhy5coViRIlyvs+6on//uLFC6lTp47MmTPHsfHgKCcavDRu3NixPtIxEiABEtCJAETcKTzu24o3bNhQNYrR5TnDN0reu8pTCazf/1gfNsx8+0166dIlKV26tBw4cMB7dzEjIgEScDABfCvj25mmG4EiRYrI6tWrtQkbHaXSpEkjly9fdmzMELpt1qyZDBs2zLE+0jESIAES0IUAfjdQtYsjcLTgEciTJ48sWbJEokWLFrwL+WnXE/BUAsv1q2FiANDDwotE7dq15fbt2ybOxKFJgARIgARIQGTMmDGOPk5n9Brt27dPMmfObPSwho9XtmxZmTJlikSOHNnwsTkgCZAACZBA0Aig82CfPn1U5zxU8NKCTiBRokSyfv16QWMSmn4EmMDSaM3xRTlkyBD1Zfn8+XONImeoJEACdhPA0aWAgAAJFy6c+mfYsGHl1atX6g+0+p48eSIPHz4UJNtp7icAXYqffvpJVSTpYh07dpT+/fs7Ptwvv/xSNXj5+OOPHe8rHSQBEiABLxJ4/fq1DB8+XOk3PXr0yIshmhZTrFixVNKvcuXK1L0yjbKzB2YCy9nrY7h3d+/eFZwXXrhwoeFjc0ASIAES+JMA9I9QjZIuXTpJliyZRI0aVZDE+vPPnwks7DoigYUHOBx1Pn36tJw8eVKOHz8uv/76K4G6lEDWrFll+fLl2rS0RuI1ZcqUcvbsWcevGBJXs2fPlmzZsjneVzpIAiRAAl4jgOQVCgr69u3LLvHBXFwcg2/ZsqV0795d8JxJ05MAE1garjtE3XPkyCFnzpzRMHqGTAIkYBaBkCFDSvr06aVmzZryzTffCKpwkLBCsuqDD96vUIiHOlSH4g+OOqM8fPLkyXLs2DGzXOa4JhGApgfEwnEP6GBIvKZKlcoVFYSogpw3b576O0ojARIgARKwjgC61SJ51aNHD3n69Kl1E3tkppw5cwq6G2NTlKYvASawNF17HO0oU6aMXLt2TVMCDJsESMAIAtgNg4Bm6tSppX379lKgQAEJHTq0EUP/3xjQ7xs1apTs379fUEXKY4aG4jV8MKw/9K/q1q0bpMSl4Q7YMODYsWNd1dkPf5+QZMTfXxoJkAAJkID5BH777TfVpbZNmzaCYgJa8Aigmh/vr9GjRw/ehfy05wgwgeW5JQ1aQDiyg7atXbp0kfv37wftIn6KBEiABP5CAA8R6DRXsWJFKVSokKACyyzDTuXOnTtl8eLFsnbtWrly5YpZU3FcPwkkSZJEpk2bJugQpINhR718+fLq3nSL1atXTyWFUR1JIwESIAESMJ/A/Pnz1UYf5BJowSMQP358mTBhghQtWjR4F/LTniTABJYnlzVoQUFfplWrVqp1Kx7AaSRAAiQQVALFixeX5s2bqyODVu6GQTPrhx9+UMfTtm3bJjh2SHMWAYiE44gaHjh1MCRTkch101FX6NNt2bJFIkaMqMMSMUYSIAESsJXA0qVLpWnTpjz54sMq4HeqQ4cOSvsKshQ0EmACS/N7ADoz0MNyg/Cs5kvF8EnAEQTw8NCuXTuV/LZLQBNHCO/du6f8mDJliiO40In/EIDWWfXq1VUFVlB0z7zAbc2aNVKnTh25ceOGa8JB5RUSb+jmRCMBEiABEjCPwMaNG1XHPB4b9I1xsWLF1KaYLpqavlHS6yomsPRa77dGi+RV4cKF5eeffyYNEiABEngngaRJk0rPnj2lQoUKjmldPHXqVCWGevXqVWpjOeDehf4V9KCgf6WDIZk6aNAg6datm6A60E2GioCSJUu6yWX6SgIkQAKuIYDTLT/++KPSRzx69Khr/HaSo2nSpFGyEQkTJnSSW/TFZgJMYNm8AE6ZHg+yOA5EXRmnrAj9IAFnEciWLZt6UcfxMCcZHhDXrVsnnTp1kiNHjjCJZfPioMPdgQMH5JNPPrHZE2umf/DggfrtnDFjhjUTGjgLXqpGjx5t4IgcigRIgATMJPD7H4O/v6OxmR4EZ+xDhw5Jw4YNZc+ePcG5jJ/9/wTwHAHR+wwZMpAJCfyNABNYvCEUAbStx4MsqisePXpEKiRAAiTwfwRy5colw4YNc+xDBDr7BAYGSs2aNXkc2ub7Nm3atHLw4EHHVOiZjQMVzJUqVVIdMt1meDk4efKk29ymvyRAAiTgeALHjx9X1er4Jy34BOLEiSMjR46UcuXKaSNHEHxK+l7BBJa+a/8/keP4A85oL1myhFRIgARIQBFInjy5avSQNWtWxxM5f/68ZM+eXW7evOl4X73qICrh+vTp49Xw/icudMbMnz+/2gRyo6GCLHLkyG50nT6TAAmQgCMJQJLlm2++kRMnTjjSP6c7BY1GdGvs0qWLQJaARgL/JMAEFu+JvxG4du2alClTRn766SeSIQES0JxAjBgxZPz48VK2bFnXkNi8ebNUrVrVVYLaroH7Hkch2r5v3z7HVuqZwXnIkCHSpk0bM4a2ZEx0Ivzqq68smYuTkAAJkIDXCZw5c0ZatGgh69evZ4d3Hxe7dOnSqkFP1KhRfRyBl3mdABNYXl9hH+KD0GC1atXk8OHDPlzNS0iABLxAAG2LIcaNZJCbusmhknT48OHSu3dvefz4sReWwjUxJEqUSFAFFzJkSNf47K+jRYsWFXQhdKshAYeOojQSIAESIAH/CKD6u169ekp0HNIGtOATgM4qqv6TJEkS/It5hTYEmMDSZqmDHii6Kq1evVrq168v169fD/qF/CQJkIBnCLRt21b69u3rSi2ju3fvqi54y5cvp6i7hXdkjRo1ZPr06RbOaO9UL1++lJgxY7paN7JKlSoye/Zse0FydhIgARJwOQGcYMGxQQi3o7kMLfgEIFkBGRtoadJI4N8IMIHF++OtBLBzgJ1ZiLo/ffqUlEiABDQhgGordBxEIiJFihTGRI1nuRDGDBXUUaA9kSdPHrl9+3ZQL+Hn/CCA+wad+FC9q4tho6dYsWKuDjdTpkyqzXuYMGFcHQedJwESIAE7CGDT/+LFi4INnB07dtjhgifmjBUrlowZM0bJ2IQIYfEDoycI6hUEE1h6rXewon348KHS9pg8eTKrGIJFjh8mAfcSiBIliuo4iI5+bjo6+Dbi/fv3F4iK4wGTZi6B2LFjy7p16yR9+vTmTuSg0fHCMnPmTAd5FHxXkKResWKFpEyZMvgX8woSIAES0JwANK9QsY4NjdevX2tOw7fwsYECwXa8c4YLF863QXiVVgSYwNJquYMf7K1bt9R5bjzg0kiABLxPAPoD+PseLVo01weLJHyuXLmo52fBSubNm1dVYCVIkMCC2eyfAlpr0PzCb6SbLV68eDJt2jQpWLCgm8Og7yRAAiRgOYErV66ozb5t27YxeeUH/Tp16sigQYM88dzpBwZeGgwCTGAFA5auH7106ZIUKVKE7WB1vQEYt1YEli5dKiVLlvRMzPPmzRPo/FCTwtwlbd68uaDiLSAgwNyJHDI6jt3hiKrbhXrRrGHw4MFK85JGAiRAAiQQNAJIXhUqVEhOnjzJKu+gIXvrp/A7CtF7XZ4d/EDFS/9CgAks3g7vJYAXP3RZaty4sVy+fPm9n+cHSIAE3Ekgc+bMEhgY6E7n3+E1HjKRwKI2hXnLiiTI0KFDVbWuLoYGB127dnV9YhTHhNu1ayd9+vTRqnukLvcp4yQBEjCWACQJTp8+rd6Jtm7dyuSVj3jx25MmTRpZsGCBpEqVysdReJmuBJjA0nXlgxk3ui1BCwsPuk+ePAnm1fw4CZCAGwjgCFj16tXd4GqQfcR314ABA6R3796Cf6cZTwDtrufMmSPZs2c3fnAHjvj8+XOpUKGCZ47WV65cWUaPwAJKoQAAIABJREFUHs3jGw681+gSCZCAswhA86pFixayYcMGHhv0Y2kSJkwoI0eOlOLFi3PzxA+Oul7KBJauK+9D3OhGOGrUKOnQoYMPV/MSEiABJxOAdtGuXbsEDxVesy1btkitWrVYQWrSwqJyb+PGjYIGADoYdt8rVqyo2qV7wXLmzKnE6JGIpJEACZAACbydwIULFwQJf1SqU5bAv7tkypQpqjo+bNiw/g3Eq7UkwASWlsvuX9DQypg4caJ/g/BqEiABRxFARzW0MI4QIYKj/DLCmV9//VXp+P30009GDMcx/kGgQYMGMm7cOG24oMkBjku6XcD9zwVLnDixLFu2TNKlS6fNGjJQEiABEggOgfPnz0uxYsWU5hXNPwLdunWT7777zr9BeLXWBJjA0nr5fQv++vXr6uEd5bNuF7D1jQCvIgFvEQgdOrSMHTtWateuLSFChPBWcP8/mm+//VYmTZrkydjsDmrhwoVStmxZu92wZH60SR8yZIh07NjRMzvwaGGOFvD58uULEsPf//jUB0H6JD9EAiRAAu4mAM2r48ePCxqVUPPKv7VEtVWlSpUE1Vdefdb0jxCvDioBJrCCSoqf+z8C+DI/ePCg4IVw//79JEMCJOByAjg6BP2rXLlyuTySd7s/e/ZsqVatmmfjsyswJD/Q3CNOnDh2uWDpvPfv35dGjRrJ3LlzLZ3X7MmggQVRYhoJkAAJkMB/CZw7d05QZYzkFY8N+n5nhAwZUlXCQ/eKx9V958gr/0OACSzeCT4RwJc49HLQQpai7j4h5EUk4BgCuXPnllmzZnlS/+pPyGfPnpUUKVI4hrlXHMG9gwd7dBTSwS5duiQFCxZUXai8ZKiqpjSAl1aUsZAACfhL4NSpU1KmTBl1bBCb9zTfCXzyyScyf/58+fTTT7V5XvCdFq98HwEmsN5HiP/9XwlAHBkdJCDwTiMBEnAfASQeIHCOLqNeT0JEihRJHj9+7L5FcrDHulXu7NmzR3Vb9NrLTNasWQWx0UiABEhAdwL4fj9x4oQSbD9y5IjuOPyOH89eeF/MlCmT32NxABIAASaweB/4RQBf8sOGDZNevXoJjlbQSIAE3EUgICBAlXSjAsPrhocnHns2bpWhnYZKpI8++si4QR0+EsRn8XvnNYscObLcvn1bcCSURgIkQAI6E0DDl3bt2smOHTs8t1lh9bpCXgDPmOXLl7d6as7nYQJMYHl4ca0K7d69e6qbxIQJE+T58+dWTct5SIAEDCAQNWpU9ZCWNm1aA0Zz9hAVKlSQBQsWONtJF3mHrnWo2tGpDXbmzJll3759LlqloLt66NAh+fzzz4N+AT9JAiRAAh4jgCPxrVu3Fnwfeq3S1uqlwvNlly5dpGnTptwcsRq+x+djAsvjC2xVeGhTX65cOVUiSiMBzxCArI9jZQ+McQ66BMeOHRMIbHrdWrZsKcOHD/d6mJbFh65M6Minw70DqDdv3pT48eMLOhF60bBLjhcNGgmQAAnoSGDp0qVSv359VY1K848Angvq1q0rgwcPlogRI/o3GK8mgX8QYAKLt4RhBK5fv65E3fEyzF0Lw7ByIBIwlQDK5AcMGGDqHE4ZvG/fvtK5c2enuONqP/Bwik58ZcuW9bx22p8LNWnSJNV916uGIx4Q2aWRAAmQgE4EXr16paqz27ZtK7/88otOoZsSK/RUv/rqK/V7EjNmTFPm4KB6E2ACS+/1Nzz6o0ePSu3atT17xMJwYByQBGwmsHv3bsmWLZvNXlgz/dChQ9XRAJr/BJImTaoSWFmyZPF/MJeMgIYlq1atcom3wXczQYIEgi6LIUKECP7FvIIESIAEXEjgt99+U01sevbsyeSVAeuH5FXevHll+vTpgt8UGgmYQYAJLDOoajzmmzdvZOPGjeoYAtrW00iABJxL4MMPP5QLFy5oo03gVQFuO+6wggULypQpU9SROh3sxo0bqoPStWvXPBtuqFCh1PcBXzo8u8QMjARI4C8EoNvbu3dvGTNmDBtRGXRnYEMUmsifffaZQSNyGBL4XwJMYPGuMJwAjg/OmjVLGjZsKE+fPjV8fA5IAiRgDIGqVauqv6u6WKNGjWTcuHG6hGtanNhhbdKkiepAq4v+1erVq1VL9YcPH5rG1e6BUXmFCrPChQvb7QrnJwESIAFTCeD9pGvXrjJ69Gh5+fKlqXPpMnjixInVxtbXX3+tS8iM0yYCTGDZBN7r0yKJ1b9/f+nTp488efLE6+EyPhJwHQEkIWbOnClIYuliJUqUkBUrVugSrmlxRo4cWYnh16pVy7Q5nDQwfs969Ogh/fr1E2ileNXwnTBw4EBp06aNV0NkXCRAAiQgaDyFdxQ0rnjx4gWJGEAgevToSrC9Zs2a2uhiGoCNQ/hIwPsJrDd/kKGcg4+3h3+X4Vx5r1691C79o0eP/BuMV5MACRhKIEaMGLJt2zZJkyaNoeM6dTAkIRImTOjpI2BWscexwTVr1mhzRODBgwcqWYcOVV636tWry4wZM7weJuMjARLQlACOgXfp0kXmzJnj6Q0JK5c3WrRoqiMxfj90qcq2ki/n+l8C3k9gcdVtJYAHfwgjskTX1mXg5CTwPwTQIQYPcPHixdOCzs2bN1Ws7JDq/3JnzpxZdu7cqY122pEjR6RGjRpy6NAh/+E5fIQ8efLI8uXLBVV2NBIgARLwEoHz588rjd5169YJNHtp/hMIHz68qmaDRAOTV/7z5AhBI8AEVtA48VN+ELh7967avYa2Bl8e/QDJS0nAQAItW7ZUR3zDhQtn4KjOHeqHH35QbZ1p/hNo3769emDVxVauXCnVqlUTbMh43T7//HPVXTJVqlReD5XxkQAJaEQADSoaNGggGzZs0Chqc0MNHTq0SgiiUCFChAjmTsbRSeAvBJjA4u1gCQH8cEBrZ9euXZbMx0lIgATeTQAPGiNGjJA6depogwkJl44dO2oTr5mBbt++XXLmzGnmFI4ZG0fhoeuhy72DY7ZTp06VfPnyOWYN6AgJkAAJ+EPg4MGD0rp1a9m6das/w/DafxCoWLGi0sOMEycO2ZCApQSYwLIUt96TnTlzRh3D2LNnj94gGD0J2EwgadKkqvtg9uzZbfbEmunRYah06dKCTnI0/wjEjh1bLl26JAEBAf4N5JKrHz9+rLoPogpLB0Nye9SoUdoI9OuwpoyRBHQlgFMf0GtE1fDx48d1xWBK3AUKFJBJkyZJokSJTBmfg5LAvxFgAov3h6UEdu/erR6MT58+bem8nIwESOC/BHLkyKG68aFrjA6G75uyZcvKsWPHdAjX1BiRzIF2mi6GI/CffPKJ3LlzR4uQ0YkQHRc7deokoUKF0iJmBkkCJOA9AtC4QuMNdFW9ePGi9wK0MaJcuXLJ999/L2joQiMBOwgwgWUHdY3nxG7IggULpEWLFnLjxg2NSTB0ErCPQP369WX8+PH2OWDxzHiIhfbFrVu3LJ7Ze9NBHwnHBnQxiP0WLlxYl3BVnGiDjiPGFHLXatkZLAl4hsCLFy9kyZIl0rhxY7l3755n4rI7EGxwoHM1jpmjmQuNBOwiwASWXeQ1nheaIlOmTJEOHTrI/fv3NSbB0EnAegJ4AEEFTaVKlayf3IYZX79+Lf369VNVJfh3mu8E0Cr7wIEDkiRJEt8HcdmVSHxOmDDBZV775y521+fNm6dNh1L/aPFqEiABJxHARhWOtvXu3VueP3/uJNdc7wvkJ4YMGSLffPONhAgRwvXxMAD3EmACy71r52rPX716pV6iUYmlQ2cnVy8WnfcUATx0XL16VZuX019//VXtwuKFnOYfga+//loWLlwoSGTpYDiCAlHz69ev6xDu/8WYIEECJXacLFkyreJmsCRAAu4mAH3G7777Th1vQxUWzTgCcePGlZkzZ6puzjxebhxXjuQbASawfOPGqwwggEqsyZMnS7t27eTRo0cGjMghSIAE3kcga9asWjVSOHfunJQoUUJOnDjxPjT87+8hgKpZVLKFDRtWC1b79++XTJkyaRHrX4NElWZgYKCWsWu32AyYBDxCADqF0LrcuXMnq60NXlPopeJIJqpz8ftAIwG7CTCBZfcKaD7/s2fPVIvygQMHCro90UiABMwlgPLvVq1amTuJg0b/4YcfBN1yUPVJ851A+PDhle5FhQoVfB/EZVf27dtXOnfu7DKvjXF33LhxSjeORgIkQAJOJoDN8EOHDkmVKlUE3c5pxhKIEyeOekdDAxdWXhnLlqP5ToAJLN/Z8UqDCKD6asCAAeoLki+ZBkHlMCTwFgJ4+MAD3kcffaQNH1QM4UgBzT8C6MQ3Y8YMyZIli38DueRqvBQVKlRINm/e7BKPjXWzbt26SkeGRgIkQAJOJQCNq2XLlkmXLl3k559/ttFN6EG9sXF+c6aOECGCej+rXbu2hAsXzpxJOCoJ+ECACSwfoPES4wk8efJEBg0aJH369BG8ONBIgASMJ/Dpp5/K4cOHtSoBz5Ejh+zatct4mJqNiCo26BbGjBlTi8iR6EX3wfPnz2sR7z+DzJAhg+AIJY0ESIAEnEgAXc3Hjh2r3hvQ1Rz/m2YcgdChQ8vo0aOlWrVqTF4Zh5UjGUSACSyDQHIY/wkgidWxY0f1g8RuYf7z5Agk8E8CTZo0kVGjRmkDBseSI0eOzAdbP1ccwv+NGjXS6t5ZsGCBNGzYUNAEQEdDtSaqG0KGDKlj+IyZBEjAwQSw0Y33BUiQ0IwngO9/FBWg0RaNBJxIgAksJ66Kxj6h2xOEgrHTjw5QNBIgAWMI4EUUf6900jBCx5waNWoYA1DjUXB0YPr06VK+fHktKGADpVu3bupYu84Vwbt375Zs2bJpseYMkgRIwPkEUGWFqtiuXbvK3Llzne+wCz3EscFmzZqpdzFsANJIwIkEmMBy4qpo7hPa4LZu3VoWL16sOQmGTwLGEUiUKJHqIpMxY0bjBnX4SCVLlpTly5c73Evnuxc1alR19BT3kA52+/ZtqV+/vixdulSHcN8Z47Bhw7gDr/UdwOBJwFkE8DvUvn172bJlCzVzTVoaVOojQRg7dmyTZvBvWBwUZR9E/xh64WomsLywih6M4e7du1KrVi1ZuXKlB6NjSCRgPQEIUk+ePFnix49v/eQ2zHj//n1JkSKFIBlB849Azpw5Bd0ccZRQBzt69KiqVDx58qQO4b4zRjCYN2+e1gwYPAmQgDMI7N27V3UahFg7T2iYsyY1a9aU4cOHS5QoUcyZgKOSgEEEmMAyCCSHMZ4AKrHQ+WLbtm3UxDIeL0fUiMAHH3wgLVu2VN1kdGmDvH79eildurQ8ffpUo5U2J1TojKAqVhdbt26dFC9eXOvjg1jrJEmSqJdFXRKXutzfjJME3ETg5cuXsnr1aiUmDq1cmvEE8FxYqlQpJTMB8XYaCTidABNYTl8hzf07ePCgOsKwfft2zUkwfBLwnQB0DIYOHSp16tTxfRCXXdm9e3fp27ev9kkIf5cNyQtUIqGaTRfD8YnevXvrEu4744wRI4YEBgZK0qRJtWdBACRAAtYTuHfvnowfP15GjBghN2/etN4BDWZEwgpyCxBtT5w4sQYRM0QvEGACywur6PEYDh06pPRI8CBNIwESCD4BPJQsWrRIMmXKFPyLXXjFo0eP1G4t9a/8X7xPPvlETpw4Iaji08EgEpw7d27ZsWOHDuH+a4yRIkWS+fPnS+HChbVnQQAkQALWErh69aq0a9dOSYmgozDNHALFihVTG5zJkyc3ZwKOajoBHXXBmMAy/bbiBEYQuHHjhkDDBwKONBIggeARyJAhg+zatUvChg0bvAtd+mloGFWvXl2Q/Kb5RwDdiLD7rYvhiEr06NEFx1Z0t4CAAOnfv780b95cdxSMnwRIwEICBw4cUB2EsXlCvSvzwGfPnl0dz0SjFhoJuIkAE1huWi3NfcUPGiqx8E/+oGl+MzD8YBHAMVx0FNPFli1bJnXr1hU0g6D5TgDHB8ESelC62OzZs1X1Hk2U9lWDBg1k9OjR2lTgcd1JgATsI4CNg1WrVqnKK+jv0cwhgGODefLkkVmzZkmcOHHMmYSjkoCJBJjAMhEuhzaWAI52oBMWxKhZiWUsW47mbQJr165VFYw62KtXrwSi4507dxZ8Z9B8J5AoUSLZsGGDpEyZ0vdBXHYljlNgR5r2HwLffPONzJw5k12peEOQAAmYSuDOnTsybtw4GTVqFLsHm0gaGxP58uVTm5qpUqXi5oSJrDm0eQSYwDKPLUc2gQAqr1CBhR3yU6dOmTADhyQBbxGIECGC4AhuxIgRvRXYO6J58OCB1KpVS5YuXapFvGYGieTF5MmTJVasWGZO45ix79+/L/Hjx2fnyr+sSLZs2VQCi/oojrlN6QgJeI7AmTNnpEuXLkq30s3Ht0P8sTJvHL46WbNmlWnTpgn0LXXRtnT4ktA9HwgwgeUDNF5iP4Hz589L3rx55dKlS/Y7Qw9IwMEESpQooY6B6WLXr18XPKBBAJbmHwF04+vWrZugxbYOhkrFIkWK6BBqkGNEB0IksHLkyBHka/hBEiABEggqAehcVa5cmScrggrMj88habV3715tNjT9QMVLHU6ACSyHLxDdezsBVGJt2bJFicuixTuPCvFOIYG3E5gxY4YSNNfFNm/erMrjaf4RiBYtmowZM0YqVark30Auuhq6K2glTvsvAVRuIoFVqlQpYiEBEiABwwg8ffpUNm3aJE2aNJErV64YNi4H+l8CIUOGVBt7qKjGsUEaCbidABNYbl9Bjf1//fq1rFmzRpo2bcpKLI3vA4b+bgKRIkWSY8eOCbSMdDEI1uvUNc+sdcVD7ty5c+Xzzz83awpHjfvo0SMpWbKk2hih/Z3A8OHD1UsmXoJoJEACJOAvgV9++UXGjx+vdJjw3Uszl0CWLFkE3+NIYkEDi0YCbifABJbbV1Bz/5HECgwMVOXHFy9e1JwGwyeBvxPImTOnSvLqon+F6D/66CN+FxjwF+Hrr7+WlStXSrhw4QwYzflDQFsRvyOnT592vrMWe9i4cWPVGCEgIMDimTkdCZCA1wjgmD8S4uvWrZNnz555LTzHxQP9wsWLF0uaNGmYvHLc6tAhXwkwgeUrOV7nKAL79++XihUrqra7PE7oqKWhMzYSwJGoXr16SZgwYWz0wrqpcZw4derU1k3o4Zk6duwoffv29XCEfw/t+++/FyRqIORO+zsBHMnFC1DkyJGJhgRIgAR8IoAN53Pnzknx4sXl7NmzPo3Bi4JOAJVWSFpt375dokaNGvQL+UkScAEBJrBcsEh08f0EoImFdu9t2rSR48ePv/8CfoIEPE4A1RLQrilbtqw2nWZQJdK2bVuPr6w14eH7NH/+/NZMZvMs6Hr13XffSb9+/bgB8pa1SJgwoer+GzNmTJtXitOTAAm4kcDDhw9VZ+BOnToJKrBo5hJA45U8efKoI5pp06Y1dzKOTgI2EGACywbonNIcAtjd2bp1qzRq1Ii7O+Yg5qguIpAyZUqZNWuWZM6c2UVe++4qKi/RmfSHH37wfRBeqQiEDx9eoFGiS8XNrVu3pHbt2rJ69WreAW8hAO2ro0ePUvyXdwcJkECwCdy5c0dtEMybN0/w7zTzCUACAFqgqEj/4IMPzJ+QM5CAxQSYwLIYOKczlwAqsS5duiSFCxemlom5qDm6wwkUKlRIpk+fLnHixHG4p8a4d+HCBcmdOze7GRmAE2Lm2C3XxU6dOqWqza5evapLyMGOc/bs2VKlSpVgX8cLSIAE9CWAExGQ94C24KtXr/QFYWHkqLxCslCXZz8L0XIqBxFgAstBi0FXjCOwd+9eqVOnjjpOiKQWjQR0IgDtA4ikouuMLrtvixYtknr16lHDyIAbHQ+/FSpUMGAkdwyxatUqpctCezcBdPsdOXIkEZEACZDAewk8fvxY8Jvcvn17QYUrzXwCoUOHlqJFi6qNyyhRopg/IWcgARsJMIFlI3xObR4BJK1wnLBVq1Zy5MgR8ybiyCTgQALoOogW1bpUTODve5cuXWTQoEHy22+/OXBF3OMS7p1r165pc3wQK4Nk75gxY9yzSDZ4ivbre/bssWFmTkkCJOAmApcvX5ahQ4eqRMqDBw/c5LprfUXyqkyZMtKnTx9JmjSpa+Og4yQQVAJMYAWVFD/nOgJ4qQ0MDJT69eszieW61aPD/hCIHTu27Ny5U9A+WQeDrgaqr5YtW6ZDuKbGiOMHW7Zs0aZyDzCTJUumOtjS3k0gXLhwqrpRl46mvBdIgASCRwDP3OvXr1edj3EKgptJwePnz6dRMY0NPDTcoJGADgSYwNJhlTWP8cqVK6qsFiK0NBLQgUC6dOlU1zBdjg8eOnRIqlatyg6kBtzcPXr0kO7duxswkjuGgDZLqlSp2H0wCMuF75T06dMH4ZP8CAmQgE4E0Ml1woQJgt+PX3/9VafQbY+1Vq1aij2qsGgkoAsBJrB0WWnN48QLLo4Tbt++XdCtkEYCXibQs2dP6dq1q5dD/Ftsy5cvl0qVKsmzZ8+0idmMQAMCAlQVW8GCBc0Y3pFj9u/fXzp27OhI35zm1OTJk5W2JI0ESIAEQADdfy9evKg63o0dO5ZC7RbeFhEiRFDfx3jeo+aVheA5VfAIQIY6RPAuCcqnmcAKCiV+xhMEIOjerVs3WbJkiSfiYRAk8C4Chw8fls8++0wLQEhI48gC2nTT/COQNm1amTt3ruCfOhhevrJnz05tpyAudqNGjagVFkRW/BgJeJ3AixcvZO3atero2q5du7werqPiCxUqlLRp00ZatmwpkIygkYBuBJjA0m3FNY/3xo0bqjIFO8k0EvAigSRJksi5c+ckZMiQXgzvf2LCQ3SRIkWUbhPNPwJly5aVcePGScyYMf0byCVXnz9/XjJlyiT37t1zicf2uolkH7T1dDmabC9tzk4CziXw/PlzGTJkiEpo47kamwE0awggeTVw4EBVfRU5cmRrJuUsJOAwAkxgOWxB6I75BB4+fKha+06ZMoXlzubj5gwWE/j222+VHoIuhi5HceLEESSyaL4TQMITR+lQzaaLff/991K3bl0ePQ3igqMpxA8//CAffvhhEK/gx0iABLxEAIkqaFxVq1ZNVV/RrCUQPnx4GTx4sDRs2NDaiTkbCTiMABNYDlsQumMNgbt376p2szizzxdfa5hzFvMJoDJi8eLFUqpUKfMnc8gMCxYsEHTgoflHIEaMGDJx4kQpXbq0fwO55Gp0zGrRooX6DaAuYtAWDYkr/H3LkSNH0C7gp0iABDxD4MmTJ7Jp0ybp1KmTnDhxwjNxuSUQHBXs0qWL2nRBV1gaCehMgAksnVdf89jREhzlzwMGDJBHjx5pToPhe4FAvHjxVKOCZMmSeSGcIMVQvnx5WbhwYZA+yw+9m8DHH3+sWqDjnzrYrVu3VOfKjRs36hCuITFCKHjUqFGq+oJGAiSgDwFUXeFZefbs2XL9+nV9AndIpFGjRpVhw4YJnndQhUUjAd0JMIGl+x2gefxo/Ttr1ixp3bq14CgSjQTcTABaUDNmzNBGwwjVk9Brevz4sZuXzRG+582bVzZs2KCNdtqePXukRo0acubMGUfwd4MT0F5BBUD37t3d4C59JAESMIDAjh071JE1aGvyxIIBQIM5RKxYsVRzldy5cwu+g2kkQAIiTGDxLtCewKtXr2T69OlK3P3mzZva8yAAdxLA8UGU9uM+Dhs2rDuDCKbXW7duFSReaP4TgChs27Zt/R/IBSNAx2XOnDkCvbhnz565wGPnuAjhYFRh8QiLc9aEnpCAGQRQdQWt2L59+wpOLNCsJYBnusSJE6tj7oUKFWLzDGvxczaHE2ACy+ELRPesIQANFLzQ9OjRQy5cuGDNpJyFBAwkgG406CBXuXJlA0d19lCdO3dWD9c0/wkcPnxYPvvsM/8HcsEIqCJAohft32nBI4AXKbzUUsg9eNz4aRJwC4HffvtNdu/erSQ2li5dKjipQLOewCeffCL9+/eXYsWKaVMZbT1lzuhWAkxguXXl6LfhBCDqi1LpNm3ayL59+wwfnwOSgJkEUqVKpY7DZsyY0cxpHDM2khCFCxcWVGHR/COQNGlSOX36tDbHE+7du6caHWzbts0/cBpejSQnNnvSpk2rYfQMmQS8TQDfjdgIQ5L6/Pnz3g7WwdHh+xXrkD17dgkRIoSDPaVrJGAPASaw7OHOWR1KAEdLjhw5IvXq1ZO9e/c61Eu6RQL/S6BAgQKqA2HEiBG1wIO/p2XLlpWzZ89qEa+ZQTZt2lRGjhxp5hSOGvvq1auSMmVKefr0qaP8coMz0aNHl2XLlknOnDnd4C59JAESCCIBfC/iWDU6DUJag2YPgSxZsijNK2ws0UiABN5OgAks3hkk8BYChw4dkiZNmqgyalRm0UjAyQSwQ9eqVSutjkShCgSJF+wY03wnAJ0NdOL7+uuvfR/EZVeiUrF69eou89o57s6fP191w6KRAAm4mwA2bfEbit+AZs2aCbqz0uwhEDJkSEEjniFDhkjy5MntcYKzkoBLCDCB5ZKFopvWE0D5NDouLVq0iLtR1uPnjMEgEDp0aHWffvPNN8G4yr0fxe7wnxpGTDD7t47x48cXJOzRzVEXK1eunPr7QvONALQiu3XrRlFh3/DxKhJwBAEkrw4ePCijR4+WefPmsaGFjasSJkwYqVmzpkDXM1GiRDZ6wqlJwB0EmMByxzrRS5sI/PLLL9KzZ0+ZNm0a2wfbtAac9v0EIkSIIJcuXZIYMWK8/8Me+AS6heKY78qVKz0Qjb0hlC5dWmbOnCm4h3QwaKfFjRuXXbX8WGxUX+GIC7VZ/IDIS0nARgLY+MFzLap9cAwfwu00ewjgt7djx47q1EeUKFHscYKzkoDLCDCB5bIFo7vWE3j8+LG0b99eJk6cyB956/FzxiAQyJ8/v2zYsCEIn/TGR44dO6aqzdgx1P/1HDhwoDp+iuMLOtjmzZslX77UpV0pAAAgAElEQVR8OoRqWoyffvqpqtzQ5Z4xDSQHJgEbCNy+fVsaNmyoNDNp9hKAZikqWiGHgCosGgmQQNAIMIEVNE78lOYEnj9/Ln369FFdQe7evas5DYbvNAITJkxQ4qu62IoVKwSVQ69fv9YlZFPijBo1qsyePVuKFi1qyvhOHLR169YydOhQJ7rmGp/ChQuntHJ0aRjhmoWhoyTwLwSePXsm69evV8+y+/fvFxwhpNlHAJXAODJYv359gQwEjQRIIOgEmMAKOit+UnMCeFlGyXX//v3l559/1pwGw3cKATz44PhgvHjxnOKS6X6gYmjYsGGmz+P1CTJmzCgzZsyQNGnSeD1UFR9e4HLlyiX79u3TIl4zg9y1a5d88cUXZk7BsUmABAwggETV4cOH1SkCaP+hAotmL4G0adNK7969pXjx4jyKbe9ScHaXEmACy6ULR7ftIQDx6C1btkjjxo2ZxLJnCTjrPwhkzpxZAgMDteLy+eefy5EjR7SK2YxgIWY+ffp0CR8+vBnDO27MAwcOqBeG69evO843tzmEKraWLVu6zW36SwJaEYDmHzQO/9S6YtMT+5cfz2zDhw9XGwDoAkwjARIIPgEmsILPjFeQgNL/KFOmjKp84QMBbwg7CXTo0EH69etnpwuWzo2jS3HixLF0Ti9OBr0NdFlFN0ddbPLkyUrv69GjR7qEbFqcZcuWlYULF5o2PgcmARLwnQA2W5GoR5J52bJlPC7oO0rDrkTTi0yZMsmsWbMkRYoUho3LgUhARwJMYOm46ozZEAJXrlyR5s2by9q1awUaWTQSsJoAjg8uXbpUKw2jkSNHqr93NP8IoNvRggULpECBAv4N5JKrX758qV7mxo8fz00HA9YsQYIEagOHnQgNgMkhSMAgAjguePXqVfXdjipJVpsaBNbPYQICAlTjGVTC4buTRgIk4B8BJrD848erNSeAJBaqX3AMB/oqNBKwkkDy5MnV7mrq1KmtnNbWubJnzy67d++21QcvTI6HaOiiRI8e3QvhvDcGfFfXrl1bNm3a9N7P8gPvJ4CjL3g5hhAxjQRIwH4CSF6tWrVKRo0aJT/++KM8ffrUfqfogUSKFEkJtbdr105ixYpFIiRAAgYQYALLAIgcQm8CeEjAeXZ0E6GRgJUESpUqJehAqMtDEV6YkbTjg7n/dxmOQEPQVxfbs2ePVKxYUVUN0YwhsHnzZsmbN68xg3EUEiABnwngaD3kBPCd/vjxYx4Z9JmksReGDRtWevToIc2aNdNGa9JYghyNBN5OgAks3hkkYBABnGtv27atai/O9sQGQeUw7ySAoztImnbv3l1ChgypBSlo7lSpUkWg7yES4o8/b7SI24wg0X2wevXqZgztuDHxfTxv3jypWrUqjw8auDojRoxQL2Y0EiABewggWfXDDz+oZwE2NrFnDd42KypU0Rl64MCB6pmFRgIkYCwBJrCM5cnRNCbw22+/yYoVK+S7776To0ePMoml8b1gRegxYsSQMWPGSIUKFayYzvY5kIRo0aKFjB49mkkIP1cDehwXL17URgwf3824d/D3hWYcgW+//VZVgNpnSGAjkU0jAb0I4Dtt//79go2IOXPmyMOHD/UC4OBosaGYNWtW6d27t3z11VcO9pSukYB7CTCB5d61o+cOJIDKEHQobNCggfonjQTMIpAyZUpZsmSJNvpXd+/elfLly8uWLVvMQqrNuDly5JCdO3dqEy9ayaN1OTYWaMYR+Prrr2XNmjWCjpY0EiABawigi+q4ceNk2rRpcurUKWsm5SxBJlCoUCEZMGCApEmTRpvq+CDD4QdJwCACTGAZBJLDkMBfCaCsu0SJEnzZ5m1hGoFcuXKp+0uX44M//fSTOvJ25swZ05jqMjB2hnXS7Lt8+bIkSZKEVbEG3+Dp0qVTTSQSJ05s8MgcjgRI4G0EoOFXtmxZVX1FqQrn3SPoNDh37lzqXTlvaeiRxwgwgeWxBWU4ziFw7949Jd6IEu8HDx44xzF64gkCuLegf6WLQWOucePGgt1nmu8EUC2zY8cOyZIli++DuOxKtC5v06aNy7x2vrsfffSR4O8lKvpoJEAC5hB48+aNIAk/e/ZsdSwNFaU0ZxGIGTOmNGzYUEmIQP+KRgIkYC4BJrDM5cvRNSeAJBYeOpBowL/TSMAoAjgCpsuL4/Pnz1UyGGX5NP8IpE2bVh37SpgwoX8DuejqbNmyCSr4aMYS0E2Hz1h6HI0E3k8Am58LFixQiWJ0Uv1PAxOakwjgt7Rbt26qy23EiBGd5Bp9IQHPEmACy7NLy8CcQuDly5cSGBgo9erVo16BUxbF5X5EixZNfvnlF0GLZh3s9u3bUrlyZdm0aZMO4ZoaY6VKlWTs2LESNWpUU+dxyuDXrl0TVArxxc/4FQkVKpT0799fWrdubfzgHJEENCaAqitUyvbs2VP27dtHkXaH3gtx48ZVCUaItlML0KGLRLc8SYAJLE8uK4NyIgGIbdapU0ftouHhhEYCvhKoVq2azJw509fLXXfduXPnBFU0EHKn+UcAO8XQv9LlYfv7779nG3P/bpl/vbp58+bSr18/CRcunImzcGgS0IMAng3RURDVxqNGjZInT57oEbjLooT26GeffaY0ABMlSuQy7+kuCbifABNY7l9DRuAiAmfPnlXHCRcvXiyozKKRgC8EVqxYIcWLF/flUldes3DhQtWBkOYfASStRo8erapBdTCIHNetW1emTp2qQ7i2xFiqVCmZOHGiQAOGRgIk4BsBfFfduHFDNm7cqBLC7C7oG0crrkKyHscFsRH08ccfWzEl5yABEvgHASaweEuQgMUEbt26JVOmTJGBAwfK/fv3LZ6d07mdQPTo0QWJUPxTF6tRo4ZWFWdmrSuOO0yaNEmKFStm1hSOGvfOnTtSuHBhdQSHZg6BDBkyqA0ZdHmkkQAJ+EZg9erVKhGMzsLoYk1zJgEcve/SpYvqiBwrVixnOkmvSEADAkxgabDIDNF5BNBFBg/97dq1E2i00EggqAQKFiwoy5cv10b/CjvTceLEEehg0fwjkCJFCiUGrEsHwu3btwuO26KDF80cAqi82rp1q6A5AI0ESCB4BFB11apVK1m3bp3a0MTvHc2ZBKClOGHCBMmTJ4+EDh3amU7SKxLQhAATWJosNMN0JgE8tDRr1kyg8cMHF2eukdO86tWrl3Ts2FGgwaCD7d69W7Jnz65DqKbHCM0OaEKlSZPG9LnsngDfp+PGjZO2bdvK06dP7XbH0/Nv3rxZ8ubN6+kYGRwJGEkAeo6ouoKkxMWLF40cmmMZTCBEiBBKg3P48OGSOXNmg0fncCRAAr4QYALLF2q8hgQMJHD48GHp0aOHrF27VlCZRSOBdxFAi+b58+dLkSJFtIHUqVMnpQlC859ApkyZ1P2TNGlS/wdz+AhIWiF5hY6LNHMJDBkyRFWR0EiABP6dAI4HomJx2rRpsmbNGj7zOfyGCR8+vJQrV066du1KvSuHrxXd04sAE1h6rTejdSiB69evy4gRI2T8+PFsl+zQNXKCW6igmT17tnz66adOcMd0H169eqWOux06dMj0uXSY4IsvvhAI4sePH9/z4eLYII4P4hghzVwC0KibPn26uZNwdBJwMQFUhB4/flw956EJC7RQac4mEDt2bOnQoYPqHh45cmRnO0vvSEAzAkxgabbgDNe5BPCyjuRE/fr1Bf9OI4F/EihTpowS4Y4WLZoWcI4dO6aOJlH/ypjlxjGIBQsWSMKECY0Z0MGj7N+/X/Lly8dGGRasUfr06eXAgQMWzMQpSMB9BFBZP3ToUBk0aJA8ePBA3rx5474gNPM4QYIESlS/QIEC2sg1aLbEDNflBJjAcvkC0n3vEYDmT6NGjQQv77/99pv3AmREPhGAaGj79u0FGliuMDyjh/DPUxyzaNq0qTx58sS/gXi1IoAjhPPmzdPiKMTUqVPVzjnNfAJhw4ZVL+b4J40ESOA/BNCgZ9OmTdK/f385deoUsbiAQJgwYdTvJE5D6FLp7oJloYsuIGDAI3+womQCK1i4+GESsIbAiRMnpG/fvrJ06VIKEFuD3PGzoOoKL+UlS5Z0vK9GOIjkbcuWLZWGEXesjSAqqlPcnDlzBEdRvW6VK1eWuXPnej1Mx8S3b98+yZgxo2P8oSMkYBcBVAyjUzCOa+/YsUOePXtmlyucNxgEokaNKlWqVJEuXbpI3Lhxg3ElP0oCJGA1ASawrCbO+UggCASgl4CHIJQwo0sNX+CDAM3jH0mUKJHs2rVLC/0iLCV2r2vVqiUbN270+MpaFx7agEOrKFeuXNZNasNM+P6MEycOj55ayH7MmDGqcphGAroSePnypaxatUrwd2Hv3r3y6NEjXVG4Lm5sEKK6HQksJLJoJEACzibABJaz14fekYCsX79eUE1w7949wYsZTU8C0GLAvaCL4Sht1apV5fz587qEbHqcsWLFUklxr1fxIdGbI0cO03lygv8SqFmzpuqsRiMB3QigWvjChQvSvHlzWbduHZ/TXHQDfPDBB2pTEKcdcHSQRgIk4A4CTGC5Y53opcYEkLTauXOnKmvGixl1sfS8GdC9qFmzZloEj3seR92gYYRdbZoxBKCjNmTIEGnSpIngwd2r1rp1ayWaTLOOAI6nHjlyxNP3lXU0OZMbCECcHc0LoCs4efJkyj24YdH+4mOkSJGkaNGiSqMsceLELvOe7pKA3gSYwNJ7/Rm9Swjghf706dMyfPhw9aD0+vVrl3hON40ggGTD2bNntRDfBi8krdq1a6dajtOMJYAkaL9+/SR8+PDGDuyQ0dDBNVWqVPLzzz87xCM93MCxGzCPHj26HgEzSm0JQNIBiatZs2bJ2rVr1X1PmQd33Q44MoimOKgcxXFzGgmQgLsIMIHlrvWit5oTgKbC7Nmz1Q8v9RX0uRlSp04tR48elRAh/Gzr5xJkuLfz5csngYGBLvHYPW5C/2r+/PmeFanF35MsWbLI8+fP3bMoHvA0YsSIsnnzZsWeRgJeJXDr1i0ZPHiwLFiwQK5evcrNRBcudLJkyZQWJJpOBAQEuDACukwCJMAEFu8BEnAZAez0oTVzmzZt5Pjx49z5c9n6+eIu1nrQoEG+XOrKay5duiR4yORxWeOXD5VX0BfzaifCkSNHCo4Q8t4x/t75txHxIjhlyhSl10gjAS8RQMX7gwcPZOXKlUrKAYkrmvsIhAkTRqAlCpF9NMWhkQAJuJcAE1juXTt6rjkB6I3g7P6KFSvkyZMnmtPwbvghQ4ZUnfi++uor7wb5j8jGjh0rjRs31iZeqwP97rvvpFu3blZPa/p8+B6sVq2aLFu2jELKptP++wShQoVSL/fomksjAa8QQBMRVBbiuOCOHTu8EpZ2ceDIYIMGDaRp06YSL1487eJnwCTgNQJMYHltRRmPVgTu37+vxK5R0n7x4kWtYtcl2I8++kiJ+H/44Ye6hCz58+dXVYY0cwgkSZJEaephR9pLtmfPHqlRo4acOXPGS2G5Ihbo9CF5iE6Euhx1dsXC0EmfCFy5ckUdM4PGFY4lP3782KdxeJH9BD799FPp2bOnqr7yqvaj/ZTpAQlYS4AJLGt5czYSMJwAytv37t0r9erVk2PHjhk+Pge0l0C5cuWUcH/kyJHtdcSi2fGiAEFoNiowDziSDXg5q169unmTWDwyjgwOGzZMOnbsyHvHYvZ/TlewYEH5/vvvKeRuE39O6z8BaOehAnjUqFFy7do1QVMImjsJ4HcOm2E4Vp4iRQp2SHXnMtJrEngrASaweGOQgEcIXL9+XZVH47gZBd69sah4AMMx0VatWgmO6OhgS5culdKlS+sQqq0xpk2bVmlhQXzbC4aKCdw3+/bt80I4rowhU6ZMqslIypQpXek/ndaTAJJUeH7CsxN+b9nB1P33AbqhVqpUSXBcPkaMGO4PiBGQAAn8jQATWLwhSMBDBF6+fKkEKseNGyfnzp2jDozL1xZJKyQlIeKuyxFC6FRMmDDB5SvnfPdxlGL48OFSp04dTxz5GjBggHTo0MH54D3sYdKkSVVlX86cOT0cJUPzEoETJ04ocfbFixfLwYMH2fzB5YsLzVAk0ps1aybly5fXZuPP5ctG90kg2ASYwAo2Ml5AAs4m8OLFCwkMDJROnTop7SSauwlEiRJFlb+ju1fVqlUlZsyY7g7oX7xHp6e8efPKgQMHPBujUwJDdR8SDegch46PbjYcnc6TJ4/cvXvXzWG43ncc/cX9xApK1y+l5wO4cOGC2uiDxhU2+3B0kOZuAtjww3dP165dJXXq1J7YmHH3itB7EjCPABNY5rHlyCRgKwFowtSvX1+mTp1qqx+c3DgCEN/u1auXKo3HTqPXbNeuXVKxYkXBcTCaNQRQueTmI6o4/pM7d251HJJmPwHoB6GKEglSGgk4jQCeiwYOHChDhgyRX3/91Wnu0R8fCeD7pkePHtK5c2dPPhv5iIWXkYBnCTCB5dmlZWAkIEqAFAksiBufPXtW3rx5QyweIJAhQwZp3LixenFPnDixZ8rksSPerl07dnyy8B6NEyeOrF69WjJmzGjhrMZMhWrT0aNHS7du3eTp06fGDMpR/CKA485IsgcEBPg1Di8mAaMI4DkInUnXrFkjI0aMUOLsNG8QCB06tKRLl05pXRUuXNgbQdkVxe9/TMx9B7voc95gEmACK5jA+HEScBsB7Dj+9NNPShtr4cKF1Hhw2wK+w9+wYcOqpEORIkWU1kPy5MldHdmzZ8+kdevWMn78eGq3WbySWbJkkfnz5wsq/Nxiv//+uzoiDQ0vJOdpziBQpkwZdYwQR59pJGAnATz77N+/X5YtW6aSV9C7wv9H8wYBHBnE9z90QlOlSsUjg95YVkZBAkEiwARWkDDxQyTgfgIol1+wYIF06dKFWjHuX87/iwCVDgkSJJBy5cqpqqz48eO7MrpLly5JrVq1ZOvWra703+1OFytWTAlwu6Vj05MnT6Ro0aKyfft2JjwddPOhOhS6QrFjx3aQV3RFJwKoNEc3UlRbIcn9yy+/qGp0mncIxIoVS0aNGiWFChVistw7y8pISCDIBJjACjIqfpAE3E8AVQs7duyQ5s2by5EjR3ik0P1L+rcIkHyA7lmjRo1UIgJVWm7RokHjgZIlS6qXDZr1BLCbjfumd+/eEilSJOsdCMaMOC5YtmxZlSihOYtAtGjR5PDhw5IwYUJnOUZvPE0ASSt8L6ChQ79+/WTVqlV8vvHgiuN3ChXDkBv47LPPPBghQyIBEggKASawgkKJnyEBjxFAtQt0SpYvXy537tzxWHQMB50KIYaOCpXMmTO7oqpm5syZUqNGDS6ejQQiRowoHTp0kLZt20qYMGFs9OTdU0Pgv3v37jJt2jRH+kenRPbs2SNZs2YlChIwnQASV+goiAYgixYtkg0bNhjQUTDEH35TL9T0xQvmBJEjR1bPCJAagPYnjQRIQF8CTGDpu/aMXHMCaBu9ePFi1ZHn6NGjPIbjsfsBlVdx48ZVOlnFixeXEiVKCAS7nWq1a9dmUsIBi4PqK6xFz549BS8MTjIk3tFlCt9bbHvvpJX5uy/QsUMlKI0EzCKAxNXp06dl3rx5snnzZjl06JDgWDHNewTwLIOqK5wcwHNM+PDhvRckIyIBEggWASawgoWLHyYBbxF4/fq1/Pzzz9KyZUslckrzJgE88CVKlEjq1q2rBE+dWF2TNGlStZNOs58AjmngRWH48OFKX80JdvHiRYFAOI4+U4jZCSvybh8aNmwoY8eOdbaT9M61BFCFiWOCS5cuVXqe1Ldy7VK+13H8FlWpUkV69Oihqq7cIonw3sD4ARIgAb8IMIHlFz5eTALeIIBEVp8+fdRLx+3bt6kd4Y1lfWsU0aNHVyX4pUuXVjo1ESJEsD3akydPSurUqW33gw78nUCmTJlUEit9+vS27HpDsw/NJ3A0CMcaHz16xCVyAYFs2bLJ7t27XeApXXQLgfv376uKq6lTp8qMGTPkxYsXbnGdfvpAIGTIkBIvXjxp3769NGjQQJDIopEACZDAnwSYwOK9QAIkoAggibVp0yYZNGiQbNu2jVUOHr4vsIuJ3czChQtL/vz5BS+cOG5o1+4mNI1wZI3mD4EP/rj4d38GeOu1aAZQvXp1pamWLl06y6r3Xr58KevXr5fJkycbpGtjOBoO+A4COHqKyhi+dPIW8YcAEthXr15VjWdWr14t69atUwltmrcJ4Bg7ZA+w0YaupjQSIAES+CcBJrB4T5AACfwfAehKQGcGFQ99+/YV7HrSvE0Agu9p06aVIkWKSLVq1VQiy0rDS0rKlCnl7NmzVk7LuYJBIESIEJIsWTLVJbJVq1amaqkhkb53714ZM2aMbNmyRa5fvx4MT/lRpxA4deqU+ntNIwFfCKAb7fTp05W0ATQ6Hzx44MswvMZlBPA8gmdP/NbEihXLZd7TXRIgAasIMIFlFWnOQwIuIvCnQGrNmjUlMDDQRZ7TVV8JIEkREBAg3377rdJEg2aWFYbEFV50kciiOZsA7hEcOcXOeOPGjQUvG0ba8ePHVSXeypUrlUg77wkj6Vo71oIFC6RcuXLWTsrZXE0Af9/xezBkyBCVvILWHZ5FaHoQQOdS6JrZWQ2uB2lGSQLuJ8AElvvXkBGQgGkEbt68qR4m58yZw0oI0yg7b+CoUaOqHVAcHUNyCd0LoUlhhuGIWL169cwYmmOaSCB27NjqCCrE3lGdFS1aNPUnKJpqqLK6d++e0tu7du2a0ktC0gqVVzRvEEC3yN69e3sjGEZhGgEcFcZ3wLFjx5S2FY4JspugabgdOTAahaDBDLoM4tmDRgIkQALvI8AE1vsI8b+TgOYE0OFnw4YNgtboGzdupHiqRvdDuHDhJHfu3PL111+rP9BAMlInC7vrqPKbNWvW/2vvTKDtqso7vvPmKQMJkEAYEiBAGCQY6RJEyiAUBVSgiGBpZZVVa211uUqttqvV0sFOq6XDgtYBilAGEcsgIkEERKYoBEhCGBICIYFMEEjePPb7f985993c3PvOPueec9999/6PvX3h3j3+9ren/x5OHVGtvaziDZKHHnqoW7Bggd6ttv/+++ul77Af7OrDToqdO3fmPrgfae3ate6FF17Qt6DyQubas4lzzz1XRUk+JFCMAIQrCNcYUzz88MO605tvE6wvW8GiGMYVEK4+8pGPVOx+xfqizNySQG0SoIBVm+XKXJFA6gRwFw1WSP/5n/+ZF6mmTre6A4QQAVHiuOOO0yOGELUgTJT7YOX9wgsvdE899VS5QdF/lRDAxd3YhYW/mKDgL4RKTFjDDyaqPB5YJQWWUTKOPPJI99xzz3FSmhHfqRpsd3e33mv13e9+1+Hts5s3b6ZwNVULs4x04/g5jqLj3s358+eXERK9kgAJ1CMBClj1WOrMMwmUQQDHfD7zmc+49evX802FZXCcql6xAwtCFi7zPv/881XISvq2MVzSffnll7sNGzZMVRxMNwmQQBECOBaE+r1o0SLyqXMCEKwhXN1yyy3u6quv5gs76tgeMFY4+uijdUc/3n7MhwRIgASSEKCAlYQa/ZBAnRPAcaBvfvOb7uabb3ZvvPEGd1PUqT3guNinP/1p3f5/7LHHxno7HXbgXHPNNe7KK6/UC7v5kAAJ1A4B7LBA/3DmmWfWTqaYk1gEsLvq+eefd/fff7+77bbb9K4rPvVJALtxccz80ksv1ZfEzJgxoz5BMNckQAKpEKCAlQpGBkIC9Uegr6/PPfLII7qiigEqn/okgB1ZuOR96dKl7rTTTnO4+waXekdd+o4V+T/5kz/RlVg+JEACtUWgq6vL/cu//Atf0FBbxRqZG9x3hwvZ77vvPvfoo4+6p59+2m3dujXSHx3ULoHm5mZ38cUXu9///d93eNNg0h3btUuIOSMBEohLgAJWXGJ0TwIkkCOAXTR4m9gPfvADh7dObd++nXTqmACOE2LnBXZk4WJWXPpe6tm4caO76KKL3JNPPlnHxJh1EqhNApikfuUrX3F/+7d/W5sZZK52I9Db26uiFe62euaZZ9y7777LlzPQRvTuzP/4j//QMcH06dNTfQkM8ZIACdQvAQpY9Vv2zDkJpEYAQhYu7P3TP/1TXXXF7iw+9U0AO7M+/OEP6w6Mk08+2c2ePdthV0ZDQ4OCefbZZ/V7vjK9vu2Eua9dAnjD6LXXXpvKCx9ql9LUzBl2Wu3atctt27ZN77aCcIXrBPiQAAigrz/77LN1F+aBBx5IKCRAAiSQKgEKWKniZGAkUN8E3nnnHfc///M/7sYbb9S7L/D2MT4kgAudTznlFH17IXZlHXPMMWonX/jCFwiHBEigRgl87GMfU2Fj3rx5NZrD+ssWFqewWLV8+XL305/+VC/q5yJE/dlBqRxjgeoDH/iAu+KKK/TYIO+6om2QAAlkQYACVhZUGSYJ1DEB7MbC7ppvf/vb7qabbtJVWj4kAAI4YrhgwQK9zPXNN990K1asIBgSIIEaJXDCCSe4733ve+7II4+s0RzWR7bQp+MC9nvvvVc/L730knv99dd5RLA+it87l3PmzNEd17/zO7/jjjjiCB4X9CZHhyRAAnEJUMCKS4zuSYAEvAgMDg7q5e6XX365e/vtt7380FH9EMARQ0yM+JAACdQmAYjVOF72wQ9+sDYzWAe5wm6rf/u3f3N33323LkahX+dDAoUEDj/8cH0hC64FwKXtfEiABEggSwIUsLKky7BJgAT0MtevfvWr7v/+7//0vgyKFjQKEiABEqh9ArgH5/bbb9e7cPhUP4GRkRF9Kctbb73lHnvsMT3m/ctf/pJXAVR/0U1KCvGmYVwPcNlll+n9p6jvfEiABEigEgQoYFWCMuMggTongDcU/eQnP3Hf+c53dFcW78aqc4Ng9kmABGqeAHZZXn/99e63f/u3eZyoikt7586d7umnn1axCndbPfXUUw5vieVDAsJOjZsAACAASURBVKUIQKy68MIL9cggdlhCzOJDAiRAApUiQAGrUqQZDwnUOQGIVljZveuuu9zf/M3f6L/5kAAJkAAJ1C6Bv/iLv3Bf//rXOcGtsiLGWwRxPPDOO+/Uy9hxJ+GWLVt4r1WVlVM1JgcvYvnrv/5rd+KJJzrce8WHBEiABCpNgAJWpYkzPhIgAbd27Vr3xS9+UQfOQ0NDJEICJEACJFCDBC699FI9isZ7cSa3cHF0H4tIOMb//e9/X98OuXLlSh7pn9ximVKxY9fV5z//efeXf/mXPC44pUqOiSWB2iNAAav2ypQ5IoEpQaC/v9/deuutevEnBtI4ZsiHBEiABEigdgjgeNHDDz/sWltbaydTUyQnuNNq+/bt7rXXXtM3A+MNgo888ojDkUE+JOBLoLOz0+GNoldeeaXeZ8fjgr7k6I4ESCArAhSwsiLLcEmABLwIYHANIeu6665zr7zyipcfOiIBEiABEqh+Avvss48KKB0dHdWf2BpJId4WiLusfvGLX+jdVjgquGHDhhrJHbNRKQINDQ3u6KOPdldccYW75JJLHOoyHxIgARKoBgIUsKqhFJiGqicwJimcVvWpnLoJHBgYcOvXr3f/9E//5G644QaHlWM+JEACJEACU5sAJsHr1q1zCxYsmNoZmQKph2iFt/3ihSm4YxJvFBwcHJwCKWcSq5EAhCvsujrkkEN4BLgaC4hpIoE6JkABK4vCH5VAG7IImGGSQO0TWLZsmfuzP/szPVbIwXftlzdzSAIkUNsE7r77bnfeeefVdiYrmDvcZYUj+N3d3e7FF19U0eq2227ji1EqWAa1GhWO+i5atMhdffXV7owzzqjVbDJfJEACU5wABawpXoBMPgnUIoFNmzbpkcJbbrlFB+i4gJYPCZAACZDA1CNw1VVXObyNkE9yAugDN2/erC9AWbNmjXvqqafcY489psfuIWjxIYFyCEybNs3h7YKf+tSn3Gc/+1k3b968coKjXxIgARLIlAAFrEzxMnASIIGkBHCMEPd33Hjjje5///d/9TgEHxIgARIggalF4IILLnB33HHH1Ep0laQWRwFxl9Wjjz7qXnjhBffqq686LPBwd3KVFFANJOOAAw7Qe67OP/98d9RRR7mmpqYayBWzQAIkUMsEKGDVcukybyRQAwRwVOLJJ590X/7yl/VNSnxIgARIgASmDoGFCxeq8MLHj8Dbb7+t91jhWOATTzzh+vr69Mgg74b040dXfgRwP91HP/pR981vftMdeeSRvOfKDxtdkQAJVAEBClhVUAhMAgmQQDSBoaEhd80117hrr71WL3znCnQ0M7ogARIggWoggDfjdXV1VUNSqiYNOBaIe6zeffddB9EKYtWPfvQj3W0FXnxIIAsCeCPoYYcd5r7yla+4iy++mDuusoDMMEmABDIlQAErU7wMnARIIE0CuOvjpZdect/73vd0dRpCFh8SIAESIIHqJvCrX/3KLV26tLoTWYHUYRcV+q2XX35ZP6tWrdIXluB4IMQsPiSQJYFjjz3WXXrppe6yyy5z8+fPzzIqhk0CJEACmRGggJUZWgZMAiSQFQEcqcBFtt/+9rf1fiyuVmdFmuGSAAmQQPkEbr75ZnfJJZeUH9AUDAH9Fe5zxM6qxx9/3G3cuNFt3brVbdu2zWFnMR8SyJrAXnvt5f7gD/5A6yDeMtjS0pJ1lAyfBEiABDIjQAErM7QMmARIIGsC2JGFNzF9/vOfd6tXr846OoZPAiRAAiSQgMDXv/51941vfCOBz6npBS8dWbZsmV5ej/ussLuKb9OdmmU5lVONe64+9KEP6dULuKAdbxvkQwIkQAJTnQAFrKlegkw/CZCATg7+67/+S48W4ljGwMAAqZAACZAACVQJAdy1c+utt1ZJatJLBi5Xf+edd3RH1Wuvveaeeuop9/Of/9ytWLFCL1/nQwKTQaCzs1MFq9/7vd/TXVf4bz4kQAIkUCsEKGDVSkkyHyRQ5wSwuo1jhbfccosKWRs2bKhzIsw+CZAACVQHgZNOOsk9+OCDrq2trToSlDAVOPL3+uuv612MWCxZu3atvmHxlVde0T6HRwITgqW3VAhgx9Xxxx/vfuu3fstddNFFvOcqFaoMhARIoNoIUMCqthJhekiABMoigFVvTCiuvvpqd+ONN3I3Vlk06ZkESIAEyidwzDHH6Bv2Dj744PIDq2AIWBh544039A2B+OAyeuy2eu+999zOnTu1f+HRwAoWCKMqSWD27Nnuyiuv1B1XuKC9ubmZtEiABEigJglQwKrJYmWmSIAEMKnAxblf+9rX9OLc3t5eQiEBEiABEpgEAgsWLNDdsR/84AcnIfboKPF2wMHBQd1BBXEKdytix9jPfvYzfWsgRapohnQxOQRmzJjhzjvvPPf3f//37oADDpicRDBWEiABEqggAQpYFYTNqEiABCpPADuy7rrrLnfDDTe45cuX630lfEiABEiABCpHYJ999tF7Ci+44ILKRTpBTFjQwFsAsZvqrbfe0iOAzz77rHvuuefciy++yKOAVVFKTMREBPbee2+Ho7m45+rMM8/kmwVpLiRAAnVDgAJW3RQ1M0oC9U0Ak5UHHnhAhSy8HYoPCZAACZBAZQh0dHS4f/zHf3Rf+MIXKhNhXix4W+3mzZtVpMIH91fhWOCWLVtUvNq4caPr6empeLoYIQkkIdDS0uLOOOMMd/nll7uzzjrLzZw5M0kw9EMCJEACU5YABawpW3RMOAmQQFwCmMjg3pKHHnrIffWrX9VLePmQAAmQAAlkS2DatGna5l511VWusbEx08jwZkCIVNhxiw+OkkOswvc4Joi/ODLIhwSmGgHcbfUP//AP7pxzznE4OohL2/mQAAmQQL0RoIBVbyXO/JIACSiBHTt2uP/8z//UNxbirVJ8exQNgwRIgASyI4AdI//6r/+qE+9ynuHhYYej4eFn+/btbtWqVXrBOsSq1atXu127dpUTBf2SQNUQwGXsePkB3iyIS9o7OzurJm1MCAmQAAlMBgEKWJNBnXGSAAlUBQFczPvCCy+4m266Sd+QtWbNGq7MV0XJMBEkQAK1RuDss8923/3ud91+++3nlTW0z9gxC4EqvK8Kf3EcEIsOeNvsunXr3KZNmxxELT4kUEsEmpqaHN7eid1WeLPg4sWLueOqlgqYeSEBEkhMgAJWYnT0SAIkUCsEMPlZuXKlXvaOi4Zx3IQPCZAACZBAegSWLFnibrvtNrdo0aI9AkUbjPuoIEqFH4hTEKzwVsD8z8DAQHqJYkgkUIUE8NZOXM5+7rnnuqOOOirzY7dViIBJIgESIIGSBChg0ThIgARIICCAe1EwUfrGN77hvvOd7+gRFT4kQAIkQALlE5g7d6778Y9/7I499ljd+Yq3/oVv/sOxP7S92HWFuwrxwb/x4UMC9UKgtbVVX3SA++LmzJnDHVf1UvDMJwmQQCwCFLBi4aJjEiCBeiCAydOKFSv0vpZHH31U31KF7/iQAAmQAAkkJ4Djg9hpxYcESMAI4AUHuOMKbxb84z/+Yz0qyIcESIAESKA0AQpYtA4SIAESKEEAR1WeeOIJd8cdd7h77rnHbdiwgTsCaC0kQAIkQAIkQAJlEYBwtXDhQveJT3zCnX/++e6EE05wbW1tZYVJzyRAAiRQDwQoYNVDKTOPJEAC3gSKHVnp6enJXfb+rW99y/EOFm+cdEgCJEACJEACJJBHAG8SvOKKK/TNgkcffbQKVxC0+JAACZAACUQToIAVzYguSIAE6oSAz30rb7zxhvvyl7/s7rvvPtff388dWXViG8wmCZAACZAACSQl0NDQoELVxz/+cfd3f/d3Dhe1F3soZCUlTH8kQAL1QoACVr2UNPNJAiQwIQEf8SoMADuwHn74Yb3o/cknn3RvvvkmhSzaFwmQAAmQAAmQwG4EGhsb3WGHHeZOO+0099nPftYtXbrU+62CFLNoTCRAAiSwJwEKWLQKEiCBuicQR7zKh7Vr1y732GOPuXvvvdfdeeedbtOmTXXPkgBIgARIgARIoN4JQLg66qij3G/+5m+6s846yx1//PGupaWlLCwUtMrCR88kQAI1QoACVo0UJLNBAiSQjEBS8SqMDf57e3sdjhZed9117r//+78dhC0+JEACJEACJEAC9Udgzpw57mtf+5qKV/PmzStbuCokSCGr/myKOSYBEhgnQAGL1kACJFC3BMoVr4qBg5CF+y1+9KMfuS1btrjh4eG65cuMkwAJkAAJkEA9EMD9VgcddJC7/PLL3Ze+9KXM3yhIEaserIp5JAESKEaAAhbtggRIoOYJZCFUTQRtdHTUPf/88+62225zDz74oFu1apVe+M6HBEiABEiABEigdgh0dXXp8cBzzjnHXXTRRXo5e6XEpUrFUzulxZyQAAnUAgEKWLVQiswDCZBAUQKVFq4KE4H4X3zxRb3w/YYbbnDLly9nSZEACZAACZAACUxxAk1NTe6MM85wl156qTv55JMrKlz5oKO45UOJbkiABKYiAQpYU7HUmOYqJzAq6Wuo8jTWfvImW7zKJzwyMuL6+vrc/fff76666iq3cuXK2i8A5pAESIAESIAEaoxAQ0ODvlHwr/7qr9ySJUv0qCC+q8aHIlY1lgrTRAIkUC4BCljlEqR/EiCBqiNQTeIV4OSnBxe8//CHP3Tf+ta33Lp169zbb7/tcOSQDwmQAAmQAAmQQPURwBsFcRn7r/3ar7k//MM/1B1X2IGV/1SrWFSt6aq+UmaKSIAEpgoBClhTpaSYThIgAS8Cky1e+cbf3d3tHnjgAbds2TK9JwtiFh8SIAESIAESIIHqIACR6sgjj3RnnXWW3nF10kknJXqj4GSLSJMdf3WUJlNBAiRQKwQoYNVKSTIfJEACu+10qjQOX+GqMF3YkbV+/XoVsa6//nq3evXqSied8ZEACZAACZAACeQRgHD1uc99zp155plu4cKFqbxVcDKFpMmMm4ZFAiRAAmkSoICVJk2GRQIkUBECScWiNBOXRRpwT9btt9+ud2ts2LCBRwvTLDCGRQIkQAIkQAITEMBdVocccoj78z//c72cvfCYYJrwJkNQmow402TGsEiABEgABCouYI0hUrInARIggQQEshCNEiQj851evb297p577nG33nqre+aZZ9ybb75JMStJQdEPCZAACZAACUxAAPdbzZ071y1evNhdfPHF7sILL3SzZs2qGLPJEJUmI86KAWVEJEACNU+g4gJWzRNlBkmABDIhUGnxKuv4fMLfuXOnW758ufvpT3/q7rvvPrdmzRoKWZlYFwMlARIgARKoNwJHHHGE3m2FtwrifquZM2cWRVApwadS8YSZrHR89WZfzC8JkEA2BChgZcOVoZIACaRIwEfsSSu6rOIqJ9z+/n7dhfXQQw+5a665xj3//POZ7wJLiyfDIQESIAESIIFqIYBjgsccc4z7oz/6IxWu9t13X9fR0eGdvEqIPpWIAxmuVDzecOmQBEiABDwIUMDygEQnJEACk0egHOEnbqrTjivt8JCfkZER3Y119dVXuxUrVji8zRDf8SEBEiABEiABEtiTAI4JdnZ26hsFr7zySt111dramgqqrESgrMItzHSl4kkFNgMhARIgAYjvMsHCtVR8SIAESKDqCFSqeUoznjTDmqhABgYG9HjhnXfe6R577DH3wgsvONydxYcESIAESIAESMC5lpYWvdsKxwM/+clPulNPPdVBzMrqSVsMSju8YvmuRBxZ8Wa4JEAC9UmAAlZ9ljtzTQJVTyBLISjNsNMMKyyUOGFi99Urr7yiYtbdd9/tHnjgAQpZVW/dTCAJkAAJkEBWBNrb21W0+tSnPuVOOOEEd/jhh3vtuMpKzEkr3LTCKeSeVbhZlS/DJQESqG8CFLDqu/yZexKoSgJxBJy4GUgr7GoLZ3R0VIWr1157zf37v/+7+/73v+96enri4qF7EiABEiABEpiSBHC/1Xnnnee++MUvuiVLlriuri6H75I+WQg7aYSZRhjFmGQVblL+9EcCJEACRdsqHiGkYZAACVQTgbSEocI8pRluOWGV49e3nBDHhg0b3HXXXed++MMf6gXwu3bt4sXvvgDpjgRIgARIoOoJQJzCmwMPPPBAd+6557rf/d3fdQcddFCm6U5L5Ekj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;clipPath=inset(0.33% 1% 0.67% 0%);fontStyle=1;fontSize=34;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,50],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="1"> + <mxGeometry x="352" y="155" width="230" height="230" as="geometry" /> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=8;startArrow=classic;startFill=1;" edge="1" parent="1" source="73i81SIOLEijjcjUkOuc-4" target="73i81SIOLEijjcjUkOuc-1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-679.998181818182" y="134.99999999999983" as="sourcePoint" /> + <mxPoint x="168.81999999999994" y="254.79999999999995" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-3" value="<font style="font-size: 34px;">eKYC PROCEDURE<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="73i81SIOLEijjcjUkOuc-2"> + <mxGeometry x="-0.3398" y="-15" relative="1" as="geometry"> + <mxPoint x="116" y="-60" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-4" value="<font style="font-size: 34px;">CUSTOMER</font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.user;strokeWidth=8;points=[[0.51,1,0,0,44]];" vertex="1" parent="1"> + <mxGeometry x="-550" y="140" width="260" height="260" as="geometry" /> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-5" value="GNU TALER EXCHANGE" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://taler.net/images/logo-2021.svg;fontSize=34;" vertex="1" parent="1"> + <mxGeometry x="-280" y="665" width="670" height="300" as="geometry" /> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.51;entryY=1;entryDx=0;entryDy=44;entryPerimeter=0;strokeWidth=8;endArrow=none;endFill=0;startArrow=classic;startFill=1;dashed=1;dashPattern=1 1;" edge="1" parent="1" source="73i81SIOLEijjcjUkOuc-5" target="73i81SIOLEijjcjUkOuc-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-7" value="<font style="font-size: 34px;">DEPOSITE</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="73i81SIOLEijjcjUkOuc-6"> + <mxGeometry x="0.304" relative="1" as="geometry"> + <mxPoint x="-2" y="-16" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=50;entryPerimeter=0;strokeWidth=8;" edge="1" parent="1" source="73i81SIOLEijjcjUkOuc-5" target="73i81SIOLEijjcjUkOuc-1"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="467" y="815" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="73i81SIOLEijjcjUkOuc-9" value="<font style="font-size: 34px;">OAUTH2 <br>DELEGATE eKYC<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="73i81SIOLEijjcjUkOuc-8"> + <mxGeometry x="0.4314" y="17" relative="1" as="geometry"> + <mxPoint y="11" as="offset" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="qA0kt0iJfJ7-6edtooCA" name="system"> + <mxGraphModel dx="4007" dy="1933" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-7" target="11Uq6ZhMWLkjAy6pIlUK-12" edge="1"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="1077" y="564" /> + <mxPoint x="1077" y="222" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-2" value="<font style="font-size: 54px;">API REST<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="11Uq6ZhMWLkjAy6pIlUK-1" vertex="1" connectable="0"> + <mxGeometry x="0.2211" y="6" relative="1" as="geometry"> + <mxPoint x="159" y="35" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-7" target="11Uq6ZhMWLkjAy6pIlUK-9" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-4" value="<font style="font-size: 54px;">SMTP</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="11Uq6ZhMWLkjAy6pIlUK-3" vertex="1" connectable="0"> + <mxGeometry x="0.2851" y="-4" relative="1" as="geometry"> + <mxPoint x="6" y="34" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-7" target="11Uq6ZhMWLkjAy6pIlUK-10" edge="1"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="1077" y="564" /> + <mxPoint x="1077" y="931" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-6" value="<font style="font-size: 54px;">POSTGRES <br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="11Uq6ZhMWLkjAy6pIlUK-5" vertex="1" connectable="0"> + <mxGeometry x="0.6316" y="-9" relative="1" as="geometry"> + <mxPoint x="-32" y="40" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-7" value="KYCID SERVER" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,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TzDDQwABBP4uoNsBV69eLRMmTJD169fL0aNH5erVq2wR5FJBAAEEEHCMQNSoUSVFihRmNValSpWkSpUqkipVKsf0j44ggAACCARegABW4M1pEQEEEAi4wIMHD+TWrVsya9Ys6d+/v9kiSEEAAQQQQMAtAnHjxpVatWpJ69atTVBLV2rpg4IAAgggYI8AASx75pqRIoCAZQL379+XkJAQ2bNnj0nGPnPmTPN3CgIIIIAAAm4V0LxYJUqUkKpVq0q+fPlMEvg4ceK4dTj0GwEEEEAgDAIEsMKAxVMRQAABNwho4Grr1q2ycOFCk9dq48aNcvnyZTd0nT4igAACCCAQKgHdYpg1a1YpXLiwCWiVLFlSkiRJEqrX8iQEEEAAAXcKEMBy57zRawQQQOB/BHSboCZj//bbb+XXX3+VM2fOyO3bt5FCAAEEEEDAswKRI0eWBAkSmPxYmiurbt26kilTJs+Ol4EhgAACNgsQwLJ59hk7Agi4XuDu3bsmAbueJNivXz8TuLp3757rx8UAEEAAAQQQCI+AnlioCd/btm0radKkkdixY4sGuSgIIIAAAu4XIIDl/jlkBAggYKGABq10m+CyZctMYnZNyv7w4UMLJRgyAggggAAC/yuggauyZctKxYoVpUCBAmZVFknfuVIQQAABdwsQwHL3/NF7BBCwTODcuXPyww8/yPz582XDhg1y5MgR0ZxXFAQQQAABBBD4XwE9vfDFF1+UV155Rd59912T+D1atGhQIYAAAgi4UIAAlgsnjS4jgIB9ApcuXTK5rcaOHWtOErx58yYrruy7DBgxAggggEA4BaJEiWJyZRUsWFA6duxoAloUBBBAAAF3CRDActd80VsEELBIQLcJHj58WGbMmCHfffedScpOQQABBBBAAIGIC7z66qvStGlTc4phihQpJHr06BGvlBoQQAABBPwqQADLr7xUjgACCIRd4NSpU7J69Wr58ccfZeHChXLy5ElWW4WdkVcggAACCCDwRAHdSpgjRw6TK+uNN96QvHnzmqTvFAQQQAABZwoQwHLmvNArBBCwUOD06dMyadIkk99q+/btovmuKAgggAACCCDgXwE9pTBt2rRme2H9+vWlePHiolsOKQgggAACzhIggOWs+aA3CCBgocDFixelb9++MnToULly5Yo8ePDAQgWGjAACCCCAQHAF9JRCDWblz59f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sG/fPqlXr56cOHHCkfpRKXUJJE+e3EoHS5kypbpGuKH5tWvXpG7durJ582Y37uKl/yYAB9amTZsEGUD/FaYQ8llRkkCuXLlk586dxjhSDh8+LHXq1JFjx47Zul6NGjWyosACy0e2VTFOTgIkQAIkQAIkQAIk4DEBlKioVauWrF+/3uMxeCMJBEagSJEismHDBkEqoQmCwu1wBp86dcoEc31iI/b6cGAh64oOLJ8g5qD+JoAcapPakq5du1aqVasmqFFgp5QuXVqmT58uCRIksFMNzk0CJEACJEACJEACJOBlAr169ZJvvvlGXr586eWROZzJBL7++mvp0aOHMQgWL14sDRo0YFfPUKw4HFiIYIsaNSodWKHgyFsdQiBMmDCCjnyZM2d2iEa+VQMfEUjb69+/v28ncmH0zz//3GqBmyJFCheu5iUkQAIkQAIkQAIkQAKqEECUDLpNP336VBWVqacCBA4cOGDMvu3Zs2fSt29fGTZsmAIr41wVc+fObTmwokSJQgeWc5eJmrlKIHHixILWpKZ0H8SLsEyZMrJlyxZXEfnsuiRJksiaNWskQ4YMPpuDA5MACZAACZAACZAACfifwJ07dyRt2rSCGj4UEvAGgQ8//FCuXLnijaGUGOPu3btSoUIF2bFjhxL6OlVJOLCw940cOTIdWE5dJOrlOgG0JEUnC1Pk9u3bkixZMrl//77tJkeKFEm2bdsmKKxHIQESIAESIAESIAES0ItA9erVZcmSJXoZRWtsI9CyZUuZMGGCbfP7e+Lz589bB/0PHjzw99RazZcnTx7LgYW953+FRdy1WmozjPn++++lfPnyZhj7j5XLly+XKlWqOMbelStXWicLFBIgARIgARIgARIgAb0IrFixQipXrqyXUbTGNgLoPli8eHHb5vf3xHPnzrUKuFNCRwAOrK1bt0rEiBHpwAodSt5tN4F48eLJb7/9JmjHaorUrFlTFi1a5BhzkdPdpUsXx+hDRUiABEiABEiABEiABLxDAA2D8L396NEj7wzIUYwlED9+fKuDOp4nU6Rq1aqybNkyU8z1mZ158+a1HFgRIkSgA8tnlDmwXwh88cUXMnv2bIkbN65f5rN7ksePHwtqft26dctuVf53/vr168usWbMcow8VIQESIAESIAESIAES8B6BkiVLCiJnKCQQGgLImJk3b55EixYtNMMocy+c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uc99zp155plu4cKFqbxVcDKFpMmMm4ZFAiRAAmkSoICVJk2GRQIkUBECScWiNBOXRRpwT9btt9+ud2ts2LCBRwvTLDCGRQIkQAIkQAITEMBdVocccoj78z//c72cvfCYYJrwJkNQmow402TGsEiABEgABCouYI0hUrInARIggQQEshCNEiQj851evb297p577nG33nqre+aZZ9ybb75JMStJQdEPCZAACZAACUxAAPdbzZ071y1evNhdfPHF7sILL3SzZs2qGLPJEJUmI86KAWVEJEACNU+g4gJWzRNlBkmABDIhUGnxKuv4fMLfuXOnW758ufvpT3/q7rvvPrdmzRoKWZlYFwMlARIgARKoNwJHHHGE3m2FtwrifquZM2cWRVApwadS8YSZrHR89WZfzC8JkEA2BChgZcOVoZIACaRIwEfsSSu6rOIqJ9z+/n7dhfXQQw+5a665xj3//POZ7wJLiyfDIQESIAESIIFqIYBjgsccc4z7oz/6IxWu9t13X9fR0eGdvEqIPpWIAxmuVDzecOmQBEiABDwIUMDygEQnJEACk0egHOEnbqrTjivt8JCfkZER3Y119dVXuxUrVji8zRDf8SEBEiABEiABEtiTAI4JdnZ26hsFr7zySt111dramgqqrESgrMItzHSl4kkFNgMhARIgAYjvMsHCtVR8SIAESKDqCFSqeUoznjTDmqhABgYG9HjhnXfe6R577DH3wgsvONydxYcESIAESIAESMC5lpYWvdsKxwM/+clPulNPPdVBzMrqSVsMSju8YvmuRBxZ8Wa4JEAC9UmAAlZ9ljtzTQJVTyBLISjNsNMMKyyUOGFi99Urr7yiYtbdd9/tHnjgAQpZVW/dTCAJkAAJkEBWBNrb21W0+tSnPuVOOOEEd/jhh3vtuMpKzEkr3LTCKeSeVbhZlS/DJQESqG8CFLDqu/yZexKoSgJxBJy4GUgr7GoLZ3R0VIWr1157zf37v/+7+/73v+96enri4qF7EiABEiABEpiSBHC/1Xnnnee++MUvuiVLlriuri6H75I+WQg7aYSZRhjFmGQVblL+9EcCJEACRdsqHiGkYZAACVQTgbSEocI8pRluOWGV49e3nBDHhg0b3HXXXed++MMf6gXwu3bt4sXvvgDpjgRIgARIoOoJQJzCmwMPPPBAd+6557rf/d3fdQcddFCm6U5L5Ekj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;clipPath=inset(0.33% 1% 0.67% 0%);fontStyle=1;fontSize=54;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,74],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" parent="1" vertex="1"> + <mxGeometry x="627" y="447" width="230" height="230" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;dashed=1;dashPattern=1 1;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-9" target="11Uq6ZhMWLkjAy6pIlUK-14" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-9" value="SMTP Exchange" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://pluspng.com/img-png/microsoft-exchange-logo-png--256.png;fontSize=54;" parent="1" vertex="1"> + <mxGeometry x="1397" y="434" width="256" height="256" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-10" value="POSTGRES SQL" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://brandlogos.net/wp-content/uploads/2021/11/postgresql-logo-512x512.png;clipPath=inset(17% 17.67% 18% 19%);fontSize=54;" parent="1" vertex="1"> + <mxGeometry x="1399.67" y="801" width="253.33" height="260" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeWidth=8;dashed=1;dashPattern=1 1;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-12" target="11Uq6ZhMWLkjAy6pIlUK-13" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-12" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://1000logos.net/wp-content/uploads/2021/09/Swisscom-Logo-500x281.png;clipPath=inset(14.5% 30.33% 14.5% 29.67%);" parent="1" vertex="1"> + <mxGeometry x="1397" y="81" width="281" height="281" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-13" value="" style="dashed=0;outlineConnect=0;html=1;align=center;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;shape=mxgraph.weblogos.sms;fillColor=#48B921;strokeColor=none" parent="1" vertex="1"> + <mxGeometry x="1888" y="111.5" width="220" height="220" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-14" value="<font style="font-size: 54px;">EMAIL<br></font>" style="shape=mxgraph.signs.tech.mail;html=1;pointerEvents=1;fillColor=#000000;strokeColor=none;verticalLabelPosition=bottom;verticalAlign=top;align=center;" parent="1" vertex="1"> + <mxGeometry x="1878" y="468" width="240" height="190" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-15" value="" style="group" parent="1" vertex="1" connectable="0"> + <mxGeometry x="1893" y="811" width="210" height="300" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-16" value="" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.database;whiteSpace=wrap;" parent="11Uq6ZhMWLkjAy6pIlUK-15" vertex="1"> + <mxGeometry y="90" width="210" height="140" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-17" value="<font style="font-size: 54px;">DATABASE</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="11Uq6ZhMWLkjAy6pIlUK-15" vertex="1"> + <mxGeometry x="80" y="270" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-18" value="" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.database;whiteSpace=wrap;" parent="11Uq6ZhMWLkjAy6pIlUK-15" vertex="1"> + <mxGeometry width="210" height="140" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.85;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=8;dashed=1;dashPattern=1 1;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-10" target="11Uq6ZhMWLkjAy6pIlUK-18" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeWidth=8;startArrow=classic;startFill=1;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-22" target="11Uq6ZhMWLkjAy6pIlUK-7" edge="1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-21" value="<font style="font-size: 54px;">OAUTH BACK</font> " style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="11Uq6ZhMWLkjAy6pIlUK-20" vertex="1" connectable="0"> + <mxGeometry x="-0.3375" y="14" relative="1" as="geometry"> + <mxPoint y="63" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-22" value="<font style="font-size: 54px;">OAUTH CLIENT<font style="font-size: 54px;"><br>(Bank)<br></font></font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.traditional_server;points=[[0.5,1,0,0,134]];" parent="1" vertex="1"> + <mxGeometry x="120" y="70" width="174.8" height="303" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;startArrow=classic;startFill=1;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-24" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="742" y="750" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-24" value="<font style="font-size: 54px;">RESOURCE OWNER<br>(Customer)<br></font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.user;strokeWidth=8;" parent="1" vertex="1"> + <mxGeometry x="77.4" y="801" width="260" height="260" as="geometry" /> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-25" value="<font style="font-size: 54px;">OAUTH FRONT</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="1" vertex="1" connectable="0"> + <mxGeometry x="520.0000000000002" y="380.0000000000001" as="geometry"> + <mxPoint x="28" y="600" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="11Uq6ZhMWLkjAy6pIlUK-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;startArrow=classic;startFill=1;dashed=1;dashPattern=1 1;entryX=0.5;entryY=1;entryDx=0;entryDy=134;entryPerimeter=0;" parent="1" source="11Uq6ZhMWLkjAy6pIlUK-24" target="11Uq6ZhMWLkjAy6pIlUK-22" edge="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="207" y="550" as="targetPoint" /> + <Array as="points" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram name="toplevel-sequence" id="SyY9wDuD4TxfP-VZwf9Q"> + <mxGraphModel dx="5661" dy="1947" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="qAoq_mQ2Etsym3KcncrC-61" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=60;entryPerimeter=0;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-117" target="qAoq_mQ2Etsym3KcncrC-52"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-1325" y="1910" as="sourcePoint" /> + <mxPoint x="-1325" y="480" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-76" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-71" target="qAoq_mQ2Etsym3KcncrC-75"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-77" value="<font style="font-size: 40px;">MONEY DEPOSITE</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-76"> + <mxGeometry x="0.0612" y="-3" relative="1" as="geometry"> + <mxPoint x="-67" y="-33" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-84" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;dashed=1;dashPattern=1 1;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-79" target="qAoq_mQ2Etsym3KcncrC-81"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-85" value="<font style="font-size: 40px;">NEED eKYC, REDIRECT KYCID<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-84"> + <mxGeometry x="-0.1558" y="4" relative="1" as="geometry"> + <mxPoint x="-89" y="-44" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-89" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;startArrow=classic;startFill=1;strokeColor=#66CC00;" edge="1" parent="1"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-2200.0000000000005" y="976" as="sourcePoint" /> + <mxPoint x="-261" y="976" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-93" value="<div><font style="font-size: 60px;">eKYC / OAuth Authorize</font></div> " style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-89"> + <mxGeometry x="0.0994" y="-1" relative="1" as="geometry"> + <mxPoint x="330" y="-56" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-108" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;dashed=1;dashPattern=1 1;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-94" target="qAoq_mQ2Etsym3KcncrC-96"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-109" value="<font style="font-size: 50px;">OAUTH REDIRECT</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-108"> + <mxGeometry x="0.0147" y="3" relative="1" as="geometry"> + <mxPoint x="-49" y="-45" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-110" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="1" target="qAoq_mQ2Etsym3KcncrC-111"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-310" y="1130" as="targetPoint" /> + <mxPoint x="-1300" y="1160" as="sourcePoint" /> + <Array as="points"> + <mxPoint x="-1300" y="1163" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-113" value="<font style="font-size: 50px;">OAuth Token<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-110"> + <mxGeometry x="0.0344" y="7" relative="1" as="geometry"> + <mxPoint x="-38" y="-36" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-114" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;dashed=1;dashPattern=1 1;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-111" target="qAoq_mQ2Etsym3KcncrC-96"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-115" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;startArrow=classic;startFill=1;strokeColor=#FF0000;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-87" target="qAoq_mQ2Etsym3KcncrC-86"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-116" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeWidth=8;startArrow=classic;startFill=1;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-86" target="qAoq_mQ2Etsym3KcncrC-87"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-121" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-117" target="qAoq_mQ2Etsym3KcncrC-120"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-123" value="<font style="font-size: 50px;">CHECK eKYC VERIFIED INFO<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-121"> + <mxGeometry x="-0.0207" y="10" relative="1" as="geometry"> + <mxPoint x="-12" y="-35" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-122" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#FF0000;strokeWidth=8;dashed=1;dashPattern=1 1;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-120" target="qAoq_mQ2Etsym3KcncrC-117"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-129" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-124" target="qAoq_mQ2Etsym3KcncrC-128"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-130" value="<font style="font-size: 50px;">RELEASE MONEY<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="qAoq_mQ2Etsym3KcncrC-129"> + <mxGeometry x="0.1326" y="-10" relative="1" as="geometry"> + <mxPoint x="33" y="-28" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-45" value="<font style="font-size: 34px;">CUSTOMER</font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.user;strokeWidth=8;points=[[0.5,1,0,0,60]];" vertex="1" parent="1"> + <mxGeometry x="-2400" y="144" width="260" height="260" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-60" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;" edge="1" parent="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-2277.8529945399587" y="1660" as="sourcePoint" /> + <mxPoint x="-2272" y="465.55568378534326" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-71" value="<font style="font-size: 60px;">1.<br></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-2340" y="590.7720715522216" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-105" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-81" target="qAoq_mQ2Etsym3KcncrC-86"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-2400" y="823.1736872475476" /> + <mxPoint x="-2400" y="1006.4904789382572" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-81" value="<font style="font-size: 60px;">2.<font style="font-size: 60px;"><br></font></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-2338" y="771.0871321407963" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-86" target="qAoq_mQ2Etsym3KcncrC-94"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-2400" y="1006.4904789382572" /> + <mxPoint x="-2400" y="1188.805539526832" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-86" value="<font style="font-size: 60px;">3.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-2340" y="956.4039238315061" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-94" value="<font style="font-size: 60px;">4.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-2340" y="1135.7189844200807" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-128" value="<font style="font-size: 60px;">6.<br></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-2350" y="1500.343912290825" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-52" value="GNU TALER EXCHANGE" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://taler.net/images/logo-2021.svg;fontSize=34;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,60],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="1"> + <mxGeometry x="-1660" y="80" width="670" height="300" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-103" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-75" target="qAoq_mQ2Etsym3KcncrC-79"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-1200" y="640" /> + <mxPoint x="-1200" y="820" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-75" value="<font style="font-size: 60px;">1.<br></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-1395" y="590" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-79" value="<font style="font-size: 60px;">2.<font style="font-size: 60px;"><br></font></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-1390" y="770" width="135" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-119" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-96" target="qAoq_mQ2Etsym3KcncrC-117"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-1470" y="1185" /> + <mxPoint x="-1470" y="1380" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-96" value="<font style="font-size: 60px;">4.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-1392.5" y="1135" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-118" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-124" target="qAoq_mQ2Etsym3KcncrC-117"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-1322" y="1910" as="sourcePoint" /> + <mxPoint x="-2715" y="640" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-126" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-117" target="qAoq_mQ2Etsym3KcncrC-124"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-1170" y="1380" /> + <mxPoint x="-1170" y="1550" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-117" value="<font style="font-size: 60px;">5.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-1392.5" y="1330" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-125" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" target="qAoq_mQ2Etsym3KcncrC-124"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-1320" y="1660" as="sourcePoint" /> + <mxPoint x="-2712" y="1630" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-124" value="<font style="font-size: 60px;">6.<br></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-1390" y="1500" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-1" value="KYCID SERVER" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/png,iVBORw0KGgoAAAANSUhEUgAABLAAAASwCAYAAADrIbPPAAAgAElEQVR4XuzdBbhVxfr48ZfulBaUDpVGSiUVkBJUGgQEvCDSoYBgENKpiHQ3XFpFlBYkpLvh0N0Nf9+5f7z+vAIndqy15jvPs58DuvfEZxZn7/2umXci3b5996FQEEAAAQQQQAABBBBAAAEEEEAAAQQQcKhAJAJYDp0ZuoUAAggggAACCCCAAAIIIIAAAgggYAQIYHEhIIAAAggggAACCCCAAAIIIIAAAgg4WiDS779vYguho6eIziGAAAIIIIAAAggggAACCCCAAAJ2C0R6+Eexm4DRI4AAAggggIDTBe7duyd37tyRu3fv/vlT/9v9+/fl0c+///nWrVty/fp1uXbtmnnon2/evCn630P70Pa0/tA8tH+hLbFjx5YYMWJIzJgx//z56M+P/rv+/dF/0+frI06cOBI3blzz869/TpAggUSNGtU8okSJ8n9+Pvrv+jNatGh/Pu/R3/X5FAQQQAABBBBAwOkCBLCcPkP0DwEEEEAAAY8K6D2027dvy9WrV02A6XE/9f9duXLF/H996J/1v2kw6p8CUlqn/ncNaNlWNMj116DYo8DX037GihVL9KHPC81PfQ4FAQQQQAABBBAIpAABrEBq0xYCCCCAAAKWCOhqp3Pnzsn58+fNQ//8979fuHDBrIrSgJOuXtLH4/784MEDS+QCP8xIkSL9uTJLV2g9ejxaofXo7/HixZNUqVLJs88+a34mT55ckiVLZh7656RJk5rgGQUBBBBAAAEEEPCHAAEsf6hSJwIIIIAAAh4T0NVS//Q4fvy47Nq1S3bv3m1+PvqzBqfIUuCxi+Apw9GtjRkyZJAsWbKYR+bMmf/8qSu7NFCmDy2P/vzo73ZJMVoEEEAAAQQQCI8AAazwqPEaBBBAAAEEPCigq5xu3LjxZ86oR1v6Ll++LKdOnZJjx46Zx9GjRyUkJMT81K16FASeJBA5cmR55plnJE2aNGb1VurUqf98pEiRQuLHjy+6uksf+mcNhOnqLwoCCCCAAAIIIPBXAQJYXA8IIIAAAghYJqC5oc6cOSOnT582galHD/1vut1PV089+ql/vnTpkkmeTkHA1wKaSytJkiQmwKUP/bM+dEtiypQpzVbFRz91i6IGwygIIIAAAgggYKcAASw7551RI4AAAghYIqCn5x04cEC2b9/+52PPnj1mpZXmm/rrQ3NQse3PkgvDwcN8lJNLT2P860mNujJLtya+8MILfz50yyJ5txw8mXQNAQQQQAABHwoQwPIhJlUhgAACCCAQSAFdSaVBJ10dpT91O9+hQ4dk8+bNsmXLFvPYuXMn2/wCOSm0FVABDXBpECt79ux/PrJly2a2IkaPHv3PhPT6Z/JtBXRqaAwBBBBAAAGfCxDA8jkpFSKAAAIIIOAfAd3Kp9v8Hj0OHz5sAlaPHpqT6tq1a/5pnFoRcImAbjPU3FrPP/+8pE2b1vzMlCmTybulWxP1odsUybPlkgmlmwgggAACCPx/AQJYXAruFXj4R9f/c5gRBQEEEPCcgK6o2r9/v+zbt0/27t1rfp48eVLOnj1rHufOnRNNss6WP89NPQPyg0C0aNFM0ErzaCVLlswEsR6dmJg1a1bz5wQJEvihZapEAAEEEEAAAV8JEMDylST1IIAAAgggEE4BDUIdP35cNmzYIOvXrzcPzVmlWwJ1e+CjB8GqcALzMgT+JqDbCXUFlga29BE7dmzJnDmzFChQQAoWLCj58uUzJyaSNJ5LBwEEEEAAAecIEMByzlzQEwQQQAABDwtovqrr16+bLX76U08A1FxVGqzSwJWustKE6xQEEAi+gAau9PTDXLlySZ48ecwjffr0JrdWnDhxzENPUCSvVvDnih4gECgBNn8ESpp2EHi8AAEsrg4EEEAAAQT8IHDr1i05ceKEhISEiOam0oeeBvjocerUKQJWfnCnSgT8JRAvXjyTT0sDWenSpTP5tTSvlj50tZYGvMir5S996kUAAQQQQOCPDEJ/bEfQYDIFAQQQQAABBCIgoG+nx44dk02bNsnGjRvNTw1gXbhwwTx05dWDBw8i0AIvRQABJwlosErzZiVKlEgSJkxoEsXr9kN96KmIukKLggACCCCAAAK+EyCA5TtLakIAAQQQsExAk6kvX75cFi9eLD///LMcOXLEBKm4N2TZhcBwEfiLgG4r1IBW8eLFpXz58lKqVClJlSoV2w25ShBAAAEEEIigAAGsCALycgQQQAABbwtoMOry5cvm5D9NtL5lyxazwkrzVul2QD0tkIIAAgg8TkBXamXMmPHP1VnZsmUzJyHqiYga6IoSJQp4CCCAAAIIIBAKAQJYoUDiKQgggAACdgnoKqr9+/ebkwB37Nghe/bsMUnW9b9dunSJFVZ2XQ6MFgGfCejqLE0Er3m0NKilJx9mzZpVNKiVJUsWiRs3rs/aoiIEEEAAAQS8JkAAy2szyngQQAABBMIlcOPGDVmzZo388ssvZlugnhKowSpdfXX37t1w1cmLEEAAgScJ6OorTQ6vubSeeeYZyZkzpxQtWlSKFCliEsVTEEAAAQQQQOC/AgSwuBoQQAABBKwS0NVVuu1PHydPnpSffvpJFi5caIJWN2/etMqCwSKAgHMFdJVW6dKlpUyZMlK4cGGTFD569OgSLVo053aaniGAAAIIIOBHAQJYfsSlagQQQAABZwhcvXrV5K8KCQkx2wA1h9W6detk9+7d5LByxhTRCwQQeIKArtIqUKCACWTlypVL0qZNK88995w5ATFy5MjYuURAj36P5JK+0k0EEEDAiQIEsJw4K/QJAQQQQCBCApp4XVdX/f777+axc+dOOXTokDkl8Ny5c3L//v0I1c+LEUAAgWAJxIkTxwSwMmTIIC+88IK8/PLLki9fPkmdOjXBrGBNCu0igAACCAREgABWQJhpBAEEEEAgEAKat2revHkya9Ys2bp1q2heK90WqDmsNKhFQQABBLwkoCccxo4d2yR/12BW+fLlpUKFCiZJPAUBBBBAAAGvCRDA8tqMMh4EEEDAAgENRmlgShOs60qrn3/+WebOnWuSsGuOKwoCCCBgq4BuKXzxxRelXLlyUrZsWRPM0pMPdeUW2w1tvSoYNwIIIOANAQJY3phHRoEAAghYIXDhwgXZs2eP7Nq1S7Zs2WLyWG3btk2uX79uxfgZJAIIIBAWAV2hpSuzNH9Wnjx5zJ+zZMkiyZIlk0iRyMYUFkueiwACCCAQfAECWMGfA3qAAAIIIPAEAV1ltXr1alm6dKnJZ3Xs2DGTkF23B1IQQAABBEInEDNmTEmZMqVJ/p49e3YpXry4FCtWTBInThy6CngWAggggAACQRYggBXkCaB5BBBAAIH/FdCcVRs2bJBx48aZfFYaxNLE62wP5GpBAAEEIi6gWwmjRIki0aJFM4Gs2rVrm9xZus2QggACCCCAgFMFCGA5dWboFwIIIGCRwKVLl+TUqVNy8OBB+f777+WHH34wfyZgZdFFwFARQCCoAgkSJJAyZcpIxYoVJUeOHGa1lq7OYqthUKeFxhFAAAEE/iJAAIvLAQEEEEAgKAIXL140JwXqtsBHj3379pkTAykIIIAAAsER0LxZadOmlbx588rLL79sHrlz55Z48eIFp0O0igACCCCAwP8XIIDFpYAAAgggEDABXVGlwao5c+aYnFaaz+rMmTNy+/btgPWBhhBAAAEEQicQI0YMSZ48uaRJk0ZKliwplSpVMvmzNMhFQQABBBBAINACBLACLU57CCCAgEUCGrDSFVW6RXDq1KkyatQo2bFjB1sDLboGGCoCCHhHQPNmaQCrXr16UqNGDUmYMKEJZmlOLQoCCCCAAAL+FiCA5W9h6kcAAQQsE9Cg1cmTJ00OK11ttXjxYlm2bBmnBlp2HTBcBBDwtkDcuHGlVKlS8uabb0quXLkkffr0kihRInJmeXvaGR0CCCAQVAECWEHlp3EEEEDAOwJXrlyR1atXy/Lly2XTpk1mpZUGskjE7p05ZiQIIIDA3wV0BZYGr3LmzGnyZZUoUULy5MlDIItLBQEEEEDA5wIEsHxOSoUIIICAPQIPHz6UXbt2yaRJk2Tu3LnmJMHLly/LvXv37EFgpAgggAACJmClObN0W2GmTJnkvffek7feekuSJk2KDgIIIIAAAj4RIIDlE0ZvV/Lwj+FF8vYQGR0CCIRSQFdT3bhxQ3S1lW4LHD16tKxatYok7KH042kIIICATQKJEyeWChUqSP369SVbtmySIEECE+SiIIAAAgggEB4BAljhUeM1CCCAgGUCN2/elD179siWLVtkxYoVJq9VSEiIZQoMFwEEEEAgPAKa5F3zZJUpU0YKFSpkths+++yzJH8PDyavQQABBCwWIIBl8eQzdAQQQOBpAidOnJBFixbJkiVLZOfOnSYx+/Xr15/2Mv4/AggggAAC/yOg2wx1S2HWrFmlQIECZnVW4cKFRU83pCCAAAIIIPA0AQJYTxPi/yOAAAKWCWj+qjVr1sjw4cPl+++/l2vXrsmdO3dE811REEAAAQQQ8IWABq1ixowp6dKlk48++kiqVatm8mdREEAAAQQQeJwAASyuDQQQQMByAQ1MaU4rPTFQ81qNGjVKNm/eTCJ2y68Lho8AAggEUiBZsmRSuXJlE8jKmDGj6N/JlxXIGaAtBBBAwPkCBLCcP0f0EAEEEPCLgAau9u3bZ5Kwr1y5UpYuXSpHjhzxS1tUigACCCCAQGgEdJuh5skqXry4FClSxPw5Xrx4oXkpz0EAAQQQ8LgAASyPTzDDQwABBP4uoNsBV69eLRMmTJD169fL0aNH5erVq2wR5FJBAAEEEHCMQNSoUSVFihRmNValSpWkSpUqkipVKsf0j44ggAACCARegABW4M1pEQEEEAi4wIMHD+TWrVsya9Ys6d+/v9kiSEEAAQQQQMAtAnHjxpVatWpJ69atTVBLV2rpg4IAAgggYI8AASx75pqRIoCAZQL379+XkJAQ2bNnj0nGPnPmTPN3CgIIIIAAAm4V0LxYJUqUkKpVq0q+fPlMEvg4ceK4dTj0GwEEEEAgDAIEsMKAxVMRQAABNwho4Grr1q2ycOFCk9dq48aNcvnyZTd0nT4igAACCCAQKgHdYpg1a1YpXLiwCWiVLFlSkiRJEqrX8iQEEEAAAXcKEMBy57zRawQQQOB/BHSboCZj//bbb+XXX3+VM2fOyO3bt5FCAAEEEEDAswKRI0eWBAkSmPxYmiurbt26kilTJs+Ol4EhgAACNgsQwLJ59hk7Agi4XuDu3bsmAbueJNivXz8TuLp3757rx8UAEEAAAQQQCI+AnlioCd/btm0radKkkdixY4sGuSgIIIAAAu4XIIDl/jlkBAggYKGABq10m+CyZctMYnZNyv7w4UMLJRgyAggggAAC/yuggauyZctKxYoVpUCBAmZVFknfuVIQQAABdwsQwHL3/NF7BBCwTODcuXPyww8/yPz582XDhg1y5MgR0ZxXFAQQQAABBBD4XwE9vfDFF1+UV155Rd59912T+D1atGhQIYAAAgi4UIAAlgsnjS4jgIB9ApcuXTK5rcaOHWtOErx58yYrruy7DBgxAggggEA4BaJEiWJyZRUsWFA6duxoAloUBBBAAAF3CRDActd80VsEELBIQLcJHj58WGbMmCHfffedScpOQQABBBBAAIGIC7z66qvStGlTc4phihQpJHr06BGvlBoQQAABBPwqQADLr7xUjgACCIRd4NSpU7J69Wr58ccfZeHChXLy5ElWW4WdkVcggAACCCDwRAHdSpgjRw6TK+uNN96QvHnzmqTvFAQQQAABZwoQwHLmvNArBBCwUOD06dMyadIkk99q+/btovmuKAgggAACCCDgXwE9pTBt2rRme2H9+vWlePHiolsOKQgggAACzhIggOWs+aA3CCBgocDFixelb9++MnToULly5Yo8ePDAQgWGjAACCCCAQHAF9JRCDWblz59f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sG/fPqlXr56cOHHCkfpRKXUJJE+e3EoHS5kypbpGuKH5tWvXpG7durJ582Y37uKl/yYAB9amTZsEGUD/FaYQ8llRkkCuXLlk586dxjhSDh8+LHXq1JFjx47Zul6NGjWyosACy0e2VTFOTgIkQAIkQAIkQAIk4DEBlKioVauWrF+/3uMxeCMJBEagSJEismHDBkEqoQmCwu1wBp86dcoEc31iI/b6cGAh64oOLJ8g5qD+JoAcapPakq5du1aqVasmqFFgp5QuXVqmT58uCRIksFMNzk0CJEACJEACJEACJOBlAr169ZJvvvlGXr586eWROZzJBL7++mvp0aOHMQgWL14sDRo0YFfPUKw4HFiIYIsaNSodWKHgyFsdQiBMmDCCjnyZM2d2iEa+VQMfEUjb69+/v28ncmH0zz//3GqBmyJFCheu5iUkQAIkQAIkQAIkQAKqEECUDLpNP336VBWVqacCBA4cOGDMvu3Zs2fSt29fGTZsmAIr41wVc+fObTmwokSJQgeWc5eJmrlKIHHixILWpKZ0H8SLsEyZMrJlyxZXEfnsuiRJksiaNWskQ4YMPpuDA5MACZAACZAACZAACfifwJ07dyRt2rSCGj4UEvAGgQ8//FCuXLnijaGUGOPu3btSoUIF2bFjhxL6OlVJOLCw940cOTIdWE5dJOrlOgG0JEUnC1Pk9u3bkixZMrl//77tJkeKFEm2bdsmKKxHIQESIAESIAESIAES0ItA9erVZcmSJXoZRWtsI9CyZUuZMGGCbfP7e+Lz589bB/0PHjzw99RazZcnTx7LgYW953+FRdy1WmozjPn++++lfPnyZhj7j5XLly+XKlWqOMbelStXWicLFBIgARIgARIgARIgAb0IrFixQipXrqyXUbTGNgLoPli8eHHb5vf3xHPnzrUKuFNCRwAOrK1bt0rEiBHpwAodSt5tN4F48eLJb7/9JmjHaorUrFlTFi1a5BhzkdPdpUsXx+hDRUiABEiABEiABEiABLxDAA2D8L396NEj7wzIUYwlED9+fKuDOp4nU6Rq1aqybNkyU8z1mZ158+a1HFgRIkSgA8tnlDmwXwh88cUXMnv2bIkbN65f5rN7ksePHwtqft26dctuVf53/vr168usWbMcow8VIQESIAESIAESIAES8B6BkiVLCiJnKCQQGgLImJk3b55EixYtNMMocy+c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uc99zp155plu4cKFqbxVcDKFpMmMm4ZFAiRAAmkSoICVJk2GRQIkUBECScWiNBOXRRpwT9btt9+ud2ts2LCBRwvTLDCGRQIkQAIkQAITEMBdVocccoj78z//c72cvfCYYJrwJkNQmow402TGsEiABEgABCouYI0hUrInARIggQQEshCNEiQj851evb297p577nG33nqre+aZZ9ybb75JMStJQdEPCZAACZAACUxAAPdbzZ071y1evNhdfPHF7sILL3SzZs2qGLPJEJUmI86KAWVEJEACNU+g4gJWzRNlBkmABDIhUGnxKuv4fMLfuXOnW758ufvpT3/q7rvvPrdmzRoKWZlYFwMlARIgARKoNwJHHHGE3m2FtwrifquZM2cWRVApwadS8YSZrHR89WZfzC8JkEA2BChgZcOVoZIACaRIwEfsSSu6rOIqJ9z+/n7dhfXQQw+5a665xj3//POZ7wJLiyfDIQESIAESIIFqIYBjgsccc4z7oz/6IxWu9t13X9fR0eGdvEqIPpWIAxmuVDzecOmQBEiABDwIUMDygEQnJEACk0egHOEnbqrTjivt8JCfkZER3Y119dVXuxUrVji8zRDf8SEBEiABEiABEtiTAI4JdnZ26hsFr7zySt111dramgqqrESgrMItzHSl4kkFNgMhARIgAYjvMsHCtVR8SIAESKDqCFSqeUoznjTDmqhABgYG9HjhnXfe6R577DH3wgsvONydxYcESIAESIAESMC5lpYWvdsKxwM/+clPulNPPdVBzMrqSVsMSju8YvmuRBxZ8Wa4JEAC9UmAAlZ9ljtzTQJVTyBLISjNsNMMKyyUOGFi99Urr7yiYtbdd9/tHnjgAQpZVW/dTCAJkAAJkEBWBNrb21W0+tSnPuVOOOEEd/jhh3vtuMpKzEkr3LTCKeSeVbhZlS/DJQESqG8CFLDqu/yZexKoSgJxBJy4GUgr7GoLZ3R0VIWr1157zf37v/+7+/73v+96enri4qF7EiABEiABEpiSBHC/1Xnnnee++MUvuiVLlriuri6H75I+WQg7aYSZRhjFmGQVblL+9EcCJEACRdsqHiGkYZAACVQTgbSEocI8pRluOWGV49e3nBDHhg0b3HXXXed++MMf6gXwu3bt4sXvvgDpjgRIgARIoOoJQJzCmwMPPPBAd+6557rf/d3fdQcddFCm6U5L5Ekj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;clipPath=inset(0.33% 1% 0.67% 0%);fontStyle=1;fontSize=34;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,50],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="1"> + <mxGeometry x="-310" y="159" width="230" height="230" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-62" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=50;entryPerimeter=0;" edge="1" parent="1" source="qAoq_mQ2Etsym3KcncrC-111" target="qAoq_mQ2Etsym3KcncrC-1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-195" y="1920" as="sourcePoint" /> + <mxPoint x="-197" y="560" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-112" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" target="qAoq_mQ2Etsym3KcncrC-111"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-195" y="1630" as="sourcePoint" /> + <mxPoint x="-235" y="718" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-111" value="<font style="font-size: 60px;">4.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-265" y="1135" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-120" value="<font style="font-size: 60px;">5.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-265" y="1329" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="qAoq_mQ2Etsym3KcncrC-87" value="<font style="font-size: 60px;">3.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1"> + <mxGeometry x="-261" y="955" width="140" height="100" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram name="oauth2-flow" id="bD421tJYXGO8fZUvX1Yi"> + <mxGraphModel dx="6297" dy="2320" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="s_E22vGNxIn1BDN0OQYc-0" /> + <mxCell id="s_E22vGNxIn1BDN0OQYc-1" parent="s_E22vGNxIn1BDN0OQYc-0" /> + <mxCell id="s_E22vGNxIn1BDN0OQYc-2" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=45;entryPerimeter=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-38" target="QxnKOOYnZxdUtVdB8eYQ-5"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-1425" y="1910" as="sourcePoint" /> + <mxPoint x="-1425" y="440" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-23" target="s_E22vGNxIn1BDN0OQYc-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-4" value="<font style="font-size: 34px;">START FLOW</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="s_E22vGNxIn1BDN0OQYc-3"> + <mxGeometry x="0.0612" y="-3" relative="1" as="geometry"> + <mxPoint x="-67" y="-33" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;dashed=1;dashPattern=1 1;strokeColor=#66CC00;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-33" target="s_E22vGNxIn1BDN0OQYc-25"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-6" value="<font style="font-size: 34px;">REDIRECT</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="s_E22vGNxIn1BDN0OQYc-5"> + <mxGeometry x="-0.1558" y="4" relative="1" as="geometry"> + <mxPoint x="-89" y="-44" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=8;startArrow=classic;startFill=1;strokeColor=#66CC00;entryX=0;entryY=0.25;entryDx=0;entryDy=-7;entryPerimeter=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" target="s_E22vGNxIn1BDN0OQYc-46"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-2200.0000000000005" y="976" as="sourcePoint" /> + <mxPoint x="-250" y="960" as="targetPoint" /> + <Array as="points"> + <mxPoint x="-1224" y="976" /> + <mxPoint x="-650" y="977" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-8" value="<font style="font-size: 34px;">Front channel<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="s_E22vGNxIn1BDN0OQYc-7"> + <mxGeometry x="0.0994" y="-1" relative="1" as="geometry"> + <mxPoint x="293" y="-47" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;dashed=1;dashPattern=1 1;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-28" target="s_E22vGNxIn1BDN0OQYc-35"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-10" value="<font style="font-size: 34px;">REDIRECT BACK<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="s_E22vGNxIn1BDN0OQYc-9"> + <mxGeometry x="0.0147" y="3" relative="1" as="geometry"> + <mxPoint x="-49" y="-45" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" target="s_E22vGNxIn1BDN0OQYc-44"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-310" y="1130" as="targetPoint" /> + <mxPoint x="-1300" y="1160" as="sourcePoint" /> + <Array as="points"> + <mxPoint x="-1300" y="1163" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-12" value="<font style="font-size: 34px;">Back channel<br></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="s_E22vGNxIn1BDN0OQYc-11"> + <mxGeometry x="0.0344" y="7" relative="1" as="geometry"> + <mxPoint x="-84" y="-36" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;dashed=1;dashPattern=1 1;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-44" target="s_E22vGNxIn1BDN0OQYc-35"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;startArrow=classic;startFill=1;strokeColor=#FF0000;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-46" target="s_E22vGNxIn1BDN0OQYc-27"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;strokeWidth=8;startArrow=classic;startFill=1;strokeColor=#66CC00;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-27" target="s_E22vGNxIn1BDN0OQYc-46"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-38" target="s_E22vGNxIn1BDN0OQYc-45"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-17" value="<font style="font-size: 34px;">Resource access<font style="font-size: 34px;"><br></font></font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="s_E22vGNxIn1BDN0OQYc-16"> + <mxGeometry x="-0.0207" y="10" relative="1" as="geometry"> + <mxPoint x="387" y="-35" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;strokeColor=#FF0000;strokeWidth=8;dashed=1;dashPattern=1 1;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-45" target="s_E22vGNxIn1BDN0OQYc-38"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-21" value="<font style="font-size: 34px;">Resource Owner</font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.user;strokeWidth=8;points=[[0.5,1,0,0,60]];" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-2400" y="144" width="260" height="260" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-22" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-2272" y="1510" as="sourcePoint" /> + <mxPoint x="-2272" y="465.55568378534326" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-23" value="<font style="font-size: 60px;">1.<br></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-2340" y="590.7720715522216" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-25" target="s_E22vGNxIn1BDN0OQYc-27"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-2400" y="823.1736872475476" /> + <mxPoint x="-2400" y="1006.4904789382572" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-25" value="<font style="font-size: 60px;">2.<font style="font-size: 60px;"><br></font></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-2338" y="771.0871321407963" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#66CC00;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-27" target="s_E22vGNxIn1BDN0OQYc-28"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-2400" y="1006.4904789382572" /> + <mxPoint x="-2400" y="1188.805539526832" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-27" value="<font style="font-size: 60px;">3.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-2340" y="956.4039238315061" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-28" value="<font style="font-size: 60px;">4.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-2340" y="1135.7189844200807" width="140" height="100.1731102135026" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-32" target="s_E22vGNxIn1BDN0OQYc-33"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-1300" y="640" /> + <mxPoint x="-1300" y="820" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-32" value="<font style="font-size: 60px;">1.<br></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-1495" y="590" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-33" value="<font style="font-size: 60px;">2.<font style="font-size: 60px;"><br></font></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-1490" y="770" width="135" height="100" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=8;strokeColor=#FF0000;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-35" target="s_E22vGNxIn1BDN0OQYc-38"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-1570" y="1185" /> + <mxPoint x="-1570" y="1380" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-35" value="<font style="font-size: 60px;">4.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-1492.5" y="1135" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-36" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" target="s_E22vGNxIn1BDN0OQYc-38"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-1422" y="1520" as="sourcePoint" /> + <mxPoint x="-2815" y="640" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-38" value="<font style="font-size: 60px;">5.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-1492.5" y="1330" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-42" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=48;entryPerimeter=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-44" target="QxnKOOYnZxdUtVdB8eYQ-4"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-563.5" y="1920" as="sourcePoint" /> + <mxPoint x="-563.5" y="439" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-43" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" target="s_E22vGNxIn1BDN0OQYc-44"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-563" y="1520" as="sourcePoint" /> + <mxPoint x="-603.5" y="718" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-44" value="<font style="font-size: 60px;">4.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-633.5" y="1135" width="140" height="100" as="geometry" /> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-46" value="<font style="font-size: 60px;">3.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;points=[[0,0,0,0,0],[0,0.25,0,0,-7],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,0],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-629.5" y="960" width="140" height="95" as="geometry" /> + </mxCell> + <mxCell id="QxnKOOYnZxdUtVdB8eYQ-4" value="Authorization server" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://www.onwebsecurity.com/images/oauth.png;fontSize=34;points=[[0,0,0,0,0],[0,0.25,0,0,0],[0,0.5,0,0,0],[0,0.75,0,0,0],[0,1,0,0,0],[0.25,0,0,0,0],[0.25,1,0,0,0],[0.5,0,0,0,0],[0.5,1,0,0,48],[0.75,0,0,0,0],[0.75,1,0,0,0],[1,0,0,0,0],[1,0.25,0,0,0],[1,0.5,0,0,0],[1,0.75,0,0,0],[1,1,0,0,0]];" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-710" y="134.38" width="301" height="302" as="geometry" /> + </mxCell> + <mxCell id="QxnKOOYnZxdUtVdB8eYQ-5" value="<font style="font-size: 34px;">CLIENT</font>" style="image;points=[[0.5,1,0,0,45]];aspect=fixed;html=1;align=center;shadow=0;dashed=0;image=img/lib/allied_telesis/computer_and_terminals/Server_Desktop.svg;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="-1536.53" y="144" width="223.06" height="282.76" as="geometry" /> + </mxCell> + <mxCell id="QxnKOOYnZxdUtVdB8eYQ-7" value="<font style="font-size: 34px;">Resource server</font>" style="image;points=[[0.5,1,0,0,45]];aspect=fixed;html=1;align=center;shadow=0;dashed=0;image=img/lib/allied_telesis/computer_and_terminals/Server_Desktop.svg;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="110" y="144" width="223.06" height="282.76" as="geometry" /> + </mxCell> + <mxCell id="QxnKOOYnZxdUtVdB8eYQ-10" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=45;entryPerimeter=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" source="s_E22vGNxIn1BDN0OQYc-45" target="QxnKOOYnZxdUtVdB8eYQ-7"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="222" y="1630" as="sourcePoint" /> + <mxPoint x="223.52999999999997" y="520" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="QxnKOOYnZxdUtVdB8eYQ-11" value="" style="endArrow=none;html=1;rounded=0;strokeWidth=14;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="s_E22vGNxIn1BDN0OQYc-1" target="s_E22vGNxIn1BDN0OQYc-45"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="220" y="1510" as="sourcePoint" /> + <mxPoint x="222" y="472" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="s_E22vGNxIn1BDN0OQYc-45" value="<font style="font-size: 60px;">5.</font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="s_E22vGNxIn1BDN0OQYc-1"> + <mxGeometry x="150" y="1329" width="140" height="100" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="85NBdrO8fbHQNX-p3_-S" name="server-layer"> + <mxGraphModel dx="1735" dy="1062" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="n-JQNi5v5NvHdOIuuuR--2" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.half_circle;rotation=90;fillColor=#cce5ff;strokeColor=#36393d;points=[[0.48,0,0,0,-35],[0.48,1,0,0,24]];" vertex="1" parent="1"> + <mxGeometry x="80" y="213.66" width="355" height="177.68" as="geometry" /> + </mxCell> + <mxCell id="n-JQNi5v5NvHdOIuuuR--4" value="" style="verticalLabelPosition=bottom;verticalAlign=top;html=1;shape=mxgraph.basic.half_circle;rotation=-90;fillColor=#cce5ff;strokeColor=#36393d;" vertex="1" parent="1"> + <mxGeometry x="260" y="213.66" width="355" height="177.68" as="geometry" /> + </mxCell> + <mxCell id="n-JQNi5v5NvHdOIuuuR--5" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#cdeb8b;strokeColor=#36393d;" vertex="1" parent="1"> + <mxGeometry x="254.01" y="200" width="190" height="190" as="geometry" /> + </mxCell> + <mxCell id="n-JQNi5v5NvHdOIuuuR--6" value="DOMAIN" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#ffcc99;strokeColor=#36393d;" vertex="1" parent="1"> + <mxGeometry x="300.42" y="246.4" width="97.19" height="97.19" as="geometry" /> + </mxCell> + <mxCell id="n-JQNi5v5NvHdOIuuuR--7" value="APPLICATION" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="319.01" y="212.81" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="n-JQNi5v5NvHdOIuuuR--17" value="INFRASTRUCTURE" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=none;" vertex="1" parent="1"> + <mxGeometry x="354" y="410" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="n-JQNi5v5NvHdOIuuuR--18" value="PRESENTATION" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fillColor=none;" vertex="1" parent="1"> + <mxGeometry x="230" y="170" width="120" height="30" as="geometry" /> + </mxCell> + <mxCell id="OfVqpnY8OvLPn-XRexTx-1" value="MS Exchange" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://pluspng.com/img-png/microsoft-exchange-logo-png--256.png;fontSize=18;" vertex="1" parent="1"> + <mxGeometry x="586.5" y="266.59" width="77" height="77" as="geometry" /> + </mxCell> + <mxCell id="OfVqpnY8OvLPn-XRexTx-2" value="POSTGRES" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://brandlogos.net/wp-content/uploads/2021/11/postgresql-logo-512x512.png;clipPath=inset(17% 17.67% 18% 19%);fontSize=18;" vertex="1" parent="1"> + <mxGeometry x="586.5" y="410" width="58.46" height="60" as="geometry" /> + </mxCell> + <mxCell id="OfVqpnY8OvLPn-XRexTx-3" value="" style="shape=image;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=https://1000logos.net/wp-content/uploads/2021/09/Swisscom-Logo-500x281.png;clipPath=inset(14.5% 30.33% 14.5% 29.67%);" vertex="1" parent="1"> + <mxGeometry x="580" y="140" width="90" height="90" as="geometry" /> + </mxCell> + <mxCell id="Ej0ObpOTWrha_WEpmPLj-1" value="<font style="font-size: 18px;">CLIENT</font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.traditional_server;points=[[0.5,1,0,0,51]];" vertex="1" parent="1"> + <mxGeometry x="88.36211538461538" y="140.53" width="34.307861538461545" height="59.46957692307693" as="geometry" /> + </mxCell> + <mxCell id="Ej0ObpOTWrha_WEpmPLj-2" value="<font style="font-size: 18px;">CUSTOMER</font>" style="sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#232F3D;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.user;strokeWidth=8;" vertex="1" parent="1"> + <mxGeometry x="80" y="409.9963370332997" width="51.03" height="51.03" as="geometry" /> + </mxCell> + <mxCell id="KgKam0Bt1vzw1-gXziGN-1" value="<b><font style="font-size: 22px;">PRIMARY ACTORS</font></b>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="60.00000000000001" y="60" width="246.86" height="30" as="geometry" /> + </mxCell> + <mxCell id="KgKam0Bt1vzw1-gXziGN-2" value="<font style="font-size: 22px;"><b>SECONDARY ACTORS<br></b></font>" style="text;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="473.99999999999994" y="60" width="246.86" height="30" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="jDjl3FxT7_hcUoDlVtnx" name="authorize-process"> + <mxGraphModel dx="1363" dy="834" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-7" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-1" target="TdgKcFVUTiWIhhDTKmeS-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-1" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1"> + <mxGeometry x="20" y="330" width="40" height="40" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-9" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-6" target="TdgKcFVUTiWIhhDTKmeS-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-6" value="SESSION<br>AUTHENTICATE ?" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="110" y="317" width="150" height="65" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-11" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-8" target="TdgKcFVUTiWIhhDTKmeS-10"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="410" y="350" /> + <mxPoint x="410" y="350" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-23" value="<font style="font-size: 16px;">NO</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="TdgKcFVUTiWIhhDTKmeS-11"> + <mxGeometry x="-0.2352" y="-6" relative="1" as="geometry"> + <mxPoint x="-9" y="14" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-8" target="TdgKcFVUTiWIhhDTKmeS-20"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="680" y="280" as="targetPoint" /> + <Array as="points"> + <mxPoint x="338" y="270" /> + <mxPoint x="658" y="270" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-8" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="310" y="322.5" width="55" height="55" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-10" target="TdgKcFVUTiWIhhDTKmeS-20"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="630" y="350" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-10" value="<font style="font-size: 16px;">CONNECTION</font>" style="whiteSpace=wrap;html=1;strokeWidth=8;" vertex="1" parent="1"> + <mxGeometry x="430" y="319.5" width="140" height="60" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-22" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-20" target="TdgKcFVUTiWIhhDTKmeS-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-20" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="630" y="322" width="55" height="55" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="TdgKcFVUTiWIhhDTKmeS-21" target="TdgKcFVUTiWIhhDTKmeS-33"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-21" value="<font style="font-size: 16px;">eKYC</font>" style="whiteSpace=wrap;html=1;strokeWidth=8;" vertex="1" parent="1"> + <mxGeometry x="732.5" y="319.5" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-24" value="<font style="font-size: 16px;">YES</font>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="1"> + <mxGeometry x="413.9957142857142" y="370" as="geometry"> + <mxPoint x="-53" y="-73" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="TdgKcFVUTiWIhhDTKmeS-33" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="910" y="330" width="40" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="gac0o1NcyuLBiUxd2LD6" name="connection-process"> + <mxGraphModel dx="2562" dy="1062" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-2" target="EsDcp5gfyEr-PVh7Jtnl-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-2" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1"> + <mxGeometry x="-740" y="177.5" width="40" height="40" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-4" target="EsDcp5gfyEr-PVh7Jtnl-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-4" value="PROMPT EMAIL<br>AND LOOKUP<br>ACCOUNT" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="-650" y="165" width="150" height="65" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-28" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-17" target="EsDcp5gfyEr-PVh7Jtnl-30"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-370" y="180" as="sourcePoint" /> + <mxPoint x="-236.5" y="90" as="targetPoint" /> + <Array as="points"> + <mxPoint x="-427" y="93" /> + <mxPoint x="-400" y="93" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-35" value="INEXISTANT<br>ACCOUNT" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="EsDcp5gfyEr-PVh7Jtnl-28"> + <mxGeometry x="-0.5368" relative="1" as="geometry"> + <mxPoint x="48" y="-15" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-17" target="EsDcp5gfyEr-PVh7Jtnl-31"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-37" value="UNVERIFIED<br>EMAIL" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="EsDcp5gfyEr-PVh7Jtnl-36"> + <mxGeometry x="-0.5056" y="-4" relative="1" as="geometry"> + <mxPoint x="7" y="19" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-17" target="EsDcp5gfyEr-PVh7Jtnl-40"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-432" y="300" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-44" value="VERIFIED EMAIL" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="EsDcp5gfyEr-PVh7Jtnl-43"> + <mxGeometry x="0.0448" y="-5" relative="1" as="geometry"> + <mxPoint x="30" y="8" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-17" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="-460" y="170" width="55" height="55" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-30" target="EsDcp5gfyEr-PVh7Jtnl-31"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-245" y="140" /> + <mxPoint x="-233" y="140" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-30" value="REGISTER" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="-320" y="60" width="150" height="65" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-31" target="EsDcp5gfyEr-PVh7Jtnl-40"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="-233" y="240" /> + <mxPoint x="-217" y="240" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-31" value="VERIFY<br>EMAIL" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="-306" y="167.5" width="146" height="60" as="geometry" /> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="EsDcp5gfyEr-PVh7Jtnl-40"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-110" y="300.0526315789473" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="EsDcp5gfyEr-PVh7Jtnl-40" value="LOGIN PASSWORD" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="-290" y="270" width="146" height="60" as="geometry" /> + </mxCell> + <mxCell id="tqJg_kw0knL5BtsCr_zm-1" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="-110" y="280" width="40" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="qvhfzYtfhYg9vHtJIoav" name="ekyc-process"> + <mxGraphModel dx="1060" dy="649" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="XHxg1FwIQw2XTMDL94TD-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="VvEsFtwNvloipycEvIzJ-1" target="XHxg1FwIQw2XTMDL94TD-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="VvEsFtwNvloipycEvIzJ-1" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1"> + <mxGeometry x="110" y="290" width="40" height="40" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="XHxg1FwIQw2XTMDL94TD-2" target="ex6UNA1suQKBGl9vOP8b-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="XHxg1FwIQw2XTMDL94TD-2" value="NEED<br>PHONE NUMBER<br>CHECK" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="190" y="280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-4" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-1" target="ex6UNA1suQKBGl9vOP8b-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-8" value="<div>YES</div>" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="ex6UNA1suQKBGl9vOP8b-4"> + <mxGeometry x="-0.1946" y="-1" relative="1" as="geometry"> + <mxPoint x="-5" y="10" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-1" target="ex6UNA1suQKBGl9vOP8b-5"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="374" y="250" /> + <mxPoint x="604" y="250" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-11" value="NO" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="ex6UNA1suQKBGl9vOP8b-7"> + <mxGeometry x="-0.3904" y="1" relative="1" as="geometry"> + <mxPoint x="-43" y="21" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-1" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="350" y="285.5" width="47.5" height="47.5" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-3" target="ex6UNA1suQKBGl9vOP8b-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-3" value="VERIFY<br>WITH SMS<br>CODE" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="430" y="280" width="108.75" height="60" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-5" target="ex6UNA1suQKBGl9vOP8b-13"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-5" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="580" y="286.25" width="47.5" height="47.5" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-13" target="ex6UNA1suQKBGl9vOP8b-15"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="724" y="400" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-13" value="NEED<br>DOCUMENT<br>CHECK" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="670" y="280" width="108.75" height="60" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-19" value="YES" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-15" target="ex6UNA1suQKBGl9vOP8b-17"> + <mxGeometry x="-0.5152" y="-10" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-15" target="ex6UNA1suQKBGl9vOP8b-20"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="604" y="460" /> + <mxPoint x="364" y="460" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-25" value="NO" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="ex6UNA1suQKBGl9vOP8b-22"> + <mxGeometry x="-0.8965" y="4" relative="1" as="geometry"> + <mxPoint x="12" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-15" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="580" y="376.25" width="47.5" height="47.5" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-17" target="ex6UNA1suQKBGl9vOP8b-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-17" value="<div>GET DOCUMENT</div><div>AND PHOTO<br></div>" style="whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="430" y="370" width="108.75" height="60" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=4;" edge="1" parent="1" source="ex6UNA1suQKBGl9vOP8b-20" target="ex6UNA1suQKBGl9vOP8b-23"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-20" value="<font style="font-size: 30px;">X</font>" style="rhombus;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="340" y="376.25" width="47.5" height="47.5" as="geometry" /> + </mxCell> + <mxCell id="ex6UNA1suQKBGl9vOP8b-23" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;strokeColor=#000000;fillColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="230" y="380" width="40" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/figures/sigdoydy1.jpeg b/docs/figures/sigdoydy1.jpeg Binary files differ. diff --git a/docs/figures/software-layer.pdf b/docs/figures/software-layer.pdf Binary files differ. diff --git a/docs/figures/strategical-vs-tactical.pdf b/docs/figures/strategical-vs-tactical.pdf Binary files differ. diff --git a/docs/figures/system.pdf b/docs/figures/system.pdf Binary files differ. diff --git a/docs/figures/tdd-cycle.pdf b/docs/figures/tdd-cycle.pdf Binary files differ. diff --git a/docs/figures/toplevel-sequence.pdf b/docs/figures/toplevel-sequence.pdf Binary files differ. diff --git a/docs/figures/toplevel.pdf b/docs/figures/toplevel.pdf Binary files differ. diff --git a/docs/figures/wallpaper.png b/docs/figures/wallpaper.png Binary files differ. diff --git a/docs/references.bib b/docs/references.bib @@ -0,0 +1,87 @@ +@thesis{KYCPAAS, + title = {KYC-procedures as a service}, + author = {Loïc, Fauchère}, + year = 2023, + month = 6, + school = {Berner Fachhochschule}, + type = {Bachelor's thesis} +} +@misc{LEFin, + title = {loi sur les établissements financiers (LEFin)}, + institution = {Helvetica Confederatio (CH)}, + url = {https://www.fedlex.admin.ch/eli/cc/2018/801/fr}, + date = {2020-01-01} +} +@misc{LTC, + title={Loi sur les télécommunications (LTC)}, + institution = {Helvetica Confederatio (CH)}, + url={https://www.fedlex.admin.ch/eli/oc/2020/1019/fr}, + date={2021-01-01} +} +@online{TWINT, + title = {TWINT}, + url = {https://twint.ch} +} +@online{NIX, + title={Nix and NixOS}, + url={https://nixos.org} +} +@techreport{rfc6749, + series = {Request for Comments}, + number = 6749, + howpublished = {RFC 6749}, + publisher = {RFC Editor}, + doi = {10.17487/RFC6749}, + url = {https://www.rfc-editor.org/info/rfc6749}, + author = {Dick Hardt}, + title = {{The OAuth 2.0 Authorization Framework}}, + pagetotal = 76, + year = 2012, + month = oct, + abstract = {The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. {[}STANDARDS-TRACK{]}}, +} +@online{Fowler_TDD, + title={Bliki: Test driven development}, + url={https://martinfowler.com/bliki/TestDrivenDevelopment.html}, + journal={martinfowler.com}, + author={Fowler, Martin}, + date={2023-12-11} +} +@online{Fowler_TPyramid, + title={The Practical Test Pyramid}, + url={https://martinfowler.com/articles/practical-test-pyramid.html}, + journal={martinfowler.com}, + author={Fowler, Martin}, + date={2018-02-26} +} +@online{GNUTaler, + title={GNU Taler}, + url={https://taler.net/fr/} +} +@online{Fowler_GWT, + title={Given When Then}, + url={https://martinfowler.com/bliki/GivenWhenThen.html}, + journal={martinfowler.com}, + author={Fowler, Martin}, + date={2013-08-21} +} +@book{BLUEBOOK, + author = {Eric, Evans}, + title = {Domain-Driven Design: Tacking Complexity In the Heart of Software}, + year = {2003}, + isbn = {0321125215}, + publisher = {Addison-Wesley Longman Publishing Co., Inc.}, + address = {USA}, +} +@online{CleanArch, + title={The Clean Architecture}, + author={Martin, Robert C.}, + date={2012-08-13}, + journal={The Clean Code Blog by Uncle Bob} +} +@online{CHATGPT, url={https://chatgpt.com/}, title={ChatGPT: Get instant answers, find inspiration, learn something new}, version={3.5-turbo}} +@online{DeepLTranslate, url={https://www.deepl.com/translator}, title={DeepL Translate: The world’s most accurate translator}} +@online{DeepLWrite, url={https://www.deepl.com/write}, title={DeepL Write: AI-powered writing companion}} +@online{StableDiffusion, url={https://stablediffusion.fr/dalle}, title={Stable Diffusion • Free demo online}} +@online{PHC, url={https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md}, title={PHC string format}} +@online{Branca, url={https://branca.io/}, title={Authenticated and encrypted API tokens}} +\ No newline at end of file diff --git a/docs/thesis.ltx b/docs/thesis.ltx @@ -0,0 +1,170 @@ +\documentclass[ + a4paper, % paper format + %10.5pt, % font-size + %BCOR=18mm, % Binding correction + bibliography=totoc, % If enabled add bibliography to TOC + listof=totoc, % If enabled add lists to TOC + monolingual, + twoside=true, % two sided document (default: true) +]{bfhthesis} + +\LoadBFHModule{listings,terminal,boxes} +\tcbset{listing engine=listings} + +%--------------------------------------------------------------------------- +% Documents paths +%--------------------------------------------------------------------------- +\makeatletter +\def\input@path{{contents/}} +%or: \def\input@path{{/path/to/folder/}{/path/to/other/folder/}} +\makeatother + +%==================================================================================== +% PACKAGES +% +\usepackage{amsmath} % various features to facilitate writing math formulas +\usepackage{amsthm} % enhanced version of latex's newtheorem +\usepackage{amsfonts} % set of miscellaneous TeX fonts that augment the standard CM +\usepackage{amssymb} % mathematical special characters +\usepackage{siunitx} +\usepackage{graphicx} % integration of images +\usepackage{float} % floating objects +\usepackage{caption} % for captions of figures and tables +\usepackage{subcaption} % for subcaptions in subfigures +\usepackage{wrapfig} +\usepackage{exscale} % mathematical size corresponds to textsize +\usepackage{multirow} % multirow emables combining rows in tables +\usepackage{multicol} +\usepackage{longtable} +\usepackage{parskip} +\usepackage[inkscapeformat=png]{svg} + +%==================================================================================== +% FIGURES +% +\graphicspath{{figures/},{figures/old}} + +%--------------------------------------------------------------------------- +% Glossary Package +%--------------------------------------------------------------------------- +% the glossaries package uses makeindex +% if you use TeXnicCenter do the following steps: +% - Goto "Ausgabeprofile definieren" (ctrl + F7) +% - Select the profile "LaTeX => PDF" +% - Add in register "Nachbearbeitung" a new "Postprozessoren" point named Glossar +% - Select makeindex.exe in the field "Anwendung" ( ..\MiKTeX x.x\miktex\bin\makeindex.exe ) +% - Add this [ -s "%tm.ist" -t "%tmx.glg" -o "%tm.gls" "%tm.glo" ] in the field "Argumente" +% +% for futher informations go to http://ewus.de/tipp-1029.html +%--------------------------------------------------------------------------- +\usepackage[nonumberlist]{glossaries-extra} +\makeglossaries +\input{_glossary} + +%--------------------------------------------------------------------------- +% Makeindex Package +%--------------------------------------------------------------------------- +\usepackage{makeidx} +\makeindex +%\usepackage{imakeidx} % To produce index +%\makeindex[columns=2,intoc] % Index-Initialisation +%\makeindex[columns=3,columnseprule,columnsep,intoc] + +%--------------------------------------------------------------------------- +% Hyperref Package (Create links in a pdf) +%--------------------------------------------------------------------------- +\usepackage[ + ,bookmarks + ,plainpages=false + ,pdfpagelabels + ,pdfusetitle + ,backref = {false} % No index backreference + ,colorlinks = {true} % Color links in a PDF + ,hypertexnames = {true} % no failures "same page(i)" + ,bookmarksopen = {true} % opens the bar on the left side + ,bookmarksopenlevel = {0} % depth of opened bookmarks + ,linkcolor=. + ,filecolor=. + ,urlcolor=. + ,citecolor=. +]{hyperref} + +%==================================================================================== +% BIBLIOGRAPHY +% +\usepackage[style=numeric]{biblatex} +\addbibresource{references.bib} + +%==================================================================================== +% DOCUMENT CONTENTS +% +\begin{document} + +%------------ START FRONT PART ----------- +\frontmatter + +%==================================================================================== +% METADATA +% +\title{KYCID} +\titlegraphic{\includegraphics[height=\height]{wallpaper}} +\subtitle{An operational oauth2 integration of eKYC} +\author{M. Yann Mickael DOY} +\institution{Bern University of Applied Sciences} +\department{Technical and Information Technologie} +\advisor{Prof. Emmanuel BENOIST} +\expert{Daniel VOISARD} +\degreeprogram{Bachelor of Computer Sciences} +\setupSignature{Y. Doy={\includegraphics[width=.6\linewidth]{sigdoydy1}}} + +%---------------- BFH tile page ----------------------------------------- +\maketitle + +%------------ ABSTRACT ---------------- +\input{_abstract} + +%------------ TABLEOFCONTENTS ---------------- +\tableofcontents + +%------------ START MAIN PART ------------ +\input{_acknowledgement} + +\mainmatter + +\input{1.introduction} +\input{2.architecture} +\input{3.security} +\input{4.design} +\input{5.testing} +\input{6.results} +\input{7.conclusion} + +%----------- Bibliography ---------------- +\clearpage +\printbibliography + +%------------ List of Figures ------------ +\listoffigures + +%------------ List of Tables ------------- +\listoftables + +%------------ List of Listings ----------- +\lstlistoflistings + +%------------ Glossary ------------------- +\printglossary + +%------------ Index ---------------------- +\clearpage +\printindex + +%------------ Authorship declaration translated to main language ------------ +\declarationOfAuthorship + +%------------ Appendix ---------------- +\appendix + +\input{appendix-user-manual} + +\end{document} +\ No newline at end of file diff --git a/flake.lock b/flake.lock @@ -0,0 +1,26 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1716109138, + "narHash": "sha256-gkYWVbIRbuqvuNZs6yTAMLS6MGp9ONAn1XJd81hjZbk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "29645d1dada99c7ab79047c491f9aae985ec9497", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix @@ -0,0 +1,72 @@ +{ + description = "Yann Mickael DOY's Bachelor Thesis flake"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs"; + }; + + outputs = { self, nixpkgs }: + let + # Systems supported by this flake + systems = [ + "aarch64-darwin" + "aarch64-linux" + "x86_64-darwin" + "x86_64-linux" + ]; + + # Map function for all systems + forAll = function: + nixpkgs.lib.genAttrs systems (system: + function nixpkgs.legacyPackages.${system} self.packages.${system}); + in + { + # Nix Formatter + formatter = forAll (pkgs: selfpkgs: pkgs.nixpkgs-fmt); + + # Shells + devShells = forAll (pkgs: selfpkgs: { + default = pkgs.mkShell { + buildInputs = with selfpkgs; [ + deno + tesseract + mailcatcher + postgresql + bfhlatex + bfh-texlive + ]; + }; + }); + + # My Flake Packages + packages = forAll (pkgs: selfpkgs: { + # Dependencies + deno = pkgs.deno; + tesseract = pkgs.tesseract; + mailcatcher = pkgs.mailcatcher; + postgresql = pkgs.postgresql; + + # BFH Latex Distribution (texlive) + bfh-texlive = pkgs.texlive.combined.scheme-full.withPackages ( + ps: with ps; [ biblatex bfh-ci ] + ); + + # LaTeX Build Script + bfhlatex = + let + bash = pkgs.stdenv.shell; + pdflatex = "${self.packages.${pkgs.system}.bfh-texlive}/bin/pdflatex"; + makeglossaries = "${self.packages.${pkgs.system}.bfh-texlive}/bin/makeglossaries"; + biber = "${pkgs.biber}/bin/biber"; + in + pkgs.writeScriptBin "bfhlatex" '' + #!${bash} + mkdir -p build + ${pdflatex} -halt-on-error -output-directory build $1.ltx \ + && ${biber} build/$1 \ + && ${makeglossaries} -d build $1 \ + && ${pdflatex} -halt-on-error -output-directory build $1.ltx + ''; + }); + }; +} diff --git a/media/book.pdf b/media/book.pdf Binary files differ. diff --git a/media/demo.php b/media/demo.php @@ -0,0 +1,92 @@ +<?php + +session_start(); + +$client_id = "697aca40-17cd-46fc-afb4-74acddff8b01"; +$client_secret = "EEM9cycs4fmSwXKqd5PQdKdhDF69wdouh"; +$token_endpoint = "http://localhost/oauth2/token"; +$authorize_endpoint = "http://localhost/oauth2/authorize"; + +$code = $_GET["code"] ?? null; +$state = $_GET["state"] ?? null; +$process = []; +$info = null; + +if (!empty($code)) { + assert($_GET["state"] ?? '' === $_SESSION["state"] ?? ''); + unset($_SESSION["state"]); + $data = compact('client_id', 'client_secret', 'code'); + $options = [ + 'ssl' => [ + "verify_peer"=>false, + "verify_peer_name"=>false, + ], + 'http' => [ + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + 'method' => 'POST', + 'content' => http_build_query($data), + ], + ]; + $context = stream_context_create($options); + $result = @file_get_contents("http://localhost/oauth2/token", false, $context); + if ($result !== false) { + $parsed = json_decode($result, true); + $options = [ + 'ssl' => [ + "verify_peer"=>false, + "verify_peer_name"=>false, + ], + 'http' => [ + 'header' => "Authorization: Bearer {$parsed["access_token"]}\r\n", + 'method' => 'GET' + ], + ]; + $context = stream_context_create($options); + $result = @file_get_contents("http://localhost/oauth2/userinfo", false, $context); + if ($result !== false) { + $info = json_decode($result, true); + } else { + $info = $parsed; + } + } +} else { + $state = bin2hex(random_bytes(24)); + $_SESSION["state"] = $state; + $process = [ + "phone" => "http://localhost/oauth2/authorize?client_id={$client_id}&state={$state}&scope=email+phone-number", + "id-document" => "http://localhost/oauth2/authorize?client_id={$client_id}&state={$state}&scope=email+id-document", + "both" => "http://localhost/oauth2/authorize?client_id={$client_id}&state={$state}&scope=email+id-document+phone-number", + ]; +} + +?><!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Document</title> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"/> +</head> +<body class="container"> + <header></header> + <div style="max-width: 24em; margin-left: auto; margin-right: auto;"> + <article> + <header> + <h1>Demo</h1> + </header> + <?php if(empty($process)): ?> + <pre id="data"><code><?= json_encode($info, JSON_PRETTY_PRINT) ?></code></pre> + <div role="group"> + <a href="/" role="button">Reset</a> + </div> + <?php else: ?> + <?php foreach ($process as $demo => $url): ?> + <a role="button" href="<?= $url ?>"> + <?= ucfirst($demo) ?> + </a> + <?php endforeach; ?> + <?php endif; ?> + </article> + </div> +</body> +</html> +\ No newline at end of file diff --git a/media/poster.pdf b/media/poster.pdf Binary files differ. diff --git a/media/poster.pptx b/media/poster.pptx Binary files differ. diff --git a/media/presentation.pptx b/media/presentation.pptx Binary files differ. diff --git a/media/video.mp4 b/media/video.mp4 Binary files differ. diff --git a/media/video.pptx b/media/video.pptx Binary files differ. diff --git a/nessie.config.ts b/nessie.config.ts @@ -0,0 +1,16 @@ +import { + ClientPostgreSQL, + NessieConfig, +} from "https://deno.land/x/nessie@2.0.11/mod.ts"; + +/** Select one of the supported clients */ +const client = new ClientPostgreSQL(); + +/** This is the final config object */ +const config: NessieConfig = { + client, + migrationFolders: ["./src/infrastructure/postgres/migrations"], + seedFolders: ["./src/infrastructure/postgres/seeds"], +}; + +export default config; diff --git a/planning.xlsx b/planning.xlsx Binary files differ. diff --git a/src/core/application/authn/auth_repository.ts b/src/core/application/authn/auth_repository.ts @@ -0,0 +1,11 @@ +import { Auth } from "#core/domain/auth.ts"; +import { Email } from "#core/domain/email.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export interface AuthRepository { + find(uuid: UUID): Promise<Auth> | Auth; + findByEmail(email: Email): Promise<Auth> | Auth; + findBySessionToken(sessionToken: Token): Promise<Auth> | Auth; + store(auth: Auth): Promise<void> | void; +} diff --git a/src/core/application/authn/email_challenge.ts b/src/core/application/authn/email_challenge.ts @@ -0,0 +1,56 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { EntityNotFound } from "../repository_error.ts"; +import { AlreadyVerifiedCodeChallenge } from "#core/domain/code_challenge.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type AuthEmailChallengeRequest = { + uuid: string; +}; + +export type AuthEmailChallengeResponse = { + status: "sent" | "invalid" | "verified", + delay: number +} + +export interface AuthEmailChallengeMailer { + send(email: string, code: string): Promise<void> | void; +} + +export class AuthEmailChallengeUseCase { + constructor( + private readonly repo: AuthRepository, + private readonly mailer: AuthEmailChallengeMailer, + ) { + } + + async execute( + request: AuthEmailChallengeRequest, + ): Promise<AuthEmailChallengeResponse> { + try { + const uuid = new UUID(request.uuid); + const auth = await this.repo.find(uuid); + const code = auth.requestEmailChallenge(); + await this.repo.store(auth); + await this.mailer.send( + auth.email.address.toString(), + code.toString(), + ); + return { status: "sent", delay: auth.email.requestDelay }; + } catch (error) { + if (error instanceof ExceedingLimit) { + return { status: "sent", delay: error.delay }; + } + if ( + error instanceof InvalidUUID || + error instanceof EntityNotFound + ) { + return { status: "invalid", delay: 0 }; + } + if (error instanceof AlreadyVerifiedCodeChallenge) { + return { status: "verified", delay: 0 }; + } + throw error; + } + } +} diff --git a/src/core/application/authn/exists.ts b/src/core/application/authn/exists.ts @@ -0,0 +1,44 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { EntityNotFound } from "#core/application/repository_error.ts"; +import { Email, InvalidEmail } from "#core/domain/email.ts"; + +export type AuthExistsUseCaseRequest = { + email: string; +}; + +export type AuthExistsUseCaseResponse = { + status: "found" | "unknown" | "invalid"; + uuid: string | null; +}; + +export class AuthExistsUseCase { + constructor(readonly authRepo: AuthRepository) { + } + + async execute( + request: AuthExistsUseCaseRequest, + ): Promise<AuthExistsUseCaseResponse> { + try { + const email = new Email(request.email); + const auth = await this.authRepo.findByEmail(email); + return { + status: "found", + uuid: auth.id.toString(), + }; + } catch (error) { + if (error instanceof InvalidEmail) { + return { + status: "invalid", + uuid: null, + }; + } + if (error instanceof EntityNotFound) { + return { + status: "unknown", + uuid: null, + }; + } + throw error; + } + } +} diff --git a/src/core/application/authn/login.ts b/src/core/application/authn/login.ts @@ -0,0 +1,45 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; +import { PasswordMismatch } from "#core/domain/password.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type AuthLoginRequest = { + uuid: string; + password: string; +}; + +export type AuthLoginResponse = { + status: "loggedIn" | "invalid" | "blocked"; + delay: number; + sessionToken: string | null; +}; + +export class AuthLoginUseCase { + constructor(private readonly authRepo: AuthRepository) { + } + + async execute(request: AuthLoginRequest): Promise<AuthLoginResponse> { + try { + const uuid = new UUID(request.uuid); + const auth = await this.authRepo.find(uuid); + const sessionToken = auth.login(request.password).toString(); + await this.authRepo.store(auth); + return { + status: "loggedIn", + delay: 0, + sessionToken, + }; + } catch (error) { + if ( + error instanceof ExceedingLimit || error instanceof PasswordMismatch + ) { + return { + status: error instanceof PasswordMismatch ? "invalid" : "blocked", + delay: error.delay, + sessionToken: null, + }; + } + throw error; + } + } +} diff --git a/src/core/application/authn/logout.ts b/src/core/application/authn/logout.ts @@ -0,0 +1,29 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { ExpiredSessionToken } from "#core/domain/session_token.ts"; +import { InvalidToken, Token } from "#core/domain/token.ts"; + +export type AuthLogoutRequest = { + sessionToken: string; +}; + +export class AuthLogoutUseCase { + constructor(private readonly authRepo: AuthRepository) { + } + + async execute(request: AuthLogoutRequest): Promise<void> { + try { + const sessionToken = new Token(request.sessionToken); + const auth = await this.authRepo.findBySessionToken(sessionToken); + auth.logout(sessionToken); + await this.authRepo.store(auth); + } catch (error) { + if ( + error instanceof InvalidToken || + error instanceof ExpiredSessionToken + ) { + return; + } + throw error; + } + } +} diff --git a/src/core/application/authn/register.ts b/src/core/application/authn/register.ts @@ -0,0 +1,51 @@ +import { EntityLocked, Repository } from "../repository_error.ts"; +import { Auth } from "#core/domain/auth.ts"; +import { Email, InvalidEmail } from "#core/domain/email.ts"; +import { Password, PasswordMismatch } from "#core/domain/password.ts"; + +export type AuthRegisterRequest = { + email: string; + password: string; + passwordConfirmation: string; +}; + +export type AuthRegisterResponse = { + status: "registered" | "invalid" | "conflict"; + uuid: string | null; +}; + +export class AuthRegisterUseCase { + constructor(private readonly repo: Repository<Auth>) { + } + + async execute(request: AuthRegisterRequest): Promise<AuthRegisterResponse> { + try { + const email = new Email(request.email); + const password = Password.hash(request.password); + const auth = Auth.register( + email, + password, + request.passwordConfirmation, + ); + await this.repo.store(auth); + return { + status: "registered", + uuid: auth.id.toString(), + }; + } catch (error) { + if ( + error instanceof InvalidEmail || + error instanceof PasswordMismatch + ) { + return { + status: "invalid", + uuid: null, + }; + } + if (error instanceof EntityLocked) { + return { status: "conflict", uuid: null }; + } + throw error; + } + } +} diff --git a/src/core/application/authn/session.ts b/src/core/application/authn/session.ts @@ -0,0 +1,44 @@ +import { EntityLocked, EntityNotFound } from "../repository_error.ts"; + +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { ExpiredSessionToken } from "#core/domain/session_token.ts"; +import { InvalidToken, Token } from "#core/domain/token.ts"; + +export type AuthSessionRequest = { + sessionToken: string; +}; + +export type AuthSessionResponse = { + status: "authenticated" | "expired"; + uuid: string | null; +}; + +export class AuthSessionUseCase { + constructor( + private readonly repo: AuthRepository, + ) { + } + + async execute(request: AuthSessionRequest): Promise<AuthSessionResponse> { + try { + const sessionToken = new Token(request.sessionToken); + const auth = await this.repo.findBySessionToken(sessionToken); + auth.authenticate(sessionToken); + await this.repo.store(auth); + return { + status: "authenticated", + uuid: auth.id.toString(), + }; + } catch (error) { + if ( + error instanceof InvalidToken || + error instanceof ExpiredSessionToken || + error instanceof EntityNotFound || + error instanceof EntityLocked + ) { + return { status: "expired", uuid: null }; + } + throw error; + } + } +} diff --git a/src/core/application/authn/verify_email.ts b/src/core/application/authn/verify_email.ts @@ -0,0 +1,47 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { Code, InvalidCode } from "#core/domain/code.ts"; +import { InvalidCodeChallenge } from "#core/domain/code_challenge.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type AuthVerifyEmailRequest = { + uuid: string; + code: string; +}; + +export type AuthVerifyEmailResponse = { + status: "verified" | "blocked" | "invalid"; + delay: number; +}; + +export class AuthVerifyEmailUseCase { + constructor(private readonly authRepo: AuthRepository) { + } + + async execute( + request: AuthVerifyEmailRequest, + ): Promise<AuthVerifyEmailResponse> { + try { + const uuid = new UUID(request.uuid); + const code = new Code(request.code); + const auth = await this.authRepo.find(uuid); + try { + auth.verifyEmailChallenge(code); + } finally { + await this.authRepo.store(auth); + } + return { status: "verified", delay: 0 }; + } catch (error) { + if (error instanceof InvalidUUID || error instanceof InvalidCode) { + return { status: "invalid", delay: 0 }; + } + if (error instanceof InvalidCodeChallenge) { + return { status: "invalid", delay: error.delay }; + } + if (error instanceof ExceedingLimit) { + return { status: "blocked", delay: error.delay }; + } + throw error; + } + } +} diff --git a/src/core/application/customer_info.ts b/src/core/application/customer_info.ts @@ -0,0 +1,26 @@ +export type CustomerInfoRequest = { + uuid: string; +}; + +export type CustomerInfoResponse = { + exists: boolean; + uuid: string | null; + email: string | null; + emailVerified: boolean; + phoneNumber: string | null; + phoneNumberVerified: boolean; + firstName: string | null; + lastName: string | null; + birthDate: Date | null; + sex: string | null; + nationality: string | null; + country: string | null; + idDocumentVerified: boolean; + idDocumentRegistered: boolean; +}; + +export interface CustomerInfoUseCase { + execute( + request: CustomerInfoRequest, + ): Promise<CustomerInfoResponse> | CustomerInfoResponse; +} diff --git a/src/core/application/id_document/admin_repository.ts b/src/core/application/id_document/admin_repository.ts @@ -0,0 +1,6 @@ +import { Admin } from "#core/domain/admin.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export interface AdminRepository { + find(uuid: UUID): Promise<Admin> | Admin; +} diff --git a/src/core/application/id_document/approve.ts b/src/core/application/id_document/approve.ts @@ -0,0 +1,45 @@ +import { EntityLocked } from "#core/application/repository_error.ts"; + +import { AdminRepository } from "#core/application/id_document/admin_repository.ts"; +import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; +import { IDDocumentOutOfState } from "#core/domain/id_document.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type IDDocumentApproveRequest = { + uuid: string; + admin: string; +}; + +export type IDDocumentApproveResponse = { + status: "approved" | "invalid"; +}; + +export class IDDocumentApproveUseCase { + constructor( + private readonly adminRepo: AdminRepository, + private readonly idDocumentRepo: IDDocumentRepository, + ) {} + + async execute( + request: IDDocumentApproveRequest, + ): Promise<IDDocumentApproveResponse> { + try { + const adminUuid = new UUID(request.admin); + const idDocumentUuid = new UUID(request.uuid); + const admin = await this.adminRepo.find(adminUuid); + const idDocument = await this.idDocumentRepo.findOrCreate(idDocumentUuid); + idDocument.approve(admin); + await this.idDocumentRepo.store(idDocument); + return { status: "approved" }; + } catch (error) { + if ( + error instanceof IDDocumentOutOfState || + error instanceof InvalidUUID || + error instanceof EntityLocked + ) { + return { status: "invalid" }; + } + throw error; + } + } +} diff --git a/src/core/application/id_document/capture.ts b/src/core/application/id_document/capture.ts @@ -0,0 +1,74 @@ +import { EntityLocked } from "#core/application/repository_error.ts"; + +import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; +import { + IDDocumentMRZScan, + MRZInfo, +} from "#core/application/id_document/mrzscan.ts"; +import { IDDocumentOutOfState } from "#core/domain/id_document.ts"; +import { Picture } from "#core/domain/picture.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type IDDocumentCaptureRequest = { + uuid: string; + side: "doc-front" | "doc-back" | "face-left" | "face-front" | "face-right"; + picture: string; +}; + +export type IDDocumentCaptureResponse = { + status: "invalid" | "scanned" | "scan-failure" | "captured"; +} & MRZInfo; + +export class IDDocumentCaptureUseCase { + constructor( + private readonly idDocumentRepo: IDDocumentRepository, + private readonly scanner: IDDocumentMRZScan, + ) { + } + + async execute( + request: IDDocumentCaptureRequest, + ): Promise<IDDocumentCaptureResponse> { + let info: MRZInfo = { + firstName: null, + lastName: null, + birthDate: null, + sex: null, + nationality: null, + country: null, + }; + try { + const uuid = new UUID(request.uuid); + const picture = new Picture(request.picture); + const idDocument = await this.idDocumentRepo.findOrCreate(uuid); + + try { + if (request.side === "doc-back") { + info = await this.scanner.scan(picture.toString()); + } + } catch { + return { + status: "scan-failure", + ...info, + }; + } + + idDocument.capture(request.side, picture, info); + + await this.idDocumentRepo.store(idDocument); + return { + status: request.side === "doc-back" ? "scanned" : "captured", + ...info, + }; + } catch (error) { + if ( + error instanceof InvalidUUID || + error instanceof IDDocumentOutOfState || + error instanceof EntityLocked + ) { + return { status: "invalid", ...info }; + } + throw error; + } + } +} diff --git a/src/core/application/id_document/decline.ts b/src/core/application/id_document/decline.ts @@ -0,0 +1,42 @@ +import { EntityLocked } from "#core/application/repository_error.ts"; +import { AdminRepository } from "#core/application/id_document/admin_repository.ts"; +import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; +import { IDDocumentOutOfState } from "#core/domain/id_document.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type IDDocumentDeclineRequest = { + uuid: string; + admin: string; +}; + +export type IDDocumentDeclineResponse = { status: "invalid" | "declined" }; + +export class IDDocumentDeclineUseCase { + constructor( + private readonly adminRepo: AdminRepository, + private readonly idDocumentRepo: IDDocumentRepository, + ) {} + + async execute( + request: IDDocumentDeclineRequest, + ): Promise<IDDocumentDeclineResponse> { + try { + const adminUuid = new UUID(request.admin); + const idDocumentUuid = new UUID(request.uuid); + const admin = await this.adminRepo.find(adminUuid); + const idDocument = await this.idDocumentRepo.findOrCreate(idDocumentUuid); + idDocument.decline(admin); + await this.idDocumentRepo.store(idDocument); + return { status: "declined" }; + } catch (error) { + if ( + error instanceof InvalidUUID || + error instanceof IDDocumentOutOfState || + error instanceof EntityLocked + ) { + return { status: "invalid" }; + } + throw error; + } + } +} diff --git a/src/core/application/id_document/id_document_repository.ts b/src/core/application/id_document/id_document_repository.ts @@ -0,0 +1,7 @@ +import { UUID } from "#core/domain/uuid.ts"; +import { IDDocument } from "#core/domain/id_document.ts"; + +export interface IDDocumentRepository { + findOrCreate(uuid: UUID): Promise<IDDocument> | IDDocument; + store(idDocument: IDDocument): Promise<void> | void; +} diff --git a/src/core/application/id_document/is_admin.ts b/src/core/application/id_document/is_admin.ts @@ -0,0 +1,20 @@ +import { AdminRepository } from "#core/application/id_document/admin_repository.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type IsIDDocumentAdminRequest = { uuid: string } + + +export class IsIDDocumentAdminUseCase { + constructor(private readonly adminRepo: AdminRepository) { + } + + async execute(request: IsIDDocumentAdminRequest): Promise<boolean> { + try { + const uuid = new UUID(request.uuid) + await this.adminRepo.find(uuid); + return true; + } catch { + return false + } + } +} +\ No newline at end of file diff --git a/src/core/application/id_document/list.ts b/src/core/application/id_document/list.ts @@ -0,0 +1,21 @@ +import { MRZInfo } from "#core/application/id_document/mrzscan.ts"; + +export type IDDocumentListRequest = { + cursor?: number; +}; + +export type IDDocumentListResponse = { + next: number; + items: ({ + uuid: string; + docFront: string | null; + docBack: string | null; + faceLeft: string | null; + faceFront: string | null; + faceRight: string | null; + } & MRZInfo)[]; +}; + +export interface IDDocumentListUseCase { + execute(request: IDDocumentListRequest): Promise<IDDocumentListResponse>; +} diff --git a/src/core/application/id_document/mrzscan.ts b/src/core/application/id_document/mrzscan.ts @@ -0,0 +1,12 @@ +export type MRZInfo = { + firstName: string | null; + lastName: string | null; + birthDate: Date | null; + sex: string | null; + nationality: string | null; + country: string | null; +}; + +export interface IDDocumentMRZScan { + scan(image: string): Promise<MRZInfo>; +} diff --git a/src/core/application/oauth2/authorize.ts b/src/core/application/oauth2/authorize.ts @@ -0,0 +1,51 @@ +import { ClientRepository } from "#core/application/oauth2/client_repository.ts"; +import { EntityNotFound } from "#core/application/repository_error.ts"; +import { InvalidOAuth2Flow, OAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type OAuth2FlowAuthorizeRequest = { + clientId: string; + flowId: string; + resourceOwner: string; +}; + +export type OAuth2FlowAuthorizeResponse = { + authorized: boolean; + redirectUri: URL | null; +}; + +export class OAuth2FlowAuthorizeUseCase { + constructor( + private readonly clientRepo: ClientRepository, + private readonly flowRepo: Repository<OAuth2Flow>, + ) {} + + async execute( + request: OAuth2FlowAuthorizeRequest, + ): Promise<OAuth2FlowAuthorizeResponse> { + try { + const clientId = new UUID(request.clientId); + const resourceOwner = new UUID(request.resourceOwner); + const client = await this.clientRepo.find(clientId); + const flow = await this.flowRepo.find(request.flowId); + const redirectUri = client.authorize(flow, resourceOwner); + await this.flowRepo.store(flow); + return { + authorized: true, + redirectUri, + }; + } catch (error) { + if ( + error instanceof InvalidUUID || + error instanceof EntityNotFound || + error instanceof InvalidOAuth2Flow + ) { + return { + authorized: false, + redirectUri: null, + }; + } + throw error; + } + } +} diff --git a/src/core/application/oauth2/client_repository.ts b/src/core/application/oauth2/client_repository.ts @@ -0,0 +1,6 @@ +import { Client } from "#core/domain/client.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export interface ClientRepository { + find(id: UUID): Promise<Client> | Client; +} diff --git a/src/core/application/oauth2/flow_repository.ts b/src/core/application/oauth2/flow_repository.ts @@ -0,0 +1,9 @@ +import { OAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export interface OAuth2FlowRepository { + find(uuid: UUID): Promise<OAuth2Flow> | OAuth2Flow; + findByToken(token: Token): Promise<OAuth2Flow> | OAuth2Flow; + store(flow: OAuth2Flow): Promise<void> | void; +} diff --git a/src/core/application/oauth2/initiate.ts b/src/core/application/oauth2/initiate.ts @@ -0,0 +1,60 @@ +import { ClientRepository } from "#core/application/oauth2/client_repository.ts"; +import { OAuth2FlowRepository } from "#core/application/oauth2/flow_repository.ts"; +import { RateLimitRepository } from "#core/application/oauth2/ratelimit_repository.ts"; +import { InvalidOAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; +import { EntityLocked, EntityNotFound } from "../repository_error.ts"; + +export type OAuth2FlowInitiateRequest = { + clientId: string; + scope: string | null; + state: string | null; + ip: string; +}; + +export type OAuth2FlowInitiateResponse = { + initiated: boolean; + uuid: string | null; + scope: string[]; +}; + +export class OAuth2FlowInitiateUseCase { + constructor( + private readonly clientRepo: ClientRepository, + private readonly flowRepo: OAuth2FlowRepository, + private readonly rateLimitRepo: RateLimitRepository, + ) {} + + async execute( + request: OAuth2FlowInitiateRequest, + ): Promise<OAuth2FlowInitiateResponse> { + try { + const clientId = new UUID(request.clientId); + const client = await this.clientRepo.find(clientId); + const rateLimit = await this.rateLimitRepo.findOrCreate(request.ip); + rateLimit.increment(); + await this.rateLimitRepo.store(rateLimit); + const flow = client.inititate(request.scope, request.state); + await this.flowRepo.store(flow); + return { + initiated: true, + uuid: flow.id.toString(), + scope: flow.scope.values, + }; + } catch (error) { + if ( + error instanceof InvalidUUID || + error instanceof EntityNotFound || + error instanceof EntityLocked || + error instanceof InvalidOAuth2Flow + ) { + return { + initiated: false, + uuid: null, + scope: [], + }; + } + throw error; + } + } +} diff --git a/src/core/application/oauth2/ratelimit_repository.ts b/src/core/application/oauth2/ratelimit_repository.ts @@ -0,0 +1,6 @@ +import { RateLimit } from "#core/domain/rate_limit.ts"; + +export interface RateLimitRepository { + findOrCreate(uuid: string): Promise<RateLimit> | RateLimit; + store(rateLimit: RateLimit): Promise<void> | void; +} diff --git a/src/core/application/oauth2/token.ts b/src/core/application/oauth2/token.ts @@ -0,0 +1,70 @@ +import { ClientRepository } from "#core/application/oauth2/client_repository.ts"; +import { OAuth2FlowRepository } from "#core/application/oauth2/flow_repository.ts"; +import { EntityNotFound } from "../repository_error.ts"; +import { InvalidOAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { InvalidToken, Token } from "#core/domain/token.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type OAuth2FlowTokenRequest = { + clientId: string; + clientSecret: string; + code: string; +}; + +export type OAuth2FlowTokenResponse = { + status: "issued" | "invalid"; + accessToken: string | null; + scope: string | null; + expire: number; + state: string | null; +}; + +export class OAuth2FlowTokenUseCase { + constructor( + private readonly clientRepo: ClientRepository, + private readonly flowRepo: OAuth2FlowRepository, + ) {} + + async execute( + request: OAuth2FlowTokenRequest, + ): Promise<OAuth2FlowTokenResponse> { + try { + const clientId = new UUID(request.clientId); + const code = new Token(request.code); + const client = await this.clientRepo.find(clientId); + const flow = await this.flowRepo.findByToken(code); + try { + const accessToken = client.accessToken( + flow, + request.clientSecret, + request.code, + ); + return { + status: "issued", + accessToken: accessToken.toString(), + scope: flow.scope.toString(), + expire: flow.expire, + state: flow.state, + }; + } finally { + await this.flowRepo.store(flow); + } + } catch (error) { + if ( + error instanceof InvalidUUID || + error instanceof InvalidToken || + error instanceof EntityNotFound || + error instanceof InvalidOAuth2Flow + ) { + return { + status: "invalid", + accessToken: null, + scope: null, + expire: 0, + state: null, + }; + } + throw error; + } + } +} diff --git a/src/core/application/oauth2/user_info.ts b/src/core/application/oauth2/user_info.ts @@ -0,0 +1,95 @@ +import { CustomerInfoUseCase } from "#core/application/customer_info.ts"; +import { OAuth2FlowRepository } from "#core/application/oauth2/flow_repository.ts"; +import { InvalidOAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { InvalidToken, Token } from "#core/domain/token.ts"; +import { EntityNotFound } from "../repository_error.ts"; + +export type OAuth2FlowUserInfoRequest = { + accessToken: string; +}; + +export type OAuth2FlowUserInfoResponse = { + exists: boolean; + uuid: string | null; + email: string | null; + emailVerified: boolean; + phoneNumber: string | null; + phoneNumberVerified: boolean; + firstName: string | null; + lastName: string | null; + birthDate: Date | null; + sex: string | null; + nationality: string | null; + country: string | null; + idDocumentVerified: boolean; + idDocumentRegistered: boolean; +}; + +export class OAuth2FlowUserInfoUseCase { + constructor( + private readonly flowRepo: OAuth2FlowRepository, + private readonly customerInfo: CustomerInfoUseCase, + ) { + } + + async execute( + { accessToken }: OAuth2FlowUserInfoRequest, + ): Promise<OAuth2FlowUserInfoResponse> { + try { + const token = new Token(accessToken); + const flow = await this.flowRepo.findByToken(token); + flow.authenticate(token); + const uuid = flow.resourceOwner!; + const scope = flow.scope; + const { exists, ...info } = await this.customerInfo.execute({ + uuid: uuid.toString(), + }); + return { + exists, + uuid: info.uuid, + email: scope.contains("email") ? info.email : null, + emailVerified: scope.contains("email") ? info.emailVerified : false, + phoneNumber: scope.contains("phone-number") ? info.phoneNumber : null, + phoneNumberVerified: scope.contains("phone-number") + ? info.phoneNumberVerified + : false, + firstName: scope.contains("id-document") ? info.firstName : null, + lastName: scope.contains("id-document") ? info.lastName : null, + birthDate: scope.contains("id-document") ? info.birthDate : null, + sex: scope.contains("id-document") ? info.sex : null, + nationality: scope.contains("id-document") ? info.nationality : null, + country: scope.contains("id-document") ? info.country : null, + idDocumentVerified: scope.contains("id-document") + ? info.idDocumentVerified + : false, + idDocumentRegistered: scope.contains("id-document") + ? info.idDocumentRegistered + : false, + }; + } catch (error) { + if ( + error instanceof InvalidToken || + error instanceof EntityNotFound || + error instanceof InvalidOAuth2Flow + ) { + return { + exists: false, + uuid: null, + email: null, + emailVerified: false, + phoneNumber: null, + phoneNumberVerified: false, + firstName: null, + lastName: null, + birthDate: null, + sex: null, + nationality: null, + country: null, + idDocumentVerified: false, + idDocumentRegistered: false, + }; + } + throw error; + } + } +} diff --git a/src/core/application/oauth2/validate.ts b/src/core/application/oauth2/validate.ts @@ -0,0 +1,44 @@ +import { ClientRepository } from "./client_repository.ts"; +import { EntityNotFound } from "../repository_error.ts"; +import { Scope } from "#core/domain/scope.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type OAuth2FlowValidateRequest = { + clientId: string; + scope: string | null; +}; + +export type OAuth2FlowValidateResponse = { + valid: boolean; + scope: string[]; + description: string | null; +}; + +export class OAuth2FlowValidateUseCase { + constructor(private readonly clientRepo: ClientRepository) { + } + + async execute( + request: OAuth2FlowValidateRequest, + ): Promise<OAuth2FlowValidateResponse> { + try { + const clientId = new UUID(request.clientId); + const scope = Scope.of(request.scope); + const client = await this.clientRepo.find(clientId); + return { + valid: true, + scope: client.scope.intersect(scope).values, + description: client.description, + }; + } catch (error) { + if (error instanceof EntityNotFound) { + return { + valid: false, + scope: [], + description: null, + }; + } + throw error; + } + } +} diff --git a/src/core/application/phone/phone_repository.ts b/src/core/application/phone/phone_repository.ts @@ -0,0 +1,7 @@ +import { PhoneEKYC } from "#core/domain/phone_ekyc.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export interface PhoneRepository { + findOrCreate(uuid: UUID): Promise<PhoneEKYC> | PhoneEKYC; + store(phone: PhoneEKYC): Promise<void> | void; +} diff --git a/src/core/application/phone/register.ts b/src/core/application/phone/register.ts @@ -0,0 +1,65 @@ +import { PhoneRepository } from "#core/application/phone/phone_repository.ts"; +import { EntityLocked } from "#core/application/repository_error.ts"; +import { AlreadyVerifiedCodeChallenge } from "#core/domain/code_challenge.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; +import { + InvalidPersonalPhoneNumber, + PersonalPhoneNumber, +} from "#core/domain/personal_phone_number.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type PhoneRegisterRequest = { + uuid: string; + phoneNumber: string; +}; + +export type PhoneRegisterResponse = { + status: "sent" | "invalid" | "conflict" | "verified"; + delay: number; +}; + +export interface PhoneSmsChallengeSender { + send(phoneNumber: string, code: string): Promise<void> | void; +} + +export class PhoneRegisterUseCase { + constructor( + private readonly phoneRepo: PhoneRepository, + private readonly sender: PhoneSmsChallengeSender, + ) { + } + + async execute( + request: PhoneRegisterRequest, + ): Promise<PhoneRegisterResponse> { + try { + const uuid = new UUID(request.uuid); + const phoneNumber = new PersonalPhoneNumber(request.phoneNumber); + const phone = await this.phoneRepo.findOrCreate(uuid); + const code = phone.requestSmsChallenge(phoneNumber); + await this.phoneRepo.store(phone); + await this.sender.send( + phoneNumber.toString(), + code.toString(), + ); + return { + status: "sent", + delay: phone.smsChallenge.requestDelay, + }; + } catch (error) { + if (error instanceof AlreadyVerifiedCodeChallenge) { + return { status: "verified", delay: 0 }; + } + if (error instanceof InvalidPersonalPhoneNumber) { + return { status: "invalid", delay: 0 }; + } + if (error instanceof EntityLocked) { + return { status: "conflict", delay: 0 }; + } + if (error instanceof ExceedingLimit) { + return { status: "sent", delay: error.delay }; + } + throw error; + } + } +} diff --git a/src/core/application/phone/verify_sms.ts b/src/core/application/phone/verify_sms.ts @@ -0,0 +1,50 @@ +import { PhoneRepository } from "#core/application/phone/phone_repository.ts"; +import { Code, InvalidCode } from "#core/domain/code.ts"; +import { InvalidCodeChallenge } from "#core/domain/code_challenge.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; + +export type PhoneVerifySmsRequest = { + uuid: string; + code: string; +}; + +export type PhoneVerifySmsResponse = { + status: "verified" | "blocked" | "invalid"; + delay: number; +}; + +export class PhoneVerifySmsUseCase { + constructor(private readonly repo: PhoneRepository) { + } + + async execute( + request: PhoneVerifySmsRequest, + ): Promise<PhoneVerifySmsResponse> { + try { + const uuid = new UUID(request.uuid); + const code = new Code(request.code); + const phoneEKY = await this.repo.findOrCreate(uuid); + try { + phoneEKY.verifySmsChallenge(code); + } finally { + await this.repo.store(phoneEKY); + } + return { status: "verified", delay: 0 }; + } catch (error) { + if ( + error instanceof InvalidUUID || + error instanceof InvalidCode + ) { + return { status: "invalid", delay: 0 }; + } + if (error instanceof InvalidCodeChallenge) { + return { status: "invalid", delay: error.delay }; + } + if (error instanceof ExceedingLimit) { + return { status: "blocked", delay: error.delay }; + } + throw error; + } + } +} diff --git a/src/core/application/repository_error.ts b/src/core/application/repository_error.ts @@ -0,0 +1,17 @@ +export class RepositoryError extends Error { + constructor(message: string = "Repository error", options?: ErrorOptions) { + super(message, options); + } +} + +export class EntityNotFound extends RepositoryError { + constructor(readonly id: string, options?: ErrorOptions) { + super("Entity not found", options); + } +} + +export class EntityLocked extends RepositoryError { + constructor(options?: ErrorOptions) { + super("Entity optimistic locked", options); + } +} diff --git a/src/core/composer.ts b/src/core/composer.ts @@ -0,0 +1,31 @@ +export class RegistryComposer<TNeeds extends object = object> { + private readonly creators: CreateServices<TNeeds, object>[] = []; + + add<TServices extends object>( + createServices: CreateServices<TNeeds, TServices>, + ): RegistryComposer<Combine<TNeeds, TServices>> { + this.creators.push(createServices); + return this as never as RegistryComposer<Combine<TNeeds, TServices>>; + } + + compose(): Readonly<TNeeds> { + return Object.freeze( + this.creators.reduce((state, createServices) => { + return Object.assign(state, createServices(state)); + }, {} as TNeeds), + ); + } +} + +export type CreateServices<TNeeds, TServices extends object = object> = ( + needs: TNeeds, +) => TServices; + +type Combine<TSource extends object, TWith extends object> = Norm< + Omit<TSource, keyof TWith> & TWith +>; + +export type Norm<T> = T extends object ? { + [P in keyof T]: T[P]; + } + : never; diff --git a/src/core/domain/admin.ts b/src/core/domain/admin.ts @@ -0,0 +1,6 @@ +import { UUID } from "#core/domain/uuid.ts"; + +export class Admin { + constructor(readonly uuid: UUID) { + } +} diff --git a/src/core/domain/auth.ts b/src/core/domain/auth.ts @@ -0,0 +1,68 @@ +import { Code } from "#core/domain/code.ts"; +import { nonceUUID } from "#core/domain/crypto.ts"; +import { Email } from "#core/domain/email.ts"; +import { EmailChallenge } from "#core/domain/email_challenge.ts"; +import { Password } from "#core/domain/password.ts"; +import { + ExpiredSessionToken, + SessionToken, +} from "#core/domain/session_token.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { Logger } from "#core/domain/logger.ts"; + +export class Auth { + static register( + email: Email, + password: Password, + passwordConfirm: string, + ) { + password.attempt(passwordConfirm); + return new this( + nonceUUID(), + new EmailChallenge(email), + password, + ); + } + + constructor( + readonly id: UUID, + readonly email: EmailChallenge, + readonly password: Password, + private _session: SessionToken = SessionToken.none(), + public version: number = 0, + ) {} + + get session() { + return this._session; + } + + requestEmailChallenge() { + return this.email.requestChallenge(); + } + + verifyEmailChallenge(code: Code): void { + this.email.attemptChallenge(code); + } + + login(candidatePassword: string): Token { + this.email.assertVerified(); + this.password.attempt(candidatePassword); + this._session = SessionToken.issue(); + return this._session.valueOf()!; + } + + authenticate(token: Token): void { + this.email.assertVerified(); + if (!this._session.grant(token)) { + throw new ExpiredSessionToken(); + } + } + + logout(token: Token): void { + this.email.assertVerified(); + if (this._session.grant(token)) { + this._session = SessionToken.none(); + } + } +} diff --git a/src/core/domain/client.ts b/src/core/domain/client.ts @@ -0,0 +1,51 @@ +import { isSafeEqual, nonceUUID } from "#core/domain/crypto.ts"; +import { InvalidOAuth2Flow, OAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { Scope } from "#core/domain/scope.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export class Client { + constructor( + readonly id: UUID, + readonly secret: Token, + readonly redirectUri: URL, + readonly scope: Scope, + readonly description: string, + ) {} + + inititate(scope: string | null = null, state: string | null = null) { + return new OAuth2Flow( + nonceUUID(), + this.id, + this.scope.intersect(Scope.of(scope)), + state, + ); + } + + authorize(flow: OAuth2Flow, resourceOwner: UUID) { + if (!isSafeEqual(this.id, flow.clientId)) { + throw new InvalidOAuth2Flow(); + } + const code = flow.authorize(resourceOwner); + const url = new URL(this.redirectUri); + url.searchParams.set("code", code.toString()); + if (flow.state) { + url.searchParams.set("state", flow.state); + } + return url; + } + + accessToken( + flow: OAuth2Flow, + secret: string, + code: string, + ) { + if ( + !isSafeEqual(this.id, flow.clientId) || + !isSafeEqual(this.secret, secret) + ) { + throw new InvalidOAuth2Flow(); + } + return flow.accessToken(new Token(code)); + } +} diff --git a/src/core/domain/code.ts b/src/core/domain/code.ts @@ -0,0 +1,20 @@ +import { CODE_REGEX } from "#core/domain/constants.ts"; +import { DomainError } from "#core/domain/error.ts"; + +export class Code { + constructor(readonly value: string) { + if (!CODE_REGEX.test(value)) { + throw new InvalidCode(); + } + } + + toString() { + return this.value; + } +} + +export class InvalidCode extends DomainError { + constructor() { + super("Invalid code"); + } +} diff --git a/src/core/domain/code_challenge.ts b/src/core/domain/code_challenge.ts @@ -0,0 +1,94 @@ +import { Code } from "#core/domain/code.ts"; +import { isSafeEqual, nonceCode } from "#core/domain/crypto.ts"; +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { DomainError } from "#core/domain/error.ts"; +import { Limiter } from "#core/domain/limiter.ts"; + +export class CodeChallengeError extends DomainError { +} + +export class AlreadyVerifiedCodeChallenge extends CodeChallengeError { + constructor(options?: ErrorOptions) { + super("Code challenge already verified", options); + } +} + +export class InvalidCodeChallenge extends CodeChallengeError { + constructor(readonly delay: number, options?: ErrorOptions) { + super("Invalid code challenge", options); + } +} + +export class CodeChallenge { + constructor( + readonly TTL: number, + readonly REQUEST_LIMIT: number, + readonly ATTEMPT_LIMIT: number, + private _verified: boolean = false, + private _code: Ephemeral<Code> = Ephemeral.empty(), + private _request: Limiter = new Limiter(REQUEST_LIMIT, TTL), + private _attempt: Limiter = new Limiter(ATTEMPT_LIMIT, TTL), + ) {} + + get verified() { + return this._verified; + } + + get code() { + return this._code.valueOf(); + } + + get request() { + return this._request.count; + } + + get requestDelay() { + return this._request.delay; + } + + get attempt() { + return this._attempt.count; + } + + get attemptDelay() { + return this._attempt.delay; + } + + get codeExpire() { + return this._code.expire; + } + + get requestExpire() { + return this._request.expire; + } + + get attemptExpire() { + return this._attempt.expire; + } + + requestChallenge(): Code { + if (this.verified) { + throw new AlreadyVerifiedCodeChallenge(); + } + + this._request.increment(); + const code = nonceCode(); + this._code = Ephemeral.of(code, this.TTL); + this._attempt = new Limiter(this.ATTEMPT_LIMIT, this.TTL); + return code; + } + + attemptChallenge(candidate: Code): void { + if (this.verified) { + throw new AlreadyVerifiedCodeChallenge(); + } + this._attempt.increment(); + this._verified = isSafeEqual(this.code, candidate); + if (!this.verified) { + throw new InvalidCodeChallenge(this.attemptDelay); + } + this._code = Ephemeral.empty(); + this._request = new Limiter(this.REQUEST_LIMIT, this.TTL); + this._attempt = new Limiter(this.ATTEMPT_LIMIT, this.TTL); + } +} diff --git a/src/core/domain/constants.ts b/src/core/domain/constants.ts @@ -0,0 +1,54 @@ +import { MINUTE, SECOND } from "$std/datetime/constants.ts"; + +/** + * Email address + */ +export const EMAIL_REGEX = + /^(?=[^@]{1,64}@)([a-z0-9!#$%&\'*+\/=?^_`{|}~-]+\.?)+@(?=.{1,255}$)[a-z0-9-]+(\.[a-z0-9-]+)+$/i; + +/** + * Token + */ +export const TOKEN_BYTES = 24; +export const TOKEN_LENGTH_MIN = Math.floor(TOKEN_BYTES * 8 / Math.log2(58)); +export const TOKEN_LENGTH_MAX = Math.ceil(TOKEN_BYTES * 8 / Math.log2(58)); +export const TOKEN_REGEX = new RegExp( + `^[A-HJ-NP-Za-km-z1-9]{${TOKEN_LENGTH_MIN},${TOKEN_LENGTH_MAX}}$`, +); + +/** + * Password + */ +export const PASSWORD_ATTEMPT_LIMIT = 1; +export const PASSWORD_ATTEMPT_TTL = SECOND; + +/** + * Session Token + */ +export const SESSION_TOKEN_TTL = 30 * MINUTE; + +/** + * Access Token + */ +export const AUTH_CODE_TTL = 5 * MINUTE; +export const ACCESS_TOKEN_TTL = 30 * MINUTE; + +/** + * Code + */ +export const CODE_DIGITS = 6; +export const CODE_REGEX = new RegExp(`^[0-9]{${CODE_DIGITS}}$`); + +export const EMAIL_CHALLENGE_TTL = 5 * MINUTE; +export const EMAIL_CHALLENGE_REQUEST_LIMIT = 2; +export const EMAIL_CHALLENGE_ATTEMPT_LIMIT = 3; + +export const SMS_CHALLENGE_TTL = 5 * MINUTE; +export const SMS_CHALLENGE_REQUEST_LIMIT = 2; +export const SMS_CHALLENGE_ATTEMPT_LIMIT = 3; + +/** + * RateLimit + */ +export const RATE_LIMIT = 10; +export const RATE_LIMIT_TTL = 30 * MINUTE; diff --git a/src/core/domain/crypto.ts b/src/core/domain/crypto.ts @@ -0,0 +1,179 @@ +import { Code } from "#core/domain/code.ts"; +import { CODE_DIGITS, TOKEN_BYTES } from "#core/domain/constants.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { concat } from "$std/bytes/concat.ts"; +import { timingSafeEqual } from "$std/crypto/timing_safe_equal.ts"; +import { decodeBase58, encodeBase58 } from "$std/encoding/base58.ts"; +import { encodeBase64Url } from "$std/encoding/base64url.ts"; +import sodium from "libsodium-wrappers-sumo"; + +await sodium.ready; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +export class CryptoFailure extends Error { + constructor(options?: ErrorOptions) { + super("Crypto failure", options); + } +} + +/*************************************************** + * Constant time equal (Safe string compare) + */ + +export function isSafeEqual( + left: object | string | null | undefined, + right: object | string | null | undefined, +) { + return left !== null && + left !== undefined && + right !== null && + right !== undefined && + timingSafeEqual( + encoder.encode(left.toString()), + encoder.encode(right.toString()), + ); +} + +/*************************************************** + * Crypto-safe random generation + */ + +export function nonceUUID() { + return new UUID(crypto.randomUUID()); +} + +export function nonceToken(): Token { + return new Token( + encodeBase58(sodium.randombytes_buf(TOKEN_BYTES)), + ); +} + +export function nonceCode() { + return new Code( + new Array(CODE_DIGITS) + .fill(null) + .map(() => sodium.randombytes_uniform(10)) + .join(""), + ); +} + +/*************************************************** + * PKCE + */ +export async function isCodeVerifier( + challenge: object | string | null, + verifier: string | null, +): Promise<boolean> { + if (challenge === null && verifier === null) { + return true; + } + const digest = await crypto.subtle.digest( + "SHA-256", + encoder.encode(verifier ?? ""), + ); + return isSafeEqual(challenge, encodeBase64Url(digest)); +} + +/*************************************************** + * Password Hashing + */ + +const OPSLIMIT = sodium.crypto_pwhash_OPSLIMIT_INTERACTIVE; +const MEMLIMIT = sodium.crypto_pwhash_MEMLIMIT_INTERACTIVE; + +export class PasswordHash { + static hash(candidate: string) { + try { + return new PasswordHash( + sodium.crypto_pwhash_str(candidate, OPSLIMIT, MEMLIMIT), + ); + } catch (cause) { + throw new CryptoFailure({ cause }); + } + } + + constructor(private value: string) { + } + + verify(candidate: string) { + try { + if (!sodium.crypto_pwhash_str_verify(this.value, candidate)) { + return false; + } + if ( + sodium.crypto_pwhash_str_needs_rehash(this.value, OPSLIMIT, MEMLIMIT) + ) { + this.value = sodium.crypto_pwhash_str(candidate, OPSLIMIT, MEMLIMIT); + } + return true; + } catch (cause) { + throw new CryptoFailure({ cause }); + } + } + + toString() { + return this.value; + } +} + +/*************************************************** + * Encryption (AEAD) + */ + +const AEAD_SECRET_BYTES = sodium.crypto_aead_xchacha20poly1305_ietf_KEYBYTES; +const AEAD_NONCE_BYTES = sodium.crypto_aead_xchacha20poly1305_IETF_NPUBBYTES; + +export class AEAD { + readonly secret: Uint8Array; + + constructor(secret?: Uint8Array) { + try { + this.secret = secret ?? sodium.randombytes_buf(AEAD_SECRET_BYTES); + } catch (cause) { + throw new CryptoFailure({ cause }); + } + } + + encrypt( + message: string, + additional: string | Uint8Array | null = null, + ): string { + try { + const nonce = sodium.randombytes_buf(AEAD_NONCE_BYTES); + return encodeBase58(concat([ + nonce, + sodium.crypto_aead_xchacha20poly1305_ietf_encrypt( + message, + additional, + nonce, + nonce, + this.secret, + ), + ])); + } catch (cause) { + throw new CryptoFailure({ cause }); + } + } + + decrypt( + message: string, + additional: string | Uint8Array | null = null, + ): string { + try { + const bytes = decodeBase58(message); + const nonce = bytes.slice(0, AEAD_NONCE_BYTES); + return decoder.decode(sodium.crypto_aead_xchacha20poly1305_ietf_decrypt( + nonce, + bytes.slice(AEAD_NONCE_BYTES), + additional, + nonce, + this.secret, + )); + } catch (cause) { + throw new CryptoFailure({ cause }); + } + } +} diff --git a/src/core/domain/email.ts b/src/core/domain/email.ts @@ -0,0 +1,20 @@ +import { EMAIL_REGEX } from "#core/domain/constants.ts"; +import { DomainError } from "#core/domain/error.ts"; + +export class Email { + constructor(readonly value: string) { + if (!EMAIL_REGEX.test(value)) { + throw new InvalidEmail(value); + } + } + + toString() { + return this.value; + } +} + +export class InvalidEmail extends DomainError { + constructor(readonly candidate: string) { + super("Invalid email"); + } +} diff --git a/src/core/domain/email_challenge.ts b/src/core/domain/email_challenge.ts @@ -0,0 +1,56 @@ +import { Code } from "#core/domain/code.ts"; +import { CodeChallenge } from "#core/domain/code_challenge.ts"; +import { + EMAIL_CHALLENGE_ATTEMPT_LIMIT, + EMAIL_CHALLENGE_REQUEST_LIMIT, + EMAIL_CHALLENGE_TTL, +} from "#core/domain/constants.ts"; +import { Email } from "#core/domain/email.ts"; +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { DomainError } from "#core/domain/error.ts"; +import { Limiter } from "#core/domain/limiter.ts"; + +export class EmailChallenge extends CodeChallenge { + constructor( + readonly address: Email, + verified?: boolean, + code?: Code, + codeExpire?: number, + request?: number, + requestExpire?: number, + attempt?: number, + attemptExpire?: number, + ) { + super( + EMAIL_CHALLENGE_TTL, + EMAIL_CHALLENGE_REQUEST_LIMIT, + EMAIL_CHALLENGE_ATTEMPT_LIMIT, + verified, + new Ephemeral(code, codeExpire), + new Limiter( + EMAIL_CHALLENGE_REQUEST_LIMIT, + EMAIL_CHALLENGE_TTL, + request, + requestExpire, + ), + new Limiter( + EMAIL_CHALLENGE_ATTEMPT_LIMIT, + EMAIL_CHALLENGE_TTL, + attempt, + attemptExpire, + ), + ); + } + + public assertVerified() { + if (!this.verified) { + throw new UnverifiedEmail(); + } + } +} + +export class UnverifiedEmail extends DomainError { + constructor(options?: ErrorOptions) { + super("Unverified email", options); + } +} diff --git a/src/core/domain/ephemeral.ts b/src/core/domain/ephemeral.ts @@ -0,0 +1,33 @@ +export class Ephemeral<T> { + static of<T>(value: NonNullable<T>, ttl: number): Ephemeral<NonNullable<T>> { + return new this(value, Date.now() + ttl); + } + + static empty(): Ephemeral<never> { + return new this(); + } + + constructor( + private readonly value: T | null = null, + public readonly expire: number = 0, + ) { + } + + get ttl(): number { + return Math.max(this.expire - Date.now(), 0); + } + + get isExpired(): boolean { + return this.value === null || + this.value === undefined || + this.ttl === 0; + } + + orElse<U = T>(value: U): T | U { + return !this.isExpired ? this.value! : value; + } + + valueOf() { + return this.orElse(null); + } +} diff --git a/src/core/domain/error.ts b/src/core/domain/error.ts @@ -0,0 +1,5 @@ +export class DomainError extends Error { + constructor(message: string = "Domain error", options?: ErrorOptions) { + super(message, options); + } +} diff --git a/src/core/domain/id_document.ts b/src/core/domain/id_document.ts @@ -0,0 +1,134 @@ +import { MRZInfo } from "#core/application/id_document/mrzscan.ts"; +import { Admin } from "#core/domain/admin.ts"; +import { DomainError } from "#core/domain/error.ts"; +import { Picture } from "#core/domain/picture.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export enum IDDocumentState { + CAPTURING, + REGISTERED, + APPROVED, + DECLINED, +} + +export class IDDocument { + constructor( + readonly uuid: UUID, + private _state: IDDocumentState = IDDocumentState.CAPTURING, + private _info: MRZInfo | null = null, + private _front: Picture | null = null, + private _back: Picture | null = null, + private _faceLeft: Picture | null = null, + private _faceFront: Picture | null = null, + private _faceRight: Picture | null = null, + private _admin: Admin | null = null, + public version: number = 0, + ) {} + + get front() { + return this._front; + } + + get back() { + return this._back; + } + + get faceLeft() { + return this._faceLeft; + } + + get faceFront() { + return this._faceFront; + } + + get faceRight() { + return this._faceRight; + } + + get info() { + return this._info; + } + + get admin() { + return this._admin; + } + + get state() { + return this._state; + } + + capture( + caption: + | "doc-back" + | "doc-front" + | "face-left" + | "face-front" + | "face-right", + picture: Picture, + info: MRZInfo | null = null, + ) { + if (this.state === IDDocumentState.DECLINED) { + this._state = IDDocumentState.CAPTURING; + } + + if (this.state !== IDDocumentState.CAPTURING) { + throw new IDDocumentOutOfState(); + } + + switch (caption) { + case "doc-front": + this._front = picture; + break; + + case "doc-back": + this._back = picture; + this._info = info; + break; + + case "face-left": + this._faceLeft = picture; + break; + + case "face-front": + this._faceFront = picture; + break; + + case "face-right": + this._faceRight = picture; + break; + } + + if ( + this.info !== null && + this.back !== null && + this.front !== null && + this.faceLeft !== null && + this.faceFront !== null && + this.faceRight !== null + ) { + this._state = IDDocumentState.REGISTERED; + } + } + + approve(admin: Admin) { + if (this.state !== IDDocumentState.REGISTERED) { + throw new IDDocumentOutOfState(); + } + this._state = IDDocumentState.APPROVED; + this._admin = admin; + } + + decline(admin: Admin) { + if (this.state !== IDDocumentState.REGISTERED) { + throw new IDDocumentOutOfState(); + } + this._state = IDDocumentState.DECLINED; + this._admin = admin; + } +} + +export class IDDocumentOutOfState extends DomainError { + constructor() { + super("Out of state capturing"); + } +} diff --git a/src/core/domain/id_info.ts b/src/core/domain/id_info.ts @@ -0,0 +1,11 @@ +export class IDInfo { + constructor( + readonly firstName: string, + readonly lastName: string, + readonly birthDate: Date, + readonly sex: string, + readonly nationality: string, + readonly country: string, + ) { + } +} diff --git a/src/core/domain/limiter.ts b/src/core/domain/limiter.ts @@ -0,0 +1,49 @@ +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { DomainError } from "#core/domain/error.ts"; + +export class ExceedingLimit extends DomainError { + constructor(readonly delay: number) { + super(`Exceeding limit`); + } +} + +export class Limiter { + private _counter: Ephemeral<number>; + + constructor( + readonly limit: number, + readonly ttl: number, + count: number = 0, + expire: number = 0, + ) { + this._counter = new Ephemeral(count, expire); + } + + get count(): number { + return this._counter.orElse(0); + } + + get expire(): number { + return this._counter.expire; + } + + get delay() { + if (this.remaining > 0) return 0; + return this._counter.ttl; + } + + get remaining(): number { + return Math.max(this.limit - this.count, 0); + } + + increment(): void { + if (this.remaining === 0) { + throw new ExceedingLimit(this.delay); + } + const ttl = this._counter.ttl; + this._counter = Ephemeral.of( + this.count + 1, + ttl > 0 ? ttl : this.ttl, + ); + } +} diff --git a/src/core/domain/logger.ts b/src/core/domain/logger.ts @@ -0,0 +1,22 @@ +export class Logger { + constructor(readonly context: Record<string, unknown> = {}) { + } + + /** + * Log event + * + * @param message + * @param context + */ + write(message: unknown, context: Record<string, unknown> = {}): void { + if (!(message instanceof Error)) { + console.log(message, { ...this.context, ...context }); + return; + } + + console.group("Exception:"); + console.log("Context:", { ...this.context, ...context }); + console.error(message); + console.groupEnd(); + } +} diff --git a/src/core/domain/oauth2flow.ts b/src/core/domain/oauth2flow.ts @@ -0,0 +1,83 @@ +import { UUID } from "#core/domain/uuid.ts"; +import { Token } from "#core/domain/token.ts"; +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { Scope } from "#core/domain/scope.ts"; +import { DomainError } from "#core/domain/error.ts"; +import { + isCodeVerifier, + isSafeEqual, + nonceToken, +} from "#core/domain/crypto.ts"; +import { ACCESS_TOKEN_TTL, AUTH_CODE_TTL } from "#core/domain/constants.ts"; + +export class OAuth2Flow { + constructor( + readonly id: UUID, + readonly clientId: UUID, + readonly scope: Scope, + readonly state: string | null = null, + private _resourceOwner: UUID | null = null, + private _token: Ephemeral<Token> = Ephemeral.empty(), + public version: number = 0, + ) {} + + get resourceOwner() { + return this._resourceOwner; + } + + get token() { + return this._token.valueOf(); + } + + get expire() { + return this._token.expire; + } + + get done() { + return this.version >= 3; + } + + authorize(resourceOwner: UUID) { + if ( + this.done || + this.resourceOwner !== null || + !this._token.isExpired + ) { + throw new InvalidOAuth2Flow(); + } + + this._resourceOwner = resourceOwner; + this._token = Ephemeral.of(nonceToken(), AUTH_CODE_TTL); + return this.token!; + } + + accessToken(code: Token) { + if ( + this.done || + this.resourceOwner === null || + this._token.isExpired || + !isSafeEqual(this.token, code) + ) { + throw new InvalidOAuth2Flow(); + } + + this._token = Ephemeral.of(nonceToken(), ACCESS_TOKEN_TTL); + return this.token!; + } + + authenticate(accessToken: Token): void { + console.log(this, accessToken) + if ( + !this.done || !isSafeEqual(this.token, accessToken) || + this.resourceOwner === null + ) { + throw new InvalidOAuth2Flow(); + } + } +} + +export class InvalidOAuth2Flow extends DomainError { + constructor() { + super("Invalid OAuth2 flow"); + } +} diff --git a/src/core/domain/password.ts b/src/core/domain/password.ts @@ -0,0 +1,53 @@ +import { + PASSWORD_ATTEMPT_LIMIT, + PASSWORD_ATTEMPT_TTL, +} from "#core/domain/constants.ts"; +import { PasswordHash } from "#core/domain/crypto.ts"; +import { DomainError } from "#core/domain/error.ts"; +import { Limiter } from "#core/domain/limiter.ts"; + +export class PasswordMismatch extends DomainError { + constructor(readonly delay: number) { + super("Password mismatched"); + } +} + +export class Password { + private _attemptLimit: Limiter; + + static hash(candidate: string): Password { + return new Password(PasswordHash.hash(candidate)); + } + + constructor( + readonly hash: PasswordHash, + attemptCount?: number, + attemptExpire?: number, + ) { + this._attemptLimit = new Limiter( + PASSWORD_ATTEMPT_LIMIT, + PASSWORD_ATTEMPT_TTL, + attemptCount, + attemptExpire, + ); + } + + get attemptCount() { + return this._attemptLimit.count; + } + + get attemptExpire() { + return this._attemptLimit.expire; + } + + attempt(candidate: string): void { + this._attemptLimit.increment(); + if (!this.verify(candidate)) { + throw new PasswordMismatch(this._attemptLimit.delay); + } + } + + verify(candidate: string): boolean { + return this.hash.verify(candidate); + } +} diff --git a/src/core/domain/personal_phone_number.ts b/src/core/domain/personal_phone_number.ts @@ -0,0 +1,40 @@ +import { assert } from "$std/assert/assert.ts"; +import libphone from "google-libphonenumber"; +import { DomainError } from "#core/domain/error.ts"; +const { PhoneNumberUtil, PhoneNumberType: Type, PhoneNumberFormat: Format } = + libphone; + +const phoneUtil = PhoneNumberUtil.getInstance(); +const ACCEPTED_TYPE = [ + Type.MOBILE, + Type.PERSONAL_NUMBER, +]; + +export class PersonalPhoneNumber { + readonly value: string; + + constructor(value: string) { + try { + const number = phoneUtil.parse(value, "ch"); + assert( + phoneUtil.isValidNumberForRegion(number, "ch"), + "only swiss phone", + ); + const type = phoneUtil.getNumberType(number); + assert(ACCEPTED_TYPE.includes(type), "only personal phone"); + this.value = phoneUtil.format(number, Format.INTERNATIONAL); + } catch (cause) { + throw new InvalidPersonalPhoneNumber({ cause }); + } + } + + toString() { + return this.value; + } +} + +export class InvalidPersonalPhoneNumber extends DomainError { + constructor(options: ErrorOptions) { + super("Invalid personal phone number", options); + } +} diff --git a/src/core/domain/phone_ekyc.ts b/src/core/domain/phone_ekyc.ts @@ -0,0 +1,30 @@ +import { Code } from "#core/domain/code.ts"; +import { PersonalPhoneNumber } from "#core/domain/personal_phone_number.ts"; +import { SmsChallenge } from "#core/domain/sms_challenge.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export class PhoneEKYC { + constructor( + readonly id: UUID, + private _phoneNumber: PersonalPhoneNumber | null = null, + private _smsChallenge: SmsChallenge = new SmsChallenge(), + public version: number = 0, + ) {} + + get phoneNumber() { + return this._phoneNumber; + } + + get smsChallenge() { + return this._smsChallenge; + } + + requestSmsChallenge(phoneNumber: PersonalPhoneNumber) { + this._phoneNumber = phoneNumber; + return this.smsChallenge.requestChallenge(); + } + + verifySmsChallenge(code: Code) { + this.smsChallenge.attemptChallenge(code); + } +} diff --git a/src/core/domain/picture.ts b/src/core/domain/picture.ts @@ -0,0 +1,22 @@ +import { DomainError } from "#core/domain/error.ts"; + +const MAX_SIZE = 524_288; /** 500kb */ +const BASE64PNG_PREFIX = "data:image/png;base64,iVBORw0KGg"; + +export class Picture { + constructor(readonly value: string) { + if (!value.startsWith(BASE64PNG_PREFIX) || value.length > MAX_SIZE) { + throw new InvalidPicture(); + } + } + + toString() { + return this.value; + } +} + +export class InvalidPicture extends DomainError { + constructor(options?: ErrorOptions) { + super("Invalid PNG Image", options); + } +} diff --git a/src/core/domain/rate_limit.ts b/src/core/domain/rate_limit.ts @@ -0,0 +1,15 @@ +import { Limiter } from "#core/domain/limiter.ts"; +import { RATE_LIMIT, RATE_LIMIT_TTL } from "#core/domain/constants.ts"; + +export class RateLimit { + constructor( + readonly key: string, + readonly limiter: Limiter = new Limiter(RATE_LIMIT, RATE_LIMIT_TTL), + public version: number = 0, + ) { + } + + increment() { + this.limiter.increment(); + } +} diff --git a/src/core/domain/scope.ts b/src/core/domain/scope.ts @@ -0,0 +1,34 @@ +export class Scope { + static readonly ALL = ["email", "phone-number", "id-document"]; + + static of(scope: string | null) { + return new this( + new Set( + scope !== null + ? scope.split(" ") + .map((i) => i.trim()) + .filter((i) => Scope.ALL.includes(i)) + : Scope.ALL, + ), + ); + } + + private constructor(private _values: Set<string>) { + } + + intersect(scopes: Scope) { + return new Scope(new Set(this.values.filter((i) => scopes.contains(i)))); + } + + contains(scope: string) { + return this._values.has(scope); + } + + get values() { + return Array.from(this._values.values()); + } + + toString() { + return this.values.join(" "); + } +} diff --git a/src/core/domain/session_token.ts b/src/core/domain/session_token.ts @@ -0,0 +1,31 @@ +import { SESSION_TOKEN_TTL } from "#core/domain/constants.ts"; +import { isSafeEqual, nonceToken } from "#core/domain/crypto.ts"; +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { Token } from "#core/domain/token.ts"; +import { DomainError } from "#core/domain/error.ts"; + +export class SessionToken extends Ephemeral<Token> { + static none() { + return new this(); + } + + static issue() { + return new this( + nonceToken(), + Date.now() + SESSION_TOKEN_TTL, + ); + } + + grant(candidate: Token) { + return isSafeEqual( + this.valueOf(), + candidate, + ); + } +} + +export class ExpiredSessionToken extends DomainError { + constructor(options?: ErrorOptions) { + super("Expired session token", options); + } +} diff --git a/src/core/domain/sms_challenge.ts b/src/core/domain/sms_challenge.ts @@ -0,0 +1,41 @@ +import { Code } from "#core/domain/code.ts"; +import { CodeChallenge } from "#core/domain/code_challenge.ts"; +import { + SMS_CHALLENGE_ATTEMPT_LIMIT, + SMS_CHALLENGE_REQUEST_LIMIT, + SMS_CHALLENGE_TTL, +} from "#core/domain/constants.ts"; +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { Limiter } from "#core/domain/limiter.ts"; + +export class SmsChallenge extends CodeChallenge { + constructor( + verified?: boolean, + code?: Code, + codeExpire?: number, + request?: number, + requestExpire?: number, + attempt?: number, + attemptExpire?: number, + ) { + super( + SMS_CHALLENGE_TTL, + SMS_CHALLENGE_REQUEST_LIMIT, + SMS_CHALLENGE_ATTEMPT_LIMIT, + verified, + new Ephemeral(code, codeExpire), + new Limiter( + SMS_CHALLENGE_REQUEST_LIMIT, + SMS_CHALLENGE_TTL, + request, + requestExpire, + ), + new Limiter( + SMS_CHALLENGE_ATTEMPT_LIMIT, + SMS_CHALLENGE_TTL, + attempt, + attemptExpire, + ), + ); + } +} diff --git a/src/core/domain/tests/code_challenge.test.ts b/src/core/domain/tests/code_challenge.test.ts @@ -0,0 +1,101 @@ +import { CodeChallenge } from "#core/domain/code_challenge.ts"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { MINUTE } from "$std/datetime/constants.ts"; +import { afterAll, beforeEach, describe, it } from "$std/testing/bdd.ts"; +import { FakeTime } from "$std/testing/time.ts"; +import { assertInstanceOf } from "$std/assert/assert_instance_of.ts"; +import { Code } from "#core/domain/code.ts"; +import { nonceCode } from "#core/domain/crypto.ts"; +import { assertThrows } from "$std/assert/assert_throws.ts"; +import { InvalidCodeChallenge } from "#core/domain/code_challenge.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; + +describe("unit code_challenge test", () => { + let clock: FakeTime; + let challenge: CodeChallenge; + + beforeEach(() => { + clock = new FakeTime(); + challenge = new CodeChallenge(15 * MINUTE, 2, 3); + }); + + afterAll(() => { + clock.restore(); + }); + + it("shoud be unverified by default", () => { + assertEquals(challenge.verified, false); + }); + + it("should be requestable", () => { + const act = challenge.requestChallenge(); + assertInstanceOf(act, Code); + }); + + it("random code shouldn't be valid attempt", () => { + const act = () => challenge.attemptChallenge(nonceCode()); + assertThrows(act, InvalidCodeChallenge); + assertEquals(challenge.verified, false); + }); + + it("code should be null", () => { + assertEquals(challenge.code, null); + }); + + it("requested code should be valid attempt", () => { + const code = challenge.requestChallenge(); + challenge.attemptChallenge(code); + assertEquals(challenge.verified, true); + }); + + it("random code shouldn't be valid even if code requested", () => { + challenge.requestChallenge(); + const act = () => challenge.attemptChallenge(nonceCode()); + assertThrows(act, InvalidCodeChallenge); + assertEquals(challenge.verified, false); + }); + + describe("request", () => { + beforeEach(() => { + challenge.requestChallenge(); + }); + + it("should be request 2 times", () => { + const code = challenge.requestChallenge(); + assertInstanceOf(code, Code); + }); + + it("2nd code should be valid attempt", () => { + const code = challenge.requestChallenge(); + challenge.attemptChallenge(code); + assertEquals(challenge.verified, true); + }); + + it("3rd code should be requestable", () => { + challenge.requestChallenge(); + const act = () => challenge.requestChallenge(); + assertThrows(act, ExceedingLimit); + }); + + it("3rd code should be requestable after delay expiration", () => { + challenge.requestChallenge(); + clock.tick(15 * MINUTE); + const code = challenge.requestChallenge(); + assertInstanceOf(code, Code); + }); + }); + + describe("attempt", () => { + let code: Code; + beforeEach(() => { + code = challenge.requestChallenge(); + }); + + it("should be verify after 1 mistake", () => { + const act = () => challenge.attemptChallenge(nonceCode()); + assertThrows(act, InvalidCodeChallenge); + challenge.attemptChallenge(code); + assertEquals(challenge.verified, true); + }); + }); +}); diff --git a/src/core/domain/tests/crypto.test.ts b/src/core/domain/tests/crypto.test.ts @@ -0,0 +1,90 @@ +import { AEAD, PasswordHash } from "#core/domain/crypto.ts"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { assertThrows } from "$std/assert/assert_throws.ts"; +import * as fc from "fast-check"; +import { encodeBase58 } from "$std/encoding/base58.ts"; + +Deno.test({ + name: "unit password hash should verify password", + fn() { + fc.assert( + fc.property( + fc.string(), + (candidate) => PasswordHash.hash(candidate).verify(candidate), + ), + { numRuns: 5 }, + ); + }, +}); + +Deno.test({ + name: "unit password hash should not verify any other string", + fn() { + fc.assert( + fc.property(fc.string(), fc.string(), (a, b) => { + fc.pre(a !== b); + return !PasswordHash.hash(a).verify(b); + }), + { numRuns: 5 }, + ); + }, +}); + +Deno.test({ + name: "unit encryption should decrypt its encrypted value", + fn() { + const aead = new AEAD(); + fc.assert(fc.property(fc.string(), (value) => { + const act = aead.decrypt(aead.encrypt(value)); + assertEquals(act, value); + })); + }, +}); + +Deno.test({ + name: "unit encryption shouldn't parse any value", + fn() { + const aead = new AEAD(); + fc.assert(fc.property(fc.string(), (value) => { + const act = () => aead.decrypt(encodeBase58(value)); + assertThrows(act); + })); + }, +}); + +Deno.test({ + name: "unit encryption shouldn't parse same value in different context", + fn() { + const aead = new AEAD(); + fc.assert( + fc.property( + fc.string(), + fc.string(), + fc.string(), + (value, contextA, contextB) => { + fc.pre(contextA !== contextB); + const act = () => + aead.decrypt(aead.encrypt(value, contextA), contextB); + assertThrows(act); + }, + ), + ); + }, +}); + +Deno.test({ + name: "unit encryption should parse same value in same context", + fn() { + const aead = new AEAD(); + fc.assert( + fc.property( + fc.string(), + fc.string(), + (value, context) => { + const act = aead.decrypt(aead.encrypt(value, context), context); + assertEquals(act, value); + }, + ), + ); + }, +}); diff --git a/src/core/domain/tests/email.test.ts b/src/core/domain/tests/email.test.ts @@ -0,0 +1,44 @@ +import { assertThrows } from "$std/assert/assert_throws.ts"; +import { Email, InvalidEmail } from "#core/domain/email.ts"; + +const INVALID_EMAILS = [ + "", + " ", + "welcome", + " doydy1@bfh.ch", + "\t", + "hello👍@gmail.com", +]; + +const VALID_EMAILS = [ + "doydy1@bfh.ch", + "yannmickael.doy@students.bfh.ch", + "simple@example.com", + "very.common@example.com", + "abc@example.co.uk", + "disposable.style.email.with+symbol@example.com", + "other.email-with-hyphen@example.com", + "fully-qualified-domain@example.com", + "user.name+tag+sorting@example.com", + "example-indeed@strange-example.com", +]; + +Deno.test({ + name: `unit email valid should be accepted`, + fn() { + for (const candidate of VALID_EMAILS) { + const act = () => new Email(candidate); + act(); + } + }, +}); + +Deno.test({ + name: `unit email invalid shouldn't be accepted`, + fn() { + for (const candidate of INVALID_EMAILS) { + const act = () => new Email(candidate); + assertThrows(act, InvalidEmail); + } + }, +}); diff --git a/src/core/domain/tests/ephemeral.test.ts b/src/core/domain/tests/ephemeral.test.ts @@ -0,0 +1,62 @@ +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { assert } from "$std/assert/assert.ts"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { assertFalse } from "$std/assert/assert_false.ts"; +import { FakeTime } from "$std/testing/time.ts"; +import * as fc from "fast-check"; + +Deno.test({ + name: "unit ephemeral shouldn't out of date before ttl", + fn() { + fc.assert(fc.property(fc.integer({ min: 10 }), (ttl) => { + const expire = Ephemeral.of("hello world", ttl); + assertFalse(expire.isExpired); + })); + }, +}); + +Deno.test({ + name: "unit ephemeral get back value if not expired", + fn() { + fc.assert( + fc.property(fc.integer({ min: 10 }), fc.string(), (ttl, value) => { + const expire = Ephemeral.of(value, ttl); + assertEquals(expire.valueOf(), value); + }), + ); + }, +}); + +Deno.test({ + name: "unit ephemeral should out of date after ttl", + fn() { + fc.assert(fc.property(fc.integer({ min: 10 }), (ttl) => { + const clock = new FakeTime(); + try { + const expire = Ephemeral.of("whatever", ttl); + clock.tick((ttl + 1) * 1000); + assert(expire.isExpired); + } finally { + clock.restore(); + } + })); + }, +}); + +Deno.test({ + name: "unit ephemeral should out of date after ttl", + fn() { + fc.assert( + fc.property(fc.integer({ min: 10 }), fc.string(), (ttl, value) => { + const clock = new FakeTime(); + try { + const expire = Ephemeral.of(value, ttl); + clock.tick((ttl + 1) * 1000); + assertEquals(expire.valueOf(), null); + } finally { + clock.restore(); + } + }), + ); + }, +}); diff --git a/src/core/domain/tests/limiter.test.ts b/src/core/domain/tests/limiter.test.ts @@ -0,0 +1,58 @@ +import { assertThrows } from "$std/assert/assert_throws.ts"; +import { SECOND } from "$std/datetime/constants.ts"; +import { FakeTime } from "$std/testing/time.ts"; +import { ExceedingLimit, Limiter } from "#core/domain/limiter.ts"; + +Deno.test({ + name: "unit limiter should accept initial operation", + fn() { + const limiter = new Limiter(1, SECOND); + const act = () => limiter.increment(); + act(); + }, +}); + +Deno.test({ + name: "unit limiter should deny overrated operation", + fn() { + const limiter = new Limiter(1, SECOND); + limiter.increment(); + const act = () => limiter.increment(); + assertThrows(act, ExceedingLimit); + }, +}); + +Deno.test({ + name: "unit limiter should not deny operation after reset", + fn() { + const clock = new FakeTime(); + try { + const limiter = new Limiter(2, SECOND); + const act = () => { + limiter.increment(); + limiter.increment(); + clock.tick(SECOND); + limiter.increment(); + }; + act(); // assert not failed + } finally { + clock.restore(); + } + }, +}); + +Deno.test({ + name: "unit limiter should deny operation before reset", + fn() { + const clock = new FakeTime(); + try { + const limiter = new Limiter(1, SECOND); + limiter.increment(); + clock.tick(500); + const act = () => limiter.increment(); + assertThrows(act, ExceedingLimit); + } finally { + clock.restore(); + } + }, +}); diff --git a/src/core/domain/tests/personal_phone_number.test.ts b/src/core/domain/tests/personal_phone_number.test.ts @@ -0,0 +1,38 @@ +import { + InvalidPersonalPhoneNumber, + PersonalPhoneNumber, +} from "#core/domain/personal_phone_number.ts"; +import { assertThrows } from "$std/assert/assert_throws.ts"; +import { ValitaError } from "$valita"; + +Deno.test({ + name: "unit personal phone number. shared cost case", + fn() { + const act = () => new PersonalPhoneNumber("08407263232"); + assertThrows(act, InvalidPersonalPhoneNumber); + }, +}); + +Deno.test({ + name: "unit personal phone number. shared cost case", + fn() { + const act = () => new PersonalPhoneNumber("00338427262332"); + assertThrows(act, InvalidPersonalPhoneNumber); + }, +}); + +Deno.test({ + name: "unit personal phone number. shared cost case", + fn() { + const act = () => new PersonalPhoneNumber("+338427262332"); + assertThrows(act, InvalidPersonalPhoneNumber); + }, +}); + +Deno.test({ + name: "unit personal phone number. normal phone number", + fn() { + const act = () => new PersonalPhoneNumber("+41789444444"); + act(); + }, +}); diff --git a/src/core/domain/token.ts b/src/core/domain/token.ts @@ -0,0 +1,20 @@ +import { TOKEN_REGEX } from "#core/domain/constants.ts"; +import { DomainError } from "#core/domain/error.ts"; + +export class Token { + constructor(readonly value: string) { + if (!TOKEN_REGEX.test(value)) { + throw new InvalidToken(value); + } + } + + toString() { + return this.value; + } +} + +export class InvalidToken extends DomainError { + constructor(readonly candidate: string) { + super("Invalid token"); + } +} diff --git a/src/core/domain/uuid.ts b/src/core/domain/uuid.ts @@ -0,0 +1,20 @@ +import { DomainError } from "#core/domain/error.ts"; +import { validate } from "$std/uuid/v4.ts"; + +export class UUID { + constructor(readonly value: string) { + if (!validate(value)) { + throw new InvalidUUID(value); + } + } + + toString() { + return this.value; + } +} + +export class InvalidUUID extends DomainError { + constructor(readonly candidate: string) { + super("Invalid UUID"); + } +} diff --git a/src/core/factory.ts b/src/core/factory.ts @@ -0,0 +1,103 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { + AuthEmailChallengeMailer, + AuthEmailChallengeUseCase, +} from "#core/application/authn/email_challenge.ts"; +import { AuthExistsUseCase } from "#core/application/authn/exists.ts"; +import { AuthLoginUseCase } from "#core/application/authn/login.ts"; +import { AuthLogoutUseCase } from "#core/application/authn/logout.ts"; +import { AuthRegisterUseCase } from "#core/application/authn/register.ts"; +import { AuthSessionUseCase } from "#core/application/authn/session.ts"; +import { AuthVerifyEmailUseCase } from "#core/application/authn/verify_email.ts"; +import { CustomerInfoUseCase } from "#core/application/customer_info.ts"; +import { AdminRepository } from "#core/application/id_document/admin_repository.ts"; +import { IDDocumentApproveUseCase } from "#core/application/id_document/approve.ts"; +import { IDDocumentCaptureUseCase } from "#core/application/id_document/capture.ts"; +import { IDDocumentDeclineUseCase } from "#core/application/id_document/decline.ts"; +import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; +import { IDDocumentListUseCase } from "#core/application/id_document/list.ts"; +import { IDDocumentMRZScan } from "#core/application/id_document/mrzscan.ts"; +import { OAuth2FlowAuthorizeUseCase } from "#core/application/oauth2/authorize.ts"; +import { ClientRepository } from "#core/application/oauth2/client_repository.ts"; +import { OAuth2FlowRepository } from "#core/application/oauth2/flow_repository.ts"; +import { OAuth2FlowInitiateUseCase } from "#core/application/oauth2/initiate.ts"; +import { RateLimitRepository } from "#core/application/oauth2/ratelimit_repository.ts"; +import { OAuth2FlowTokenUseCase } from "#core/application/oauth2/token.ts"; +import { OAuth2FlowUserInfoUseCase } from "#core/application/oauth2/user_info.ts"; +import { OAuth2FlowValidateUseCase } from "#core/application/oauth2/validate.ts"; +import { PhoneRepository } from "#core/application/phone/phone_repository.ts"; +import { + PhoneRegisterUseCase, + PhoneSmsChallengeSender, +} from "#core/application/phone/register.ts"; +import { PhoneVerifySmsUseCase } from "#core/application/phone/verify_sms.ts"; +import { IsIDDocumentAdminUseCase } from "#core/application/id_document/is_admin.ts"; + +export type AuthnDependencies = { + customerInfo: CustomerInfoUseCase; + authRepo: AuthRepository; + authEmailChallengeMailer: AuthEmailChallengeMailer; + phoneRepo: PhoneRepository; + phoneSmsChallengeSender: PhoneSmsChallengeSender; + clientRepo: ClientRepository; + flowRepo: OAuth2FlowRepository; + rateLimitRepo: RateLimitRepository; + idDocumentRepo: IDDocumentRepository; + idDocumentMRZScan: IDDocumentMRZScan; + idDocumentList: IDDocumentListUseCase; + adminRepo: AdminRepository; +}; + +export function createUseCases(dependencies: AuthnDependencies) { + const { + authRepo, + authEmailChallengeMailer, + phoneRepo, + phoneSmsChallengeSender, + clientRepo, + flowRepo, + idDocumentRepo, + idDocumentMRZScan, + rateLimitRepo, + adminRepo, + customerInfo, + } = dependencies; + + return { + authExists: new AuthExistsUseCase(authRepo), + authRegister: new AuthRegisterUseCase(authRepo), + authEmailChallenge: new AuthEmailChallengeUseCase( + authRepo, + authEmailChallengeMailer, + ), + authVerifyEmail: new AuthVerifyEmailUseCase(authRepo), + authLogin: new AuthLoginUseCase(authRepo), + authSession: new AuthSessionUseCase(authRepo), + authLogout: new AuthLogoutUseCase(authRepo), + + phoneRegister: new PhoneRegisterUseCase( + phoneRepo, + phoneSmsChallengeSender, + ), + + phoneVerifySms: new PhoneVerifySmsUseCase(phoneRepo), + + idDocumentCapture: new IDDocumentCaptureUseCase( + idDocumentRepo, + idDocumentMRZScan, + ), + idDocumentApprove: new IDDocumentApproveUseCase(adminRepo, idDocumentRepo), + idDocumentDecline: new IDDocumentDeclineUseCase(adminRepo, idDocumentRepo), + isIdDocumentAdmin: new IsIDDocumentAdminUseCase(adminRepo), + + oauth2Validate: new OAuth2FlowValidateUseCase(clientRepo), + oauth2Initiate: new OAuth2FlowInitiateUseCase( + clientRepo, + flowRepo, + rateLimitRepo, + ), + oauth2Authorize: new OAuth2FlowAuthorizeUseCase(clientRepo, flowRepo), + oauth2Token: new OAuth2FlowTokenUseCase(clientRepo, flowRepo), + oauth2UserInfo: new OAuth2FlowUserInfoUseCase(flowRepo, customerInfo), + }; +} diff --git a/src/http/.gitignore b/src/http/.gitignore @@ -0,0 +1,11 @@ +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# Fresh build directory +_fresh/ +# npm dependencies +node_modules/ diff --git a/src/http/README.md b/src/http/README.md @@ -0,0 +1,16 @@ +# Fresh project + +Your new Fresh project is ready to go. You can follow the Fresh "Getting +Started" guide here: https://fresh.deno.dev/docs/getting-started + +### Usage + +Make sure to install Deno: https://deno.land/manual/getting_started/installation + +Then start the project: + +``` +deno task start +``` + +This will watch the project directory and restart as necessary. diff --git a/src/http/app.ts b/src/http/app.ts @@ -0,0 +1,19 @@ +import { RegistryComposer } from "#core/composer.ts"; +import { createUseCases } from "#core/factory.ts"; +import { createEnvironment } from "#infrastructure/boot/environment.ts"; +import { createMailer } from "#infrastructure/boot/mailer.ts"; +import { createPersistance } from "#infrastructure/boot/persistance.ts"; +import { createSMSSender } from "#infrastructure/boot/sms.ts"; +import "$dotenv"; +import { createConfig } from "#infrastructure/config/factory.ts"; +import { createTesseractIDDocumentMRZScan } from "#infrastructure/tesseract/factory.ts"; + +export const app = new RegistryComposer() + .add(createEnvironment) + .add(createPersistance) + .add(createMailer) + .add(createSMSSender) + .add(createConfig) + .add(createTesseractIDDocumentMRZScan) + .add(createUseCases) + .compose(); diff --git a/src/http/ca-cert.dev.pem b/src/http/ca-cert.dev.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDojCCAooCCQDxBmfkYHgRqzANBgkqhkiG9w0BAQsFADCBkTELMAkGA1UEBhMC +Q0gxCzAJBgNVBAgMAkJFMRQwEgYDVQQHDAtCaWVsL0JpZW5uZTEeMBwGA1UECgwV +QmVybmVyIEZhY2hob2Noc2NodWxlMQswCQYDVQQLDAJUSTEUMBIGA1UEAwwLa3lj +aWQubG9jYWwxHDAaBgkqhkiG9w0BCQEWDWRveWR5MUBiZmguY2gwIBcNMjQwNTE2 +MTUxMDEwWhgPMjI5ODAzMDExNTEwMTBaMIGRMQswCQYDVQQGEwJDSDELMAkGA1UE +CAwCQkUxFDASBgNVBAcMC0JpZWwvQmllbm5lMR4wHAYDVQQKDBVCZXJuZXIgRmFj +aGhvY2hzY2h1bGUxCzAJBgNVBAsMAlRJMRQwEgYDVQQDDAtreWNpZC5sb2NhbDEc +MBoGCSqGSIb3DQEJARYNZG95ZHkxQGJmaC5jaDCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAKT/+12HM6/V68PAalkapjJOMwBAyUBGkVLcJ3cLu1rBTVIQ +CY03gO/cOxlsVs6yR2GTLTZYG39UikvNaPx80tXIn8KpWufEN5XUXN4b6E8fHeLs +g8eUn//gm8vsNpLMzwnWBGyWWemF5/OZ3bh18Ox50PBsRmxaEvfaGvDuiOh7EJN/ +3GDEMw0uE28aBc58VrxDPChfq8ZJS0gG5JVtKMlR9o747xmVykq+FM778UoqawRj +UrJ1QD5FLVCtptN9bAdJa5z+yUWUjF2EuGWXwMUNR/+aac2jm9lxqy4ByTfqomRw +BGPjqsBA9CdiMFF1uqrqctxLFy6dhXHNTgu7rpkCAwEAATANBgkqhkiG9w0BAQsF +AAOCAQEAQ8/jcqLRcaqAsnDhDIQ6mMicEQ9JPh06QlclA01aV++N+LcbPGwOGXP+ +hgfz1QoUC6J4Ad9wfjFYVtfmj5LjeYiVcOa7w81G2cSsS1ItlnbEvuYt2BuaYuZA +7yrIzyUuWc/le1EBCBw/PyzXJDK6WCq1A7CvXkeW6r3eheMTJZ52d2XQMeNqFB+0 +BmT7TY8bdAaPDrolDYiyJeT0JaNigjUYR22yIss+HGhPw+he+Z707cELFUxRB9Pi +2c7xRuHd7/VGn4Qhev/LhWRcWxkz5SGfZrDxYK6j5RlmaQGc8OPcKDqOWLBnpXm3 +GpWdyiIlSmPOceD7VHVyXrLiHKXNpg== +-----END CERTIFICATE----- diff --git a/src/http/ca-key.dev.pem b/src/http/ca-key.dev.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEApP/7XYczr9Xrw8BqWRqmMk4zAEDJQEaRUtwndwu7WsFNUhAJ +jTeA79w7GWxWzrJHYZMtNlgbf1SKS81o/HzS1cifwqla58Q3ldRc3hvoTx8d4uyD +x5Sf/+Cby+w2kszPCdYEbJZZ6YXn85nduHXw7HnQ8GxGbFoS99oa8O6I6HsQk3/c +YMQzDS4TbxoFznxWvEM8KF+rxklLSAbklW0oyVH2jvjvGZXKSr4UzvvxSiprBGNS +snVAPkUtUK2m031sB0lrnP7JRZSMXYS4ZZfAxQ1H/5ppzaOb2XGrLgHJN+qiZHAE +Y+OqwED0J2IwUXW6qupy3EsXLp2Fcc1OC7uumQIDAQABAoIBAEv9lN/7T6Owyxdp +e9Ezw80xVK3OKKHQnkdiG07peU0P77NWrX97S4esjw9jZQtm8hcPOGhp5agb4GGO +5cY7GsLY1jNJ2hMZvFvl5StqAPDHrPUA5qQ5YALxh+9AB9ZOOyAVkA4OpLQ3Np9r +gsDcmKvgYokH5NssFMZPjc7enPEsVux+OLVubFtIWg6k7eTXCKrOBv/Jop9Eet1z +7Mkr1iliJ72UQ9+q3gJMiGr6DDWh4KHzzTplPAUxPDyaESIsSN9YNY9b4WYuxu8N +riSlweF6Ab0dQq2VjKVoC8Kx9pyREtJKncSwL2oZJUOqklXFuDq3TlT6sSYejhqo +agfkMgECgYEA149FeBPIYpdUVvH3N4ZJW63DFDKJwbp9TvzTKSjsw6AOYFDNsjky +9s7dyGHMz0AUU9lhjMTgj0W1VLbTVxo3kDWxrUXzZ6yhcjNIMpjmkVwJhLLfLeQu +aoRl/qjHVV42HX5JubDigSSMtt1cTgxZ4ah2cnxlUCESdIFgx5Ngf0ECgYEAw/R3 +0oFJ3R4NMPVHIunRChZfxmgTyuCF2Z8e6pBQZR3uDrNibqN7XblYnvCLCbeGlGRH +io4iLYCp9REM8LgmVzZNcg9p5MpNcnoPW0L4BN1S4shKkPd51rLAvNMBxHamuYqL +bQNgZJy+F4oGyGxyKjVsSGXcJDDfIBgN1LXUMVkCgYB1GyzOc1Dl3vi+021PCPFJ +kTjt/BbC3KG/C7NcJRObo5Sr1ropHNIHK5NpjVhLL7DbbLmGVF769w/wGfLu2xtc +iQ8h52K47Bw5goqykkaQqcOyB8sfj1t4Gr2ef+rrAee8ViOPcf1b05NutQu0ixk5 +cuAGinYv9gekq7T8N6CxAQKBgFsn44G6gTjqnOpUf8YfDQ5rQByVF/f9oGaPHhuy +DKQtWyvdiQG87Uu5SB+P+K4JgQKQ77Ll0cJnIykMyH9GuxdA/J/9yZ4T+hkx7Ojg +a24f40n6MK3lYfldaEmuwxi4tXCEob2Rn4rOW6OpouQjhqxZ88huEg2H6pQMfIqi +F1bpAoGAMn0ClSDdZ7iMfpIeBb5xiXQ7i8h2lZ2t6kN6JmitMrEAZ6mXUi/Xudjj +s+kL8NeHwhCg+bSU/C+WhSX8Wg7xoFVs/WAh2rqshLOFEOTXSMN9q3LIA7J+B71c +OOrUzv+iWK4Nf2wVGga39ik0R28tasp/V1CWhAjzyet4XHgdmcw= +-----END RSA PRIVATE KEY----- diff --git a/src/http/dev.ts b/src/http/dev.ts @@ -0,0 +1,7 @@ +#!/usr/bin/env -S deno run -A --watch=static/,routes/ + +import "$dotenv"; +import dev from "$fresh/dev.ts"; +import config from "#http/fresh.config.ts"; + +await dev(import.meta.url, "./main.ts", config); diff --git a/src/http/form.ts b/src/http/form.ts @@ -0,0 +1,128 @@ +import { AuthSessionUseCase } from "#core/application/authn/session.ts"; +import { AEAD } from "#core/domain/crypto.ts"; +import { deleteCookie, getCookies, setCookie } from "$std/http/cookie.ts"; +import * as V from "$valita"; + +const aead = new AEAD(); + +export interface FormContexts { + "/connect": { back: Link }; + "/register/email": { email: string; back: Link }; + "/verify/email": { uuid: string; back: Link }; + "/login": { uuid: string; back: Link }; + "/logout": { back: Link }; + "/register/phone": { back: Link; conflict?: true }; + "/verify/sms": { phoneNumber: string; back: Link }; + "/register/id-document": { + side: "doc-front" | "doc-back" | "face-left" | "face-front" | "face-right"; + back: Link; + }; + "/verify/id-document": { cursor: number }; + "/oauth2/callback": { flowId: string; clientId: string }; +} + +export type Link = + | string + | { + [K in keyof FormContexts]: { form: K; context: FormContexts[K] }; + }[keyof FormContexts]; + +export class Forms { + constructor( + readonly base: URL, + readonly session: { + token: string; + uuid: string; + } | null, + ) {} + + static async parse(request: Request, authenticate: AuthSessionUseCase) { + const url = new URL(request.url); + const cookies = getCookies(request.headers); + if (!("session" in cookies)) { + return new this(url, null); + } + + const sessionToken = cookies.session; + const result = await authenticate.execute({ sessionToken }); + + if (result.status === "expired") { + return new this(url, null); + } + + return new this(url, { + token: sessionToken, + uuid: result.uuid!, + }); + } + + link(link: Link, session: string | boolean = true) { + if (typeof link === "string") { + return new URL(link, this.base); + } + + const url = new URL(link.form, this.base); + url.searchParams.set( + "state", + aead.encrypt( + JSON.stringify(link.context), + `${link.form}#${ + session + ? (typeof session === "string" + ? session + : (this.session?.token ?? "")) + : "" + }`, + ), + ); + return url; + } + + redirect(link: Link) { + return Response.redirect(this.link(link), 303); + } + + redirectWithSession(link: Link, sessionToken: string) { + const url = this.link(link, sessionToken); + const headers = new Headers(); + headers.set("location", url.href); + setCookie(headers, { + name: "session", + value: sessionToken, + path: "/", + httpOnly: true, + sameSite: "Lax", + }); + return new Response(null, { headers, status: 303 }); + } + + redirectWithoutSession(link: Link) { + const url = this.link(link); + const headers = new Headers(); + headers.set("location", url.href); + deleteCookie(headers, "session", { path: "/" }); + return new Response(null, { headers, status: 303 }); + } + + context<F extends keyof FormContexts>(form: F): FormContexts[F] | null { + try { + return JSON.parse(aead.decrypt( + `${this.base.searchParams.get("state") ?? ""}`, + `${form}#${this.session?.token ?? ""}`, + )) as FormContexts[F]; + } catch { + return null; + } + } + + async inputs<T>(request: Request, type: V.Type<T>) { + const formData = await request.formData(); + return type.parse( + Object.fromEntries( + Array.from(formData.entries()) + .map(([k, v]) => [k, `${v}`]), + ), + { mode: "strip" }, + ); + } +} diff --git a/src/http/fresh.config.ts b/src/http/fresh.config.ts @@ -0,0 +1,22 @@ +import { app } from "#http/app.ts"; +import { defineConfig } from "$fresh/src/server/defines.ts"; + +const { environment } = app; + +export default defineConfig({ + server: { + hostname: environment.HTTPS_HOST, + port: environment.HTTPS_PORT, + cert: environment.HTTPS_CERT, + key: environment.HTTPS_KEY, + + onListen(address) { + console.log(`Listen on ${address.hostname}:${address.port}`); + }, + + onError(error) { + console.error(error); + throw error; + }, + }, +}); diff --git a/src/http/fresh.gen.ts b/src/http/fresh.gen.ts @@ -0,0 +1,70 @@ +// DO NOT EDIT. This file is generated by Fresh. +// This file SHOULD be checked into source version control. +// This file is automatically updated during development when running `dev.ts`. + +import * as $_admin_verify_id_document from "./routes/(admin)/verify/id-document.tsx"; +import * as $_customer_layout from "./routes/(customer)/_layout.tsx"; +import * as $_customer_connect from "./routes/(customer)/connect.tsx"; +import * as $_customer_login from "./routes/(customer)/login.tsx"; +import * as $_customer_logout from "./routes/(customer)/logout.tsx"; +import * as $_customer_register_email from "./routes/(customer)/register/email.tsx"; +import * as $_customer_register_id_document from "./routes/(customer)/register/id-document.tsx"; +import * as $_customer_register_phone from "./routes/(customer)/register/phone.tsx"; +import * as $_customer_verify_email from "./routes/(customer)/verify/email.tsx"; +import * as $_customer_verify_id_document from "./routes/(customer)/verify/id-document.tsx"; +import * as $_customer_verify_sms from "./routes/(customer)/verify/sms.tsx"; +import * as $_404 from "./routes/_404.tsx"; +import * as $_500 from "./routes/_500.tsx"; +import * as $_app from "./routes/_app.tsx"; +import * as $_layout from "./routes/_layout.tsx"; +import * as $_middleware from "./routes/_middleware.ts"; +import * as $index from "./routes/index.tsx"; +import * as $oauth2_authorize from "./routes/oauth2/authorize.tsx"; +import * as $oauth2_callback from "./routes/oauth2/callback.tsx"; +import * as $oauth2_token from "./routes/oauth2/token.tsx"; +import * as $oauth2_userinfo from "./routes/oauth2/userinfo.tsx"; +import * as $code_input from "./islands/code_input.tsx"; +import * as $delayed_button from "./islands/delayed_button.tsx"; +import * as $email_input from "./islands/email_input.tsx"; +import * as $password_input from "./islands/password_input.tsx"; +import * as $phone_number_input from "./islands/phone_number_input.tsx"; +import * as $photo_capture_input from "./islands/photo_capture_input.tsx"; +import { type Manifest } from "$fresh/server.ts"; + +const manifest = { + routes: { + "./routes/(admin)/verify/id-document.tsx": $_admin_verify_id_document, + "./routes/(customer)/_layout.tsx": $_customer_layout, + "./routes/(customer)/connect.tsx": $_customer_connect, + "./routes/(customer)/login.tsx": $_customer_login, + "./routes/(customer)/logout.tsx": $_customer_logout, + "./routes/(customer)/register/email.tsx": $_customer_register_email, + "./routes/(customer)/register/id-document.tsx": + $_customer_register_id_document, + "./routes/(customer)/register/phone.tsx": $_customer_register_phone, + "./routes/(customer)/verify/email.tsx": $_customer_verify_email, + "./routes/(customer)/verify/id-document.tsx": $_customer_verify_id_document, + "./routes/(customer)/verify/sms.tsx": $_customer_verify_sms, + "./routes/_404.tsx": $_404, + "./routes/_500.tsx": $_500, + "./routes/_app.tsx": $_app, + "./routes/_layout.tsx": $_layout, + "./routes/_middleware.ts": $_middleware, + "./routes/index.tsx": $index, + "./routes/oauth2/authorize.tsx": $oauth2_authorize, + "./routes/oauth2/callback.tsx": $oauth2_callback, + "./routes/oauth2/token.tsx": $oauth2_token, + "./routes/oauth2/userinfo.tsx": $oauth2_userinfo, + }, + islands: { + "./islands/code_input.tsx": $code_input, + "./islands/delayed_button.tsx": $delayed_button, + "./islands/email_input.tsx": $email_input, + "./islands/password_input.tsx": $password_input, + "./islands/phone_number_input.tsx": $phone_number_input, + "./islands/photo_capture_input.tsx": $photo_capture_input, + }, + baseUrl: import.meta.url, +} satisfies Manifest; + +export default manifest; diff --git a/src/http/islands/code_input.tsx b/src/http/islands/code_input.tsx @@ -0,0 +1,30 @@ +import { useComputed, useSignal } from "@preact/signals"; +import { CODE_REGEX } from "#core/domain/constants.ts"; + +export default function CodeInput(props: { error: boolean }) { + const error = useSignal(props.error); + const value = useSignal(""); + + const invalid = useComputed(() => { + if (error.value) return "true"; + if (value.value === "") return undefined; + return CODE_REGEX.test(value.value) ? "false" : "true"; + }); + + return ( + <label> + Verification Code: + <input + type="text" + name="code" + value={value} + aria-invalid={invalid} + onInput={(e) => { + error.value = false; + value.value = e.currentTarget.value; + }} + /> + <small>Enter the code that has been sent to your email address</small> + </label> + ); +} diff --git a/src/http/islands/delayed_button.tsx b/src/http/islands/delayed_button.tsx @@ -0,0 +1,39 @@ +import { useComputed, useSignal } from "@preact/signals"; +import { ComponentProps } from "preact"; +import { useEffect } from "preact/hooks"; + +export default function DelayedButton( + { delay, children, ...props }: Omit<ComponentProps<"button">, "disabled"> & { + delay: number; + }, +) { + const embargo = Date.now() + delay; + const countdown = useSignal(delay); + const disabled = useComputed(() => countdown.value > 0); + const content = useComputed(() => + disabled.value ? ` in ${countdown.value}s` : "" + ); + + useEffect(() => { + const interval = setInterval(() => + countdown.value = Math.ceil((embargo - Date.now()) / 1000) + ); + return () => clearInterval(interval); + }); + + return ( + <button + {...props} + onClick={props.href + ? ((event) => { + event.preventDefault(); + location.href = `${props.href}`; + }) + : undefined} + disabled={disabled} + > + {children} + {content} + </button> + ); +} diff --git a/src/http/islands/email_input.tsx b/src/http/islands/email_input.tsx @@ -0,0 +1,29 @@ +import { useComputed, useSignal } from "@preact/signals"; +import { EMAIL_REGEX } from "#core/domain/constants.ts"; + +export default function EmailInput(props: { error: boolean }) { + const error = useSignal(props.error); + const value = useSignal(""); + + const invalid = useComputed(() => { + if (error.value) return true; + if (value.value === "") return undefined; + return EMAIL_REGEX.test(value.value) ? "false" : "true"; + }); + + return ( + <label> + Email: + <input + type="email" + name="email" + value={value} + aria-invalid={invalid} + onInput={(e) => { + error.value = false; + value.value = e.currentTarget.value; + }} + /> + </label> + ); +} diff --git a/src/http/islands/password_input.tsx b/src/http/islands/password_input.tsx @@ -0,0 +1,70 @@ +import { useComputed, useSignal } from "@preact/signals"; + +const MIN_LENGTH = 8; + +export default function PasswordInput( + props: { error: boolean; confirm: boolean }, +) { + const visible = useSignal(false); + const error = useSignal(props.error); + const passwordValue = useSignal(""); + const confirmValue = useSignal(""); + const type = useComputed(() => visible.value ? "text" : "password"); + + const passwordInvalid = useComputed(() => { + if (error.value) return "true"; + if (passwordValue.value === "" || !props.confirm) return undefined; + return passwordValue.value.length < MIN_LENGTH ? "true" : "false"; + }); + + const confirmInvalid = useComputed(() => { + if (error.value) return "true"; + if (confirmValue.value === "") return undefined; + return confirmValue.value !== passwordValue.value ? "true" : "false"; + }); + + return ( + <fieldset> + <label> + Password: + <input + type={type} + name="password" + value={passwordValue} + aria-invalid={passwordInvalid} + onInput={(e) => { + error.value = false; + passwordValue.value = e.currentTarget.value; + }} + /> + {props.confirm && ( + <small>Enter password with {MIN_LENGTH} characters minimum</small> + )} + </label> + {props.confirm && ( + <label> + Confirm password: + <input + type={type} + name="passwordConfirmation" + value={confirmValue} + aria-invalid={confirmInvalid} + onInput={(e) => { + error.value = false; + confirmValue.value = e.currentTarget.value; + }} + /> + <small>Re-enter your password to check for errors</small> + </label> + )} + <label> + <input + type="checkbox" + checked={visible} + onInput={(e) => visible.value = e.currentTarget.checked} + /> + Show password + </label> + </fieldset> + ); +} diff --git a/src/http/islands/phone_number_input.tsx b/src/http/islands/phone_number_input.tsx @@ -0,0 +1,35 @@ +import { useComputed, useSignal } from "@preact/signals"; + +export default function PhoneNumberInput( + props: { error: boolean; conflict: boolean }, +) { + const error = useSignal(props.error); + const value = useSignal(""); + + const invalid = useComputed(() => { + if (error.value) return true; + if (value.value === "") return undefined; + return false; + }); + + return ( + <label> + Phone number: + <input + type="tel" + name="phoneNumber" + value={value} + aria-invalid={invalid} + onInput={(e) => { + error.value = false; + value.value = e.currentTarget.value; + }} + /> + {useComputed(() => + props.conflict && invalid.value && ( + <small>Phone number already used!</small> + ) + )} + </label> + ); +} diff --git a/src/http/islands/photo_capture_input.tsx b/src/http/islands/photo_capture_input.tsx @@ -0,0 +1,116 @@ +import { useComputed, useSignal } from "@preact/signals"; +import { useEffect, useRef } from "preact/hooks"; +import { ComponentChildren, JSX } from "preact"; + +export type PhotoCaptureInputProps = { + capture?: unknown; + retry?: unknown; + send?: unknown; + children: ComponentChildren; + camera: "user" | "environment"; +}; + +export function PhotoCaptureInput(props: PhotoCaptureInputProps) { + const image = useSignal<string | undefined>(undefined); + const videoRef = useRef<HTMLVideoElement>(null); + const canvasRef = useRef<HTMLCanvasElement>(null); + const unauthorized = useSignal(true); + const capturedShow = useComputed(() => + image.value !== undefined ? undefined : "display:none;" + ); + const capturedHide = useComputed(() => + image.value !== undefined ? "display:none;" : undefined + ); + + useEffect(() => { + if (videoRef.current && canvasRef.current) { + navigator.mediaDevices.getUserMedia({ + video: { facingMode: props.camera }, + audio: false, + }) + .then((stream) => { + unauthorized.value = false; + videoRef.current!.srcObject = stream; + }) + .catch(() => { + unauthorized.value = true; + }); + } + }, [videoRef.current, canvasRef.current]); + + const capture = () => { + if (!videoRef.current || !canvasRef.current!) return; + const rect = videoRef.current.getBoundingClientRect(); + canvasRef.current.width = rect.width; + canvasRef.current.height = rect.height; + const context = canvasRef.current.getContext("2d")!; + context.drawImage(videoRef.current, 0, 0, rect.width, rect.height); + image.value = String(canvasRef.current.toDataURL("image/png")); + }; + + const retry = () => { + image.value = undefined; + }; + + const submit = (event: JSX.TargetedMouseEvent<HTMLButtonElement>) => { + event.currentTarget.form?.submit(); + }; + + return ( + <fieldset> + <section aria-describedby="legend"> + <input type="hidden" name="picture" value={image} /> + <video + autoPlay + playsinline + ref={videoRef} + style={useComputed(() => + image.value !== undefined + ? "width:100%; display:none;" + : "width:100%;" + )} + /> + <canvas + ref={canvasRef} + style={useComputed(() => + image.value === undefined ? "display: none" : "" + )} + /> + <small>{props.children}</small> + </section> + <div role="group"> + <button + type="button" + className="secondary" + style={capturedShow} + onClick={debounce(retry)} + > + {props.retry ?? "Retry"} + </button> + <button + type="button" + disabled={unauthorized} + style={capturedHide} + onClick={debounce(capture)} + > + {props.capture ?? "Capture"} + </button> + <button + type="submit" + style={capturedShow} + onClick={submit} + > + {props.send ?? "Send"} + </button> + </div> + </fieldset> + ); +} + +function debounce<A extends unknown[]>(fn: (...args: A) => unknown) { + let timer: number; + return (...args: A) => { + clearTimeout(timer); + timer = setTimeout(fn, 300, ...args); + }; +} diff --git a/src/http/main.ts b/src/http/main.ts @@ -0,0 +1,11 @@ +/// <reference no-default-infrastructure="true" /> +/// <reference infrastructure="dom" /> +/// <reference infrastructure="dom.iterable" /> +/// <reference infrastructure="dom.asynciterable" /> +/// <reference infrastructure="deno.ns" /> + +import { start } from "$fresh/server.ts"; +import config from "#http/fresh.config.ts"; +import manifest from "#http/fresh.gen.ts"; + +await start(manifest, config); diff --git a/src/http/routes/(admin)/verify/id-document.tsx b/src/http/routes/(admin)/verify/id-document.tsx @@ -0,0 +1,171 @@ +import { IDDocumentListResponse } from "#core/application/id_document/list.ts"; +import { AppState } from "#http/routes/_middleware.ts"; +import { PageProps } from "$fresh/server.ts"; +import { Handlers } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + items: IDDocumentListResponse["items"]; + next: URL; +}; + +export const handler: Handlers<Props, AppState<"/verify/id-document">> = { + async GET(_req, ctx) { + const { app, forms, formContext } = ctx.state; + const { idDocumentList, isIdDocumentAdmin } = app; + if (formContext === null) { + return forms.redirect({ + form: "/verify/id-document", + context: { cursor: 0 }, + }); + } + const { cursor } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { form: "/verify/id-document", context: formContext }, + }, + }); + } + if (!(await isIdDocumentAdmin.execute({ uuid: forms.session.uuid }))) { + return forms.redirect("/"); + } + const { items, next: nextCursor } = await idDocumentList.execute({ + cursor, + }); + const next = forms.link({ + form: "/verify/id-document", + context: { cursor: nextCursor }, + }); + return ctx.render({ items, next }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { idDocumentApprove, idDocumentDecline, isIdDocumentAdmin } = app; + if (formContext === null) { + return forms.redirect("/"); + } + + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { form: "/verify/id-document", context: formContext }, + }, + }); + } + if (!(await isIdDocumentAdmin.execute({ uuid: forms.session.uuid }))) { + return forms.redirect("/"); + } + + const { uuid, approved } = await forms.inputs( + req, + V.object({ + uuid: V.string(), + approved: V.string().map(() => true).default(false), + }), + ); + + if (approved) { + await idDocumentApprove.execute({ + admin: forms.session.uuid, + uuid, + }); + } else { + await idDocumentDecline.execute({ + admin: forms.session.uuid, + uuid, + }); + } + + return forms.redirect(req.url); + }, +}; + +export default function IDDocumentPage( + { data }: PageProps<Props, AppState<"/verify/id-document">>, +) { + return ( + <> + <div class="grid"> + {data.items.map((i) => ( + <article style="max-width: 32em;"> + <header style="text-align: center;"> + <b>ID Information</b> + </header> + <div> + <table> + <tr> + <th> + <b>First name</b> + </th> + <td>{i.firstName ? i.firstName : "—"}</td> + </tr> + <tr> + <th> + <b>Last name</b> + </th> + <td>{i.lastName ? i.lastName : "—"}</td> + </tr> + <tr> + <th> + <b>Sex</b> + </th> + <td>{i.sex ? i.sex : "—"}</td> + </tr> + <tr> + <th> + <b>Birth date</b> + </th> + <td> + {i.birthDate + ? i.birthDate.toLocaleDateString("en", { + year: "numeric", + month: "long", + day: "numeric", + }) + : "—"} + </td> + </tr> + <tr> + <th> + <b>Nationality</b> + </th> + <td>{i.nationality ? i.nationality : "—"}</td> + </tr> + <tr> + <th> + <b>Country</b> + </th> + <td>{i.country ? i.country : "—"}</td> + </tr> + </table> + <section className="grid"> + {i.docFront && <img src={i.docFront} />} + {i.docBack && <img src={i.docBack} />} + {i.faceLeft && <img src={i.faceLeft} />} + {i.faceFront && <img src={i.faceFront} />} + {i.faceRight && <img src={i.faceRight} />} + </section> + <form method="POST"> + <input type="hidden" name="uuid" value={i.uuid} /> + <div role="group"> + <button type="submit" class="secondary">Decline</button> + <button type="submit" name="approved" value="on"> + Approve + </button> + </div> + </form> + </div> + </article> + ))} + + </div> + <nav role="group"> + <a role="button" href={data.next.href}>Next</a> + </nav> + </> + ); +} diff --git a/src/http/routes/(customer)/_layout.tsx b/src/http/routes/(customer)/_layout.tsx @@ -0,0 +1,9 @@ +import { PageProps } from "$fresh/src/server/types.ts"; + +export default function AuthnLayout({ Component }: PageProps) { + return ( + <div style="max-width: 24em; margin-left: auto; margin-right: auto;"> + <Component /> + </div> + ); +} diff --git a/src/http/routes/(customer)/connect.tsx b/src/http/routes/(customer)/connect.tsx @@ -0,0 +1,83 @@ +import EmailInput from "#http/islands/email_input.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + invalid: boolean; +}; + +export const handler: Handlers<Props, AppState<"/connect">> = { + GET(_req, ctx) { + const { forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { back: "/" }, + }); + } + const { back } = formContext; + if (forms.session !== null) { + return forms.redirect(back); + } + return ctx.render({ invalid: false }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { authExists, customerInfo } = app; + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { back: "/" }, + }); + } + + const { back } = formContext; + if (forms.session !== null) { + return forms.redirect(back) + } + + const { email } = await forms.inputs(req, V.object({ email: V.string() })); + + const existsResult = await authExists.execute({ email }); + if (existsResult.status === "invalid") { + return ctx.render({ invalid: true }); + } + if (existsResult.status === "unknown") { + return forms.redirect({ + form: "/register/email", + context: { email, back }, + }); + } + + const result = await customerInfo.execute({ uuid: existsResult.uuid! }); + if (!result.emailVerified) { + return forms.redirect({ + form: "/verify/email", + context: { uuid: result.uuid!, back }, + }); + } + + return forms.redirect({ + form: "/login", + context: { uuid: result.uuid!, back }, + }); + }, +}; + +export default function ConnectPage({ data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Connection</b> + </header> + <form method="POST"> + <EmailInput error={data.invalid} /> + <div role="group"> + <button type="submit">Login or register</button> + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/(customer)/login.tsx b/src/http/routes/(customer)/login.tsx @@ -0,0 +1,75 @@ +import PasswordInput from "#http/islands/password_input.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + invalid: boolean; + delay: number; +}; + +export const handler: Handlers<Props, AppState<"/login">> = { + GET(_req, ctx) { + const { forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { back: "/" }, + }); + } + const { back } = formContext; + if (forms.session !== null) { + return forms.redirect(back); + } + return ctx.render({ invalid: false, delay: 0 }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { authLogin } = app; + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { back: "/" }, + }); + } + const { uuid, back } = formContext; + if (forms.session !== null) { + return forms.redirect(back) + } + + const { password } = await forms.inputs( + req, + V.object({ + password: V.string(), + }), + ); + const result = await authLogin.execute({ uuid, password }); + if (result.status === "loggedIn") { + return forms.redirectWithSession( + back, + result.sessionToken!, + ); + } + return ctx.render({ + invalid: result.status === "invalid", + delay: result.delay, + }); + }, +}; + +export default function LoginPages({ data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Login</b> + </header> + <form method="POST"> + <PasswordInput error={data.invalid} confirm={false} /> + <div role="group"> + <button type="submit">Login</button> + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/(customer)/logout.tsx b/src/http/routes/(customer)/logout.tsx @@ -0,0 +1,17 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers } from "$fresh/src/server/types.ts"; + +export const handler: Handlers<void, AppState<"/logout">> = { + async POST(_req, ctx) { + const { app, forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect("/"); + } + const { back } = formContext; + if (forms.session) { + const { authSession } = app; + await authSession.execute({ sessionToken: forms.session.token }); + } + return forms.redirectWithoutSession(back); + }, +}; diff --git a/src/http/routes/(customer)/register/email.tsx b/src/http/routes/(customer)/register/email.tsx @@ -0,0 +1,69 @@ +import PasswordInput from "#http/islands/password_input.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + invalid: boolean; +}; + +export const handler: Handlers<Props, AppState<"/register/email">> = { + GET(_req, ctx) { + const { forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + const { back } = formContext; + if (forms.session !== null) { + return forms.redirect(back); + } + return ctx.render({ invalid: false }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + const { email, back } = formContext; + const { authRegister } = app; + const { password, passwordConfirmation } = await forms.inputs( + req, + V.object({ + password: V.string(), + passwordConfirmation: V.string(), + }), + ); + const result = await authRegister.execute({ + email, + password, + passwordConfirmation, + }); + if (result.status === "invalid") { + return ctx.render({ invalid: true }); + } + if (result.status === "conflict") { + return forms.redirect({ form: "/connect", context: { back } }); + } + return forms.redirect({ + form: "/verify/email", + context: { uuid: result.uuid!, back }, + }); + }, +}; + +export default function RegisterPages({ data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Email registration</b> + </header> + <form method="POST"> + <PasswordInput error={data.invalid} confirm={true} /> + <div role="group"> + <button type="submit">Register</button> + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/(customer)/register/id-document.tsx b/src/http/routes/(customer)/register/id-document.tsx @@ -0,0 +1,234 @@ +import { MRZInfo } from "#core/application/id_document/mrzscan.ts"; +import { PhotoCaptureInput } from "#http/islands/photo_capture_input.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + side: "doc-front" | "doc-back" | "face-left" | "face-front" | "face-right"; + next: URL | null; + back: URL | null; + info: MRZInfo | null; +}; + +const NEXT = { + "doc-front": "doc-back", + "doc-back": "face-left", + "face-left": "face-front", + "face-front": "face-right", + "face-right": false, +}; + +export const handler: Handlers<Props, AppState<"/register/id-document">> = { + async GET(_req, ctx) { + const { app, forms, formContext } = ctx.state; + const { customerInfo } = app; + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { + form: "/register/id-document", + context: { side: "doc-front", back: "/" }, + }, + }, + }); + } + const { side, back } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { + form: "/register/id-document", + context: { side: "doc-front", back }, + }, + }, + }); + } + + const result = await customerInfo.execute({ uuid: forms.session.uuid }); + if (result.idDocumentRegistered) { + return forms.redirect(back); + } + + return ctx.render({ + side, + next: forms.link({ + form: "/register/id-document", + context: { side: NEXT[side] as never, back }, + }), + back: null, + info: null, + }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { idDocumentCapture } = app; + + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + + const { side, back } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { + form: "/register/id-document", + context: { side: "doc-front", back }, + }, + }, + }); + } + + const { picture } = await forms.inputs( + req, + V.object({ picture: V.string() }), + ); + + const result = await idDocumentCapture.execute({ + uuid: forms.session.uuid, + side, + picture, + }); + + if (result.status === "scanned") { + return ctx.render({ + side, + next: forms.link({ + form: "/register/id-document", + context: { side: "face-left" as never, back }, + }), + back: forms.link({ + form: "/register/id-document", + context: { side: "doc-front" as never, back }, + }), + info: result, + }); + } + + if (result.status === "scan-failure") { + return forms.redirect({ + form: "/connect", + context: { + back: { + form: "/register/id-document", + context: { side: "doc-back", back }, + }, + }, + }); + } + + + if (result.status === "invalid") { + return forms.redirect({ + form: "/connect", + context: { + back: { + form: "/register/id-document", + context: { side: "doc-front", back }, + }, + }, + }); + } + + if (result.status === "captured" && NEXT[side] !== false) { + return forms.redirect({ + form: "/register/id-document", + context: { side: NEXT[side] as never, back }, + }); + } + + return forms.redirect(back); + }, +}; + +const LABELS = { + "doc-front": "Take photo of ID document front side", + "doc-back": "Take photo of ID document back side", + "face-left": "Take photo of you facing left", + "face-front": "Take photo of you facing front", + "face-right": "Take photo of you facing right", +}; + +export default function RegisterPages({ data }: PageProps<Props>) { + if (data.info !== null) { + return ( + <article> + <header style="text-align: center;"> + <b>ID Information</b> + </header> + <div> + <table> + <tr> + <th> + <b>First name</b> + </th> + <td>{data.info.firstName ? data.info.firstName : "—"}</td> + </tr> + <tr> + <th> + <b>Last name</b> + </th> + <td>{data.info.lastName ? data.info.lastName : "—"}</td> + </tr> + <tr> + <th> + <b>Sex</b> + </th> + <td>{data.info.sex ? data.info.sex : "—"}</td> + </tr> + <tr> + <th> + <b>Birth date</b> + </th> + <td> + {data.info.birthDate + ? data.info.birthDate.toLocaleDateString("en", { + year: "numeric", + month: "long", + day: "numeric", + }) + : "—"} + </td> + </tr> + <tr> + <th> + <b>Nationality</b> + </th> + <td>{data.info.nationality ? data.info.nationality : "—"}</td> + </tr> + <tr> + <th> + <b>Country</b> + </th> + <td>{data.info.country ? data.info.country : "—"}</td> + </tr> + </table> + <div role="group"> + <a href={data.back!.href} role="button" class="secondary">Back</a> + <a href={data.next!.href} role="button">Confirm</a> + </div> + </div> + </article> + ); + } + + return ( + <article> + <header style="text-align: center;"> + <b>ID Document</b> + </header> + <form method="POST"> + <PhotoCaptureInput + camera={data.side.startsWith("face") ? "user" : "environment"} + > + {LABELS[data.side]} + </PhotoCaptureInput> + </form> + </article> + ); +} diff --git a/src/http/routes/(customer)/register/phone.tsx b/src/http/routes/(customer)/register/phone.tsx @@ -0,0 +1,83 @@ +import { PersonalPhoneNumber } from "#core/domain/personal_phone_number.ts"; +import PhoneNumberInput from "#http/islands/phone_number_input.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + invalid: boolean; + conflict: boolean; +}; + +export const handler: Handlers<Props, AppState<"/register/phone">> = { + async GET(_req, ctx) { + const { app, forms, formContext } = ctx.state; + const { customerInfo } = app; + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + const { back, conflict } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { back: { form: "/register/phone", context: { back } } }, + }); + } + if (conflict) { + return ctx.render({ invalid: true, conflict: true }); + } + const result = await customerInfo.execute({ uuid: forms.session.uuid }); + if (!result.exists) { + return ctx.renderNotFound(); + } + if (result.phoneNumberVerified) { + return forms.redirect(back); + } + return ctx.render({ invalid: false, conflict: false }); + }, + + async POST(req, ctx) { + const { forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + const { back } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { back: { form: "/register/phone", context: { back } } }, + }); + } + const { phoneNumber } = await forms.inputs( + req, + V.object({ phoneNumber: V.string() }), + ); + try { + return forms.redirect({ + form: "/verify/sms", + context: { + phoneNumber: new PersonalPhoneNumber(phoneNumber).toString(), + back, + }, + }); + } catch { + return ctx.render({ invalid: true, conflict: false }); + } + }, +}; + +export default function RegisterPages({ data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Phone number registration</b> + </header> + <form method="POST"> + <PhoneNumberInput error={data.invalid} conflict={data.conflict} /> + <div role="group"> + <button type="submit">Register</button> + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/(customer)/verify/email.tsx b/src/http/routes/(customer)/verify/email.tsx @@ -0,0 +1,76 @@ +import CodeInput from "#http/islands/code_input.tsx"; +import DelayedButton from "#http/islands/delayed_button.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { invalid: boolean; delay: number }; + +export const handler: Handlers<Props, AppState<"/verify/email">> = { + async GET(_req, ctx) { + const { app, forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + const { back } = formContext; + if (forms.session !== null) { + return forms.redirect(back); + } + const { uuid } = formContext; + const { authEmailChallenge } = app; + const result = await authEmailChallenge.execute({ uuid }); + if (result.status === "verified") { + return forms.redirect({ + form: "/login", + context: { uuid, back }, + }); + } + return ctx.render({ + invalid: result.status === "invalid", + delay: result.delay, + }); + }, + + async POST(req, ctx) { + const { forms, formContext } = ctx.state; + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { back: "/" }, + }); + } + const { uuid, back } = formContext; + const { authVerifyEmail } = ctx.state.app; + const { code } = await forms.inputs(req, V.object({ code: V.string() })); + const result = await authVerifyEmail.execute({ uuid, code }); + if (result.status === "blocked") { + return ctx.render({ invalid: false, delay: result.delay }); + } + if (result.status === "invalid") { + return ctx.render({ invalid: true, delay: result.delay }); + } + return forms.redirect({ + form: "/login", + context: { uuid, back }, + }); + }, +}; + +export default function VerifyEmailPages({ url, data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Email verification</b> + </header> + <form method="POST"> + <CodeInput error={data.invalid} /> + <div role="group"> + <DelayedButton delay={data.delay} href={url.href}> + Resend + </DelayedButton> + <button type="submit">Verify</button> + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/(customer)/verify/id-document.tsx b/src/http/routes/(customer)/verify/id-document.tsx @@ -0,0 +1,80 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { IDDocumentDto } from "#infrastructure/memory/mapper/id_document.ts"; +import { PageProps } from "$fresh/server.ts"; +import { Handlers } from "$fresh/src/server/types.ts"; +import * as V from "$valita"; + +type Props = { + items: IDDocumentDto[]; + next: URL; +}; + +export const handler: Handlers<Props, AppState<"/verify/id-document">> = { + async GET(_req, ctx) { + const { app, forms, formContext } = ctx.state; + const { idDocumentList } = app; + if (formContext === null) { + return forms.redirect({ + form: "/verify/id-document", + context: { cursor: 0 }, + }); + } + const { cursor } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/verify/id-document", + context: formContext, + }); + } + const { items, next: nextCursor } = await idDocumentList.execute({ + cursor, + }); + const next = forms.link({ + form: "/verify/id-document", + context: { cursor: nextCursor }, + }); + return ctx.render({ items, next }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { idDocumentApprove, idDocumentDecline } = app; + if (formContext === null) { + return forms.redirect("/"); + } + if (forms.session === null) { + return forms.redirect({ + form: "/verify/id-document", + context: formContext, + }); + } + + const { uuid, approved } = await forms.inputs( + req, + V.object({ + uuid: V.string(), + approved: V.string().map(() => true).default(false), + }), + ); + + if (approved) { + await idDocumentApprove.execute({ + admin: forms.session.uuid, + uuid, + }); + } else { + await idDocumentDecline.execute({ + admin: forms.session.uuid, + uuid, + }); + } + + return await this.GET!(req, ctx); + }, +}; + +export default function IDDocumentPage( + props: PageProps<Props, AppState<"/verify/id-document">>, +) { + return null +} diff --git a/src/http/routes/(customer)/verify/sms.tsx b/src/http/routes/(customer)/verify/sms.tsx @@ -0,0 +1,134 @@ +import CodeInput from "#http/islands/code_input.tsx"; +import DelayedButton from "#http/islands/delayed_button.tsx"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/server.ts"; +import * as V from "$valita"; + +type Props = { + invalid: boolean; + delay: number; + blocked: boolean; +}; + +export const handler: Handlers<Props, AppState<"/verify/sms">> = { + async GET(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { phoneRegister } = app; + + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { + back: forms.link({ + form: "/register/phone", + context: { back: "/" }, + }).href, + }, + }); + } + + const { phoneNumber, back } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { + back: forms.link({ form: "/register/phone", context: { back } }).href, + }, + }); + } + + const result = await phoneRegister.execute({ + uuid: forms.session.uuid, + phoneNumber, + }); + + if (result.status === "verified") { + return forms.redirect(back); + } + + if (result.status === "invalid") { + return forms.redirect({ + form: "/register/phone", + context: { back }, + }); + } + + if (result.status === "conflict") { + return forms.redirect({ + form: "/register/phone", + context: { back, conflict: true }, + }); + } + + return ctx.render({ + invalid: false, + delay: result.delay, + blocked: false, + }); + }, + + async POST(req, ctx) { + const { app, forms, formContext } = ctx.state; + const { phoneVerifySms } = app; + + if (formContext === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { form: "/register/phone", context: { back: "/" } }, + }, + }); + } + + const { back } = formContext; + if (forms.session === null) { + return forms.redirect({ + form: "/connect", + context: { + back: { form: "/register/phone", context: { back } }, + }, + }); + } + + const { code } = await forms.inputs(req, V.object({ code: V.string() })); + + const result = await phoneVerifySms.execute({ + uuid: forms.session.uuid, + code, + }); + + if (result.status === "verified") { + return forms.redirect(back); + } + + return ctx.render({ + invalid: false, + delay: result.delay, + blocked: result.status === "blocked", + }); + }, +}; + +export default function VerifySmsPages({ url, data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Phone number verification</b> + </header> + <form method="POST"> + <CodeInput error={data.invalid} /> + <div role="group"> + <DelayedButton delay={data.delay} href={url.href}> + Resend + </DelayedButton> + {!data.blocked && + ( + <button type="submit"> + Verify + </button> + )} + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/_404.tsx b/src/http/routes/_404.tsx @@ -0,0 +1,18 @@ +import { Head } from "$fresh/src/runtime/head.ts"; +import { PageProps } from "$fresh/src/server/types.ts"; + +export default function NotFound(props: PageProps) { + return ( + <> + <Head> + <title key="title">KYCID</title> + </Head> + <article style="max-width: 420px; margin-left: auto; margin-right: auto;"> + <header style="text-align: center;"> + <b>Resource not found</b> + </header> + <code>{props.url.pathname}</code> + </article> + </> + ); +} diff --git a/src/http/routes/_500.tsx b/src/http/routes/_500.tsx @@ -0,0 +1,23 @@ +import { ExceedingLimit } from "#core/domain/limiter.ts"; +import DelayedButton from "#http/islands/delayed_button.tsx"; +import { PageProps } from "$fresh/server.ts"; + +export default function Error500Page({ url, error }: PageProps) { + if (error instanceof ExceedingLimit) { + return ( + <main class="container"> + <h1>Site spammed !</h1> + <DelayedButton href={url.href} delay={error.delay}> + Reload + </DelayedButton> + </main> + ); + } + + return ( + <main class="container"> + <h1>Whops and error occured</h1> + <a href="/" class="button">Go homepage</a> + </main> + ); +} diff --git a/src/http/routes/_app.tsx b/src/http/routes/_app.tsx @@ -0,0 +1,16 @@ +import { PageProps } from "$fresh/src/server/types.ts"; + +export default function App({ Component }: PageProps) { + return ( + <html lang="en"> + <head> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <link rel="stylesheet" href="/pico.min.css" /> + </head> + <body> + <Component /> + </body> + </html> + ); +} diff --git a/src/http/routes/_layout.tsx b/src/http/routes/_layout.tsx @@ -0,0 +1,65 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { Head } from "$fresh/src/runtime/head.ts"; +import { PageProps } from "$fresh/src/server/mod.ts"; + +export default function Layout( + { Component, state, url }: PageProps<void, AppState>, +) { + return ( + <> + <Head> + <title key="title">KYCID</title> + </Head> + <header class="container"> + <nav> + <ul> + <li> + <hgroup> + <b> + <a href="/">KYCID</a> + </b> + <p>Know your customer's identity</p> + </hgroup> + </li> + </ul> + <ul> + <li> + {state.forms.session + ? ( + <form + method="POST" + action={state.forms.link({ + form: "/logout", + context: { back: url.href }, + }) + .href} + > + <button type="submit"> + Logout + </button> + </form> + ) + : ( + <form + method="GET" + action={state.forms.link({ + form: "/connect", + context: { back: url.href }, + }).href} + > + <button type="submit"> + Login + </button> + </form> + )} + </li> + </ul> + </nav> + </header> + + <main class="container"> + <Component /> + </main> + </> + ); +} diff --git a/src/http/routes/_middleware.ts b/src/http/routes/_middleware.ts @@ -0,0 +1,24 @@ +import { app } from "#http/app.ts"; +import { FormContexts, Forms } from "#http/form.ts"; +import { FreshContext } from "$fresh/server.ts"; + +export type AppState<F extends keyof FormContexts = keyof FormContexts> = { + app: typeof app; + forms: Forms; + formContext: FormContexts[F] | null; +}; + +export async function handler(req: Request, ctx: FreshContext<AppState>) { + // Inject http in context + ctx.state.app = app; + + // Authenticate Form + ctx.state.forms = await Forms.parse(req, app.authSession); + + // Parse form context + ctx.state.formContext = ctx.state.forms.context( + ctx.state.forms.base.pathname as never, + ); + + return await ctx.next(); +} diff --git a/src/http/routes/index.tsx b/src/http/routes/index.tsx @@ -0,0 +1,31 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { PageProps } from "$fresh/src/server/mod.ts"; + +type Props = { + uuid: string | null; +}; + +export default function HomePage({ state }: PageProps<Props, AppState>) { + return ( + <> + <h1>Homepage</h1> + <a + href={state.forms.link({ + form: "/register/phone", + context: { back: "/" }, + }).href} + > + Register Phone + </a> + <br /> + <a + href={state.forms.link({ + form: "/register/id-document", + context: { side: "doc-front", back: "/" }, + }).href} + > + Register ID Document + </a> + </> + ); +} diff --git a/src/http/routes/oauth2/authorize.tsx b/src/http/routes/oauth2/authorize.tsx @@ -0,0 +1,103 @@ +import { Link } from "#http/form.ts"; +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers, PageProps } from "$fresh/src/server/types.ts"; +import { ExceedingLimit } from "#core/domain/limiter.ts"; + +type Props = { + scope: string[]; + description: string|null; +}; + +export const handler: Handlers<Props, AppState<"/connect">> = { + async GET(req, ctx) { + const { oauth2Validate } = ctx.state.app; + const url = new URL(req.url); + + const result = await oauth2Validate.execute({ + clientId: String(url.searchParams.get("client_id")), + scope: url.searchParams.has("scope") + ? String(url.searchParams.get("scope")) + : null, + }); + + if (!result.valid) { + return ctx.renderNotFound(); + } + + return ctx.render({ + scope: result.scope, + description: result.description, + }); + }, + + async POST(req, ctx) { + const { forms, app } = ctx.state; + const { oauth2Initiate } = app; + try { + const url = new URL(req.url); + const clientId = `${url.searchParams.get("client_id")}`; + const result = await oauth2Initiate.execute({ + ip: ctx.remoteAddr.hostname, + clientId, + scope: url.searchParams.has("scope") + ? String(url.searchParams.get("scope")) + : null, + state: url.searchParams.has("state") + ? String(url.searchParams.get("state")) + : null, + }); + + if (!result.initiated) { + return ctx.renderNotFound(); + } + + const scope = result.scope; + let back = { + form: "/oauth2/callback", + context: { flowId: result.uuid, clientId }, + } as Link; + + if (scope.includes("phone-number")) { + back = { form: "/register/phone", context: { back } }; + } + + if (scope.includes("id-document")) { + back = { + form: "/register/id-document", + context: { side: "doc-front", back }, + }; + } + + return forms.redirect({ form: "/connect", context: { back } }); + } catch (error) { + if (error instanceof ExceedingLimit) { + throw error; + } + return ctx.renderNotFound(); + } + }, +}; + +const LABELS = { + "phone-number": "Phone number", + "id-document": "ID Document", +} as Record<string, string>; + +export default function AuthorizePage({ data }: PageProps<Props>) { + return ( + <article> + <header style="text-align: center;"> + <b>Authorize</b> + </header> + <form method="POST"> + <p>{data.description}</p> + <ul> + {data.scope.map((scope) => <li>{LABELS[scope] ?? scope}</li>)} + </ul> + <div role="group"> + <button type="submit">Consent</button> + </div> + </form> + </article> + ); +} diff --git a/src/http/routes/oauth2/callback.tsx b/src/http/routes/oauth2/callback.tsx @@ -0,0 +1,31 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers } from "$fresh/server.ts"; +import { unreachable } from "$std/assert/unreachable.ts"; + +export const handler: Handlers<void, AppState<"/oauth2/callback">> = { + async GET(_req, ctx) { + const { app, forms, formContext } = ctx.state; + const { oauth2Authorize } = app; + + if (formContext === null) { + return forms.redirect({ form: "/connect", context: { back: "/" } }); + } + + const { flowId, clientId } = formContext; + if (forms.session === null) { + return unreachable(); + } + + const result = await oauth2Authorize.execute({ + clientId, + flowId, + resourceOwner: forms.session.uuid, + }); + + if (result.authorized) { + return Response.redirect(result.redirectUri!, 303); + } + + return ctx.renderNotFound(); + }, +}; diff --git a/src/http/routes/oauth2/token.tsx b/src/http/routes/oauth2/token.tsx @@ -0,0 +1,36 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers } from "$fresh/server.ts"; +import * as V from "$valita"; + +export const handler: Handlers<void, AppState> = { + async POST(req, ctx) { + const { app, forms } = ctx.state; + const { oauth2Token } = app; + + const data = await forms.inputs( + req, + V.object({ + client_id: V.string(), + client_secret: V.string(), + code: V.string(), + }), + ); + + const result = await oauth2Token.execute({ + clientId: data.client_id, + clientSecret: data.client_secret, + code: data.code, + }); + + if (result.status === "issued") { + return Response.json({ + access_token: result.accessToken, + token_type: "bearer", + expires_in: result.expire, + state: result.state, + }); + } + + return new Response(null, { status: 400 }); + }, +}; diff --git a/src/http/routes/oauth2/userinfo.tsx b/src/http/routes/oauth2/userinfo.tsx @@ -0,0 +1,21 @@ +import { AppState } from "#http/routes/_middleware.ts"; +import { Handlers } from "$fresh/server.ts"; + +const BEARER = /^bearer (.+)$/i; + +export const handler: Handlers<void, AppState> = { + async GET(req, ctx) { + const { oauth2UserInfo } = ctx.state.app; + const authorization = req.headers.get("authorization"); + if (!authorization) { + return new Response(null, { status: 400 }); + } + const match = authorization.match(BEARER); + if (match === null) { + return new Response(null, { status: 400 }); + } + const accessToken = match[1]; + const result = await oauth2UserInfo.execute({ accessToken }); + return Response.json(result, { status: result.exists ? 200 : 404 }); + }, +}; diff --git a/src/http/static/favicon.ico b/src/http/static/favicon.ico Binary files differ. diff --git a/src/http/static/logo.svg b/src/http/static/logo.svg @@ -0,0 +1,6 @@ +<svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path d="M34.092 8.845C38.929 20.652 34.092 27 30 30.5c1 3.5-2.986 4.222-4.5 2.5-4.457 1.537-13.512 1.487-20-5C2 24.5 4.73 16.714 14 11.5c8-4.5 16-7 20.092-2.655Z" fill="#FFDB1E"/> + <path d="M14 11.5c6.848-4.497 15.025-6.38 18.368-3.47C37.5 12.5 21.5 22.612 15.5 25c-6.5 2.587-3 8.5-6.5 8.5-3 0-2.5-4-5.183-7.75C2.232 23.535 6.16 16.648 14 11.5Z" fill="#fff" stroke="#FFDB1E"/> + <path d="M28.535 8.772c4.645 1.25-.365 5.695-4.303 8.536-3.732 2.692-6.606 4.21-7.923 4.83-.366.173-1.617-2.252-1.617-1 0 .417-.7 2.238-.934 2.326-1.365.512-4.223 1.29-5.835 1.29-3.491 0-1.923-4.754 3.014-9.122.892-.789 1.478-.645 2.283-.645-.537-.773-.534-.917.403-1.546C17.79 10.64 23 8.77 25.212 8.42c.366.014.82.35.82.629.41-.14 2.095-.388 2.503-.278Z" fill="#FFE600"/> + <path d="M14.297 16.49c.985-.747 1.644-1.01 2.099-2.526.566.121.841-.08 1.29-.701.324.466 1.657.608 2.453.701-.715.451-1.057.852-1.452 2.106-1.464-.611-3.167-.302-4.39.42Z" fill="#fff"/> +</svg> +\ No newline at end of file diff --git a/src/http/static/pico.min.css b/src/http/static/pico.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * Pico CSS ✨ v2.0.6 (https://picocss.com) + * Copyright 2019-2024 - Licensed under MIT + */:root{--pico-font-family-emoji:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--pico-font-family-sans-serif:system-ui,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,Helvetica,Arial,"Helvetica Neue",sans-serif,var(--pico-font-family-emoji);--pico-font-family-monospace:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace,var(--pico-font-family-emoji);--pico-font-family:var(--pico-font-family-sans-serif);--pico-line-height:1.5;--pico-font-weight:400;--pico-font-size:100%;--pico-text-underline-offset:0.1rem;--pico-border-radius:0.25rem;--pico-border-width:0.0625rem;--pico-outline-width:0.125rem;--pico-transition:0.2s ease-in-out;--pico-spacing:1rem;--pico-typography-spacing-vertical:1rem;--pico-block-spacing-vertical:var(--pico-spacing);--pico-block-spacing-horizontal:var(--pico-spacing);--pico-grid-column-gap:var(--pico-spacing);--pico-grid-row-gap:var(--pico-spacing);--pico-form-element-spacing-vertical:0.75rem;--pico-form-element-spacing-horizontal:1rem;--pico-group-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-primary-focus);--pico-group-box-shadow-focus-with-input:0 0 0 0.0625rem var(--pico-form-element-border-color);--pico-modal-overlay-backdrop-filter:blur(0.375rem);--pico-nav-element-spacing-vertical:1rem;--pico-nav-element-spacing-horizontal:0.5rem;--pico-nav-link-spacing-vertical:0.5rem;--pico-nav-link-spacing-horizontal:0.5rem;--pico-nav-breadcrumb-divider:">";--pico-icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--pico-icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--pico-icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--pico-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--pico-icon-loading:url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E")}@media (min-width:576px){:root{--pico-font-size:106.25%}}@media (min-width:768px){:root{--pico-font-size:112.5%}}@media (min-width:1024px){:root{--pico-font-size:118.75%}}@media (min-width:1280px){:root{--pico-font-size:125%}}@media (min-width:1536px){:root{--pico-font-size:131.25%}}a{--pico-text-decoration:underline}a.contrast,a.secondary{--pico-text-decoration:underline}small{--pico-font-size:0.875em}h1,h2,h3,h4,h5,h6{--pico-font-weight:700}h1{--pico-font-size:2rem;--pico-line-height:1.125;--pico-typography-spacing-top:3rem}h2{--pico-font-size:1.75rem;--pico-line-height:1.15;--pico-typography-spacing-top:2.625rem}h3{--pico-font-size:1.5rem;--pico-line-height:1.175;--pico-typography-spacing-top:2.25rem}h4{--pico-font-size:1.25rem;--pico-line-height:1.2;--pico-typography-spacing-top:1.874rem}h5{--pico-font-size:1.125rem;--pico-line-height:1.225;--pico-typography-spacing-top:1.6875rem}h6{--pico-font-size:1rem;--pico-line-height:1.25;--pico-typography-spacing-top:1.5rem}tfoot td,tfoot th,thead td,thead th{--pico-font-weight:600;--pico-border-width:0.1875rem}code,kbd,pre,samp{--pico-font-family:var(--pico-font-family-monospace)}kbd{--pico-font-weight:bolder}:where(select,textarea),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-outline-width:0.0625rem}[type=search]{--pico-border-radius:5rem}[type=checkbox],[type=radio]{--pico-border-width:0.125rem}[type=checkbox][role=switch]{--pico-border-width:0.1875rem}details.dropdown summary:not([role=button]){--pico-outline-width:0.0625rem}nav details.dropdown summary:focus-visible{--pico-outline-width:0.125rem}[role=search]{--pico-border-radius:5rem}[role=group]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus),[role=search]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[role=group]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus),[role=search]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=submit],[role=search] button{--pico-form-element-spacing-horizontal:2rem}details summary[role=button]:not(.outline)::after{filter:brightness(0) invert(1)}[aria-busy=true]:not(input,select,textarea):is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0) invert(1)}:root:not([data-theme=dark]),[data-theme=light]{--pico-background-color:#fff;--pico-color:#373c44;--pico-text-selection-color:rgba(2, 154, 232, 0.25);--pico-muted-color:#646b79;--pico-muted-border-color:#e7eaf0;--pico-primary:#0172ad;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 114, 173, 0.5);--pico-primary-hover:#015887;--pico-primary-hover-background:#02659a;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(2, 154, 232, 0.5);--pico-primary-inverse:#fff;--pico-secondary:#5d6b89;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(93, 107, 137, 0.5);--pico-secondary-hover:#48536b;--pico-secondary-hover-background:#48536b;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(93, 107, 137, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#181c25;--pico-contrast-background:#181c25;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(24, 28, 37, 0.5);--pico-contrast-hover:#000;--pico-contrast-hover-background:#000;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-secondary-hover);--pico-contrast-focus:rgba(93, 107, 137, 0.25);--pico-contrast-inverse:#fff;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(129, 145, 181, 0.01698),0.0335rem 0.067rem 0.402rem rgba(129, 145, 181, 0.024),0.0625rem 0.125rem 0.75rem rgba(129, 145, 181, 0.03),0.1125rem 0.225rem 1.35rem rgba(129, 145, 181, 0.036),0.2085rem 0.417rem 2.502rem rgba(129, 145, 181, 0.04302),0.5rem 1rem 6rem rgba(129, 145, 181, 0.06),0 0 0 0.0625rem rgba(129, 145, 181, 0.015);--pico-h1-color:#2d3138;--pico-h2-color:#373c44;--pico-h3-color:#424751;--pico-h4-color:#4d535e;--pico-h5-color:#5c6370;--pico-h6-color:#646b79;--pico-mark-background-color:#fde7c0;--pico-mark-color:#0f1114;--pico-ins-color:#1d6a54;--pico-del-color:#883935;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#f3f5f7;--pico-code-color:#646b79;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#fbfcfc;--pico-form-element-selected-background-color:#dfe3eb;--pico-form-element-border-color:#cfd5e2;--pico-form-element-color:#23262c;--pico-form-element-placeholder-color:var(--pico-muted-color);--pico-form-element-active-background-color:#fff;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#b86a6b;--pico-form-element-invalid-active-border-color:#c84f48;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#4c9b8a;--pico-form-element-valid-active-border-color:#279977;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#bfc7d9;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#dfe3eb;--pico-range-active-border-color:#bfc7d9;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:var(--pico-background-color);--pico-card-border-color:var(--pico-muted-border-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#fbfcfc;--pico-dropdown-background-color:#fff;--pico-dropdown-border-color:#eff1f4;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#eff1f4;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(232, 234, 237, 0.75);--pico-progress-background-color:#dfe3eb;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 155, 138)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200, 79, 72)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:light}:root:not([data-theme=dark]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),[data-theme=light] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme]){--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}:root:not([data-theme]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}:root:not([data-theme]) details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}:root:not([data-theme]) [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}}[data-theme=dark]{--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}[data-theme=dark] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}[data-theme=dark] details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}[data-theme=dark] [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--pico-primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family);text-underline-offset:var(--pico-text-underline-offset);text-rendering:optimizeLegibility;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{width:100%;margin:0}main{display:block}body>footer,body>header,body>main{padding-block:var(--pico-block-spacing-vertical)}section{margin-bottom:var(--pico-block-spacing-vertical)}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:var(--pico-spacing);padding-left:var(--pico-spacing)}@media (min-width:576px){.container{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){.container{max-width:700px}}@media (min-width:1024px){.container{max-width:950px}}@media (min-width:1280px){.container{max-width:1200px}}@media (min-width:1536px){.container{max-width:1450px}}.grid{grid-column-gap:var(--pico-grid-column-gap);grid-row-gap:var(--pico-grid-row-gap);display:grid;grid-template-columns:1fr}@media (min-width:768px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}.overflow-auto{overflow:auto}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-style:normal;font-weight:var(--pico-font-weight)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family)}h1{--pico-color:var(--pico-h1-color)}h2{--pico-color:var(--pico-h2-color)}h3{--pico-color:var(--pico-h3-color)}h4{--pico-color:var(--pico-h4-color)}h5{--pico-color:var(--pico-h5-color)}h6{--pico-color:var(--pico-h6-color)}:where(article,address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--pico-typography-spacing-top)}p{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup>*{margin-top:0;margin-bottom:0}hgroup>:not(:first-child):last-child{--pico-color:var(--pico-muted-color);--pico-font-weight:unset;font-size:1rem}:where(ol,ul) li{margin-bottom:calc(var(--pico-typography-spacing-vertical) * .25)}:where(dl,ol,ul) :where(dl,ol,ul){margin:0;margin-top:calc(var(--pico-typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--pico-mark-background-color);color:var(--pico-mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--pico-typography-spacing-vertical) 0;padding:var(--pico-spacing);border-right:none;border-left:.25rem solid var(--pico-blockquote-border-color);border-inline-start:0.25rem solid var(--pico-blockquote-border-color);border-inline-end:none}blockquote footer{margin-top:calc(var(--pico-typography-spacing-vertical) * .5);color:var(--pico-blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--pico-ins-color);text-decoration:none}del{color:var(--pico-del-color)}::-moz-selection{background-color:var(--pico-text-selection-color)}::selection{background-color:var(--pico-text-selection-color)}:where(a:not([role=button])),[role=link]{--pico-color:var(--pico-primary);--pico-background-color:transparent;--pico-underline:var(--pico-primary-underline);outline:0;background-color:var(--pico-background-color);color:var(--pico-color);-webkit-text-decoration:var(--pico-text-decoration);text-decoration:var(--pico-text-decoration);text-decoration-color:var(--pico-underline);text-underline-offset:0.125em;transition:background-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition)}:where(a:not([role=button])):is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-primary-hover);--pico-underline:var(--pico-primary-hover-underline);--pico-text-decoration:underline}:where(a:not([role=button])):focus-visible,[role=link]:focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}:where(a:not([role=button])).secondary,[role=link].secondary{--pico-color:var(--pico-secondary);--pico-underline:var(--pico-secondary-underline)}:where(a:not([role=button])).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-underline:var(--pico-secondary-hover-underline)}:where(a:not([role=button])).contrast,[role=link].contrast{--pico-color:var(--pico-contrast);--pico-underline:var(--pico-contrast-underline)}:where(a:not([role=button])).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-underline:var(--pico-contrast-hover-underline)}a[role=button]{display:inline-block}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[role=button],[type=button],[type=file]::file-selector-button,[type=reset],[type=submit],button{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);--pico-color:var(--pico-primary-inverse);--pico-box-shadow:var(--pico-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:1rem;line-height:var(--pico-line-height);text-align:center;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}[role=button]:is(:hover,:active,:focus),[role=button]:is([aria-current]:not([aria-current=false])),[type=button]:is(:hover,:active,:focus),[type=button]:is([aria-current]:not([aria-current=false])),[type=file]::file-selector-button:is(:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])),[type=reset]:is(:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false])),[type=submit]:is(:hover,:active,:focus),[type=submit]:is([aria-current]:not([aria-current=false])),button:is(:hover,:active,:focus),button:is([aria-current]:not([aria-current=false])){--pico-background-color:var(--pico-primary-hover-background);--pico-border-color:var(--pico-primary-hover-border);--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--pico-color:var(--pico-primary-inverse)}[role=button]:focus,[role=button]:is([aria-current]:not([aria-current=false])):focus,[type=button]:focus,[type=button]:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus,[type=submit]:focus,[type=submit]:is([aria-current]:not([aria-current=false])):focus,button:focus,button:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}[type=button],[type=reset],[type=submit]{margin-bottom:var(--pico-spacing)}:is(button,[type=submit],[type=button],[role=button]).secondary,[type=file]::file-selector-button,[type=reset]{--pico-background-color:var(--pico-secondary-background);--pico-border-color:var(--pico-secondary-border);--pico-color:var(--pico-secondary-inverse);cursor:pointer}:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border);--pico-color:var(--pico-secondary-inverse)}:is(button,[type=submit],[type=button],[role=button]).secondary:focus,:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}:is(button,[type=submit],[type=button],[role=button]).contrast{--pico-background-color:var(--pico-contrast-background);--pico-border-color:var(--pico-contrast-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-contrast-hover-background);--pico-border-color:var(--pico-contrast-hover-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:focus,:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}:is(button,[type=submit],[type=button],[role=button]).outline,[type=reset].outline{--pico-background-color:transparent;--pico-color:var(--pico-primary);--pico-border-color:var(--pico-primary)}:is(button,[type=submit],[type=button],[role=button]).outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:transparent;--pico-color:var(--pico-primary-hover);--pico-border-color:var(--pico-primary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary,[type=reset].outline{--pico-color:var(--pico-secondary);--pico-border-color:var(--pico-secondary)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-border-color:var(--pico-secondary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast{--pico-color:var(--pico-contrast);--pico-border-color:var(--pico-contrast)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-border-color:var(--pico-contrast-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]){opacity:.5;pointer-events:none}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--pico-spacing)/ 2) var(--pico-spacing);border-bottom:var(--pico-border-width) solid var(--pico-table-border-color);background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--pico-border-width) solid var(--pico-table-border-color);border-bottom:0}table.striped tbody tr:nth-child(odd) td,table.striped tbody tr:nth-child(odd) th{background-color:var(--pico-table-row-stripped-background-color)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-size:.875em;font-family:var(--pico-font-family)}pre code{font-size:inherit;font-family:inherit}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre{border-radius:var(--pico-border-radius);background:var(--pico-code-background-color);color:var(--pico-code-color);font-weight:var(--pico-font-weight);line-height:initial}code,kbd{display:inline-block;padding:.375rem}pre{display:block;margin-bottom:var(--pico-spacing);overflow-x:auto}pre>code{display:block;padding:var(--pico-spacing);background:0 0;line-height:var(--pico-line-height)}kbd{background-color:var(--pico-code-kbd-background-color);color:var(--pico-code-kbd-color);vertical-align:baseline}figure{display:block;margin:0;padding:0}figure figcaption{padding:calc(var(--pico-spacing) * .5) 0;color:var(--pico-muted-color)}hr{height:0;margin:var(--pico-typography-spacing-vertical) 0;border:0;border-top:1px solid var(--pico-muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--pico-line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2)}fieldset{width:100%;margin:0;margin-bottom:var(--pico-spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--pico-spacing) * .375);color:var(--pico-color);font-weight:var(--pico-form-label-font-weight,var(--pico-font-weight))}fieldset legend{margin-bottom:calc(var(--pico-spacing) * .5)}button[type=submit],input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal)}input,select,textarea{--pico-background-color:var(--pico-form-element-background-color);--pico-border-color:var(--pico-form-element-border-color);--pico-color:var(--pico-form-element-color);--pico-box-shadow:none;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--pico-background-color:var(--pico-form-element-active-background-color)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--pico-border-color:var(--pico-form-element-active-border-color)}:where(select,textarea):not([readonly]):focus,input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus{--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],label[aria-disabled=true],select[disabled],textarea[disabled]{opacity:var(--pico-form-element-disabled-opacity);pointer-events:none}label[aria-disabled=true] input[disabled]{opacity:1}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid]{padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal)!important;padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=false]:not(select){background-image:var(--pico-icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=true]:not(select){background-image:var(--pico-icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--pico-border-color:var(--pico-form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--pico-border-color:var(--pico-form-element-valid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--pico-border-color:var(--pico-form-element-invalid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--pico-form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--pico-spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal);padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);background-image:var(--pico-icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}select[multiple] option:checked{background:var(--pico-form-element-selected-background-color);color:var(--pico-form-element-color)}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}textarea{display:block;resize:vertical}textarea[aria-invalid]{--pico-icon-height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);background-position:top right .75rem!important;background-size:1rem var(--pico-icon-height)!important}:where(input,select,textarea,fieldset,.grid)+small{display:block;width:100%;margin-top:calc(var(--pico-spacing) * -.75);margin-bottom:var(--pico-spacing);color:var(--pico-muted-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=false]+small{color:var(--pico-ins-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=true]+small{color:var(--pico-del-color)}label>:where(input,select,textarea){margin-top:calc(var(--pico-spacing) * .25)}label:has([type=checkbox],[type=radio]){width:-moz-fit-content;width:fit-content;cursor:pointer}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-inline-end:.5em;border-width:var(--pico-border-width);vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-bottom:0;cursor:pointer}[type=checkbox]~label:not(:last-of-type),[type=radio]~label:not(:last-of-type){margin-inline-end:1em}[type=checkbox]:indeterminate{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--pico-background-color:var(--pico-switch-background-color);--pico-color:var(--pico-switch-color);width:2.25em;height:1.25em;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:1.25em;background-color:var(--pico-background-color);line-height:1.25em}[type=checkbox][role=switch]:not([aria-invalid]){--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:before{display:block;aspect-ratio:1;height:100%;border-radius:50%;background-color:var(--pico-color);box-shadow:var(--pico-switch-thumb-box-shadow);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:focus{--pico-background-color:var(--pico-switch-background-color);--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:checked{--pico-background-color:var(--pico-switch-checked-background-color);--pico-border-color:var(--pico-switch-checked-background-color);background-image:none}[type=checkbox][role=switch]:checked::before{margin-inline-start:calc(2.25em - 1.25em)}[type=checkbox][role=switch][disabled]{--pico-background-color:var(--pico-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus{--pico-background-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true]{--pico-background-color:var(--pico-form-element-invalid-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus,[type=radio][aria-invalid=false]:checked,[type=radio][aria-invalid=false]:checked:active,[type=radio][aria-invalid=false]:checked:focus{--pico-border-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=radio]:checked:active[aria-invalid=true],[type=radio]:checked:focus[aria-invalid=true],[type=radio]:checked[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--pico-icon-position:0.75rem;--pico-icon-width:1rem;padding-right:calc(var(--pico-icon-width) + var(--pico-icon-position));background-image:var(--pico-icon-date);background-position:center right var(--pico-icon-position);background-size:var(--pico-icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--pico-icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--pico-icon-width);margin-right:calc(var(--pico-icon-width) * -1);margin-left:var(--pico-icon-position);opacity:0}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--pico-form-element-spacing-horizontal)!important;background-image:none!important}}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}[type=file]{--pico-color:var(--pico-muted-color);margin-left:calc(var(--pico-outline-width) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) 0;padding-left:var(--pico-outline-width);border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{margin-right:calc(var(--pico-spacing)/ 2);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal)}[type=file]:is(:hover,:active,:focus)::file-selector-button{--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border)}[type=file]:focus::file-selector-button{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-webkit-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-moz-range-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-moz-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-ms-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-ms-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-moz-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-ms-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]:active,[type=range]:focus-within{--pico-range-border-color:var(--pico-range-active-border-color);--pico-range-thumb-color:var(--pico-range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem);background-image:var(--pico-icon-search);background-position:center left calc(var(--pico-form-element-spacing-horizontal) + .125rem);background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--pico-icon-search),var(--pico-icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--pico-icon-search),var(--pico-icon-invalid)}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}details{display:block;margin-bottom:var(--pico-spacing)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--pico-transition)}details summary:not([role]){color:var(--pico-accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;margin-inline-start:calc(var(--pico-spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--pico-transition)}details summary:focus{outline:0}details summary:focus:not([role]){color:var(--pico-accordion-active-summary-color)}details summary:focus-visible:not([role]){outline:var(--pico-outline-width) solid var(--pico-primary-focus);outline-offset:calc(var(--pico-spacing,1rem) * 0.5);color:var(--pico-primary)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--pico-line-height,1.5))}details[open]>summary{margin-bottom:var(--pico-spacing)}details[open]>summary:not([role]):not(:focus){color:var(--pico-accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin-bottom:var(--pico-block-spacing-vertical);padding:var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal);border-radius:var(--pico-border-radius);background:var(--pico-card-background-color);box-shadow:var(--pico-card-box-shadow)}article>footer,article>header{margin-right:calc(var(--pico-block-spacing-horizontal) * -1);margin-left:calc(var(--pico-block-spacing-horizontal) * -1);padding:calc(var(--pico-block-spacing-vertical) * .66) var(--pico-block-spacing-horizontal);background-color:var(--pico-card-sectioning-background-color)}article>header{margin-top:calc(var(--pico-block-spacing-vertical) * -1);margin-bottom:var(--pico-block-spacing-vertical);border-bottom:var(--pico-border-width) solid var(--pico-card-border-color);border-top-right-radius:var(--pico-border-radius);border-top-left-radius:var(--pico-border-radius)}article>footer{margin-top:var(--pico-block-spacing-vertical);margin-bottom:calc(var(--pico-block-spacing-vertical) * -1);border-top:var(--pico-border-width) solid var(--pico-card-border-color);border-bottom-right-radius:var(--pico-border-radius);border-bottom-left-radius:var(--pico-border-radius)}details.dropdown{position:relative;border-bottom:none}details.dropdown summary::after,details.dropdown>a::after,details.dropdown>button::after{display:block;width:1rem;height:calc(1rem * var(--pico-line-height,1.5));margin-inline-start:.25rem;float:right;transform:rotate(0) translateX(.2rem);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:""}nav details.dropdown{margin-bottom:0}details.dropdown summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-form-element-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-form-element-background-color);color:var(--pico-form-element-placeholder-color);line-height:inherit;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}details.dropdown summary:not([role]):active,details.dropdown summary:not([role]):focus{border-color:var(--pico-form-element-active-border-color);background-color:var(--pico-form-element-active-background-color)}details.dropdown summary:not([role]):focus{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}details.dropdown summary:not([role]):focus-visible{outline:0}details.dropdown summary:not([role])[aria-invalid=false]{--pico-form-element-border-color:var(--pico-form-element-valid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-valid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-valid-focus-color)}details.dropdown summary:not([role])[aria-invalid=true]{--pico-form-element-border-color:var(--pico-form-element-invalid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-invalid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-invalid-focus-color)}nav details.dropdown{display:inline;margin:calc(var(--pico-nav-element-spacing-vertical) * -1) 0}nav details.dropdown summary::after{transform:rotate(0) translateX(0)}nav details.dropdown summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-nav-link-spacing-vertical) * 2);padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav details.dropdown summary:not([role]):focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}details.dropdown summary+ul{display:flex;z-index:99;position:absolute;left:0;flex-direction:column;width:100%;min-width:-moz-fit-content;min-width:fit-content;margin:0;margin-top:var(--pico-outline-width);padding:0;border:var(--pico-border-width) solid var(--pico-dropdown-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-dropdown-background-color);box-shadow:var(--pico-dropdown-box-shadow);color:var(--pico-dropdown-color);white-space:nowrap;opacity:0;transition:opacity var(--pico-transition),transform 0s ease-in-out 1s}details.dropdown summary+ul[dir=rtl]{right:0;left:auto}details.dropdown summary+ul li{width:100%;margin-bottom:0;padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);list-style:none}details.dropdown summary+ul li:first-of-type{margin-top:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown summary+ul li:last-of-type{margin-bottom:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown summary+ul li a{display:block;margin:calc(var(--pico-form-element-spacing-vertical) * -.5) calc(var(--pico-form-element-spacing-horizontal) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);overflow:hidden;border-radius:0;color:var(--pico-dropdown-color);text-decoration:none;text-overflow:ellipsis}details.dropdown summary+ul li a:active,details.dropdown summary+ul li a:focus,details.dropdown summary+ul li a:focus-visible,details.dropdown summary+ul li a:hover,details.dropdown summary+ul li a[aria-current]:not([aria-current=false]){background-color:var(--pico-dropdown-hover-background-color)}details.dropdown summary+ul li label{width:100%}details.dropdown summary+ul li:has(label):hover{background-color:var(--pico-dropdown-hover-background-color)}details.dropdown[open] summary{margin-bottom:0}details.dropdown[open] summary+ul{transform:scaleY(1);opacity:1;transition:opacity var(--pico-transition),transform 0s ease-in-out 0s}details.dropdown[open] summary::before{display:block;z-index:1;position:fixed;width:100vw;height:100vh;inset:0;background:0 0;content:"";cursor:default}label>details.dropdown{margin-top:calc(var(--pico-spacing) * .25)}[role=group],[role=search]{display:inline-flex;position:relative;width:100%;margin-bottom:var(--pico-spacing);border-radius:var(--pico-border-radius);box-shadow:var(--pico-group-box-shadow,0 0 0 transparent);vertical-align:middle;transition:box-shadow var(--pico-transition)}[role=group] input:not([type=checkbox],[type=radio]),[role=group] select,[role=group]>*,[role=search] input:not([type=checkbox],[type=radio]),[role=search] select,[role=search]>*{position:relative;flex:1 1 auto;margin-bottom:0}[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=group]>:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child),[role=search]>:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}[role=group] input:not([type=checkbox],[type=radio]):not(:last-child),[role=group] select:not(:last-child),[role=group]>:not(:last-child),[role=search] input:not([type=checkbox],[type=radio]):not(:last-child),[role=search] select:not(:last-child),[role=search]>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}[role=group] input:not([type=checkbox],[type=radio]):focus,[role=group] select:focus,[role=group]>:focus,[role=search] input:not([type=checkbox],[type=radio]):focus,[role=search] select:focus,[role=search]>:focus{z-index:2}[role=group] [role=button]:not(:first-child),[role=group] [type=button]:not(:first-child),[role=group] [type=reset]:not(:first-child),[role=group] [type=submit]:not(:first-child),[role=group] button:not(:first-child),[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=search] [role=button]:not(:first-child),[role=search] [type=button]:not(:first-child),[role=search] [type=reset]:not(:first-child),[role=search] [type=submit]:not(:first-child),[role=search] button:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child){margin-left:calc(var(--pico-border-width) * -1)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=reset],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=reset],[role=search] [type=submit],[role=search] button{width:auto}@supports selector(:has(*)){[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-button)}[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select,[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select{border-color:transparent}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus),[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-input)}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) button,[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) button{--pico-button-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-border);--pico-button-hover-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-hover-border)}[role=group] [role=button]:focus,[role=group] [type=button]:focus,[role=group] [type=reset]:focus,[role=group] [type=submit]:focus,[role=group] button:focus,[role=search] [role=button]:focus,[role=search] [type=button]:focus,[role=search] [type=reset]:focus,[role=search] [type=submit]:focus,[role=search] button:focus{box-shadow:none}}[role=search]>:first-child{border-top-left-radius:5rem;border-bottom-left-radius:5rem}[role=search]>:last-child{border-top-right-radius:5rem;border-bottom-right-radius:5rem}[aria-busy=true]:not(input,select,textarea,html){white-space:nowrap}[aria-busy=true]:not(input,select,textarea,html)::before{display:inline-block;width:1em;height:1em;background-image:var(--pico-icon-loading);background-size:1em auto;background-repeat:no-repeat;content:"";vertical-align:-.125em}[aria-busy=true]:not(input,select,textarea,html):not(:empty)::before{margin-inline-end:calc(var(--pico-spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html):empty{text-align:center}[role=button][aria-busy=true],[type=button][aria-busy=true],[type=reset][aria-busy=true],[type=submit][aria-busy=true],a[aria-busy=true],button[aria-busy=true]{pointer-events:none}:root{--pico-scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:0;border:0;-webkit-backdrop-filter:var(--pico-modal-overlay-backdrop-filter);backdrop-filter:var(--pico-modal-overlay-backdrop-filter);background-color:var(--pico-modal-overlay-background-color);color:var(--pico-color)}dialog article{width:100%;max-height:calc(100vh - var(--pico-spacing) * 2);margin:var(--pico-spacing);overflow:auto}@media (min-width:576px){dialog article{max-width:510px}}@media (min-width:768px){dialog article{max-width:700px}}dialog article>header>*{margin-bottom:0}dialog article>header .close,dialog article>header :is(a,button)[rel=prev]{margin:0;margin-left:var(--pico-spacing);padding:0;float:right}dialog article>footer{text-align:right}dialog article>footer [role=button],dialog article>footer button{margin-bottom:0}dialog article>footer [role=button]:not(:first-of-type),dialog article>footer button:not(:first-of-type){margin-left:calc(var(--pico-spacing) * .5)}dialog article .close,dialog article :is(a,button)[rel=prev]{display:block;width:1rem;height:1rem;margin-top:calc(var(--pico-spacing) * -1);margin-bottom:var(--pico-spacing);margin-left:auto;border:none;background-image:var(--pico-icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;background-color:transparent;opacity:.5;transition:opacity var(--pico-transition)}dialog article .close:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),dialog article :is(a,button)[rel=prev]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}.modal-is-open{padding-right:var(--pico-scrollbar-width,0);overflow:hidden;pointer-events:none;touch-action:none}.modal-is-open dialog{pointer-events:auto;touch-action:auto}:where(.modal-is-opening,.modal-is-closing) dialog,:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-duration:.2s;animation-timing-function:ease-in-out;animation-fill-mode:both}:where(.modal-is-opening,.modal-is-closing) dialog{animation-duration:.8s;animation-name:modal-overlay}:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-delay:.2s;animation-name:modal}.modal-is-closing dialog,.modal-is-closing dialog>article{animation-delay:0s;animation-direction:reverse}@keyframes modal-overlay{from{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}}@keyframes modal{from{transform:translateY(-100%);opacity:0}}:where(nav li)::before{float:left;content:""}nav,nav ul{display:flex}nav{justify-content:space-between;overflow:visible}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--pico-nav-element-spacing-vertical) var(--pico-nav-element-spacing-horizontal)}nav li :where(a,[role=link]){display:inline-block;margin:calc(var(--pico-nav-link-spacing-vertical) * -1) calc(var(--pico-nav-link-spacing-horizontal) * -1);padding:var(--pico-nav-link-spacing-vertical) var(--pico-nav-link-spacing-horizontal);border-radius:var(--pico-border-radius)}nav li :where(a,[role=link]):not(:hover){text-decoration:none}nav li [role=button],nav li [type=button],nav li button,nav li input:not([type=checkbox],[type=radio],[type=range],[type=file]),nav li select{height:auto;margin-right:inherit;margin-bottom:0;margin-left:inherit;padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){margin-inline-start:var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li a{margin:calc(var(--pico-nav-link-spacing-vertical) * -1) 0;margin-inline-start:calc(var(--pico-nav-link-spacing-horizontal) * -1)}nav[aria-label=breadcrumb] ul li:not(:last-child)::after{display:inline-block;position:absolute;width:calc(var(--pico-nav-link-spacing-horizontal) * 4);margin:0 calc(var(--pico-nav-link-spacing-horizontal) * -1);content:var(--pico-nav-breadcrumb-divider);color:var(--pico-muted-color);text-align:center;text-decoration:none;white-space:nowrap}nav[aria-label=breadcrumb] a[aria-current]:not([aria-current=false]){background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--pico-nav-element-spacing-vertical) * .5) var(--pico-nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--pico-spacing) * .5);overflow:hidden;border:0;border-radius:var(--pico-border-radius);background-color:var(--pico-progress-background-color);color:var(--pico-progress-color)}progress::-webkit-progress-bar{border-radius:var(--pico-border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--pico-progress-color);-webkit-transition:inline-size var(--pico-transition);transition:inline-size var(--pico-transition)}progress::-moz-progress-bar{background-color:var(--pico-progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--pico-progress-background-color) linear-gradient(to right,var(--pico-progress-color) 30%,var(--pico-progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--pico-border-radius);background:var(--pico-tooltip-background-color);content:attr(data-tooltip);color:var(--pico-tooltip-color);font-style:normal;font-weight:var(--pico-font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--pico-tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{--pico-tooltip-slide-to:translate(-50%, -0.25rem);transform:translate(-50%,.75rem);animation-duration:.2s;animation-fill-mode:forwards;animation-name:tooltip-slide;opacity:0}[data-tooltip]:focus::after,[data-tooltip]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, 0rem);transform:translate(-50%,-.25rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{--pico-tooltip-slide-to:translate(-50%, 0.25rem);transform:translate(-50%,-.75rem);animation-name:tooltip-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, -0.3rem);transform:translate(-50%,-.5rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{--pico-tooltip-slide-to:translate(-0.25rem, -50%);transform:translate(.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{--pico-tooltip-caret-slide-to:translate(0.3rem, -50%);transform:translate(.05rem,-50%);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{--pico-tooltip-slide-to:translate(0.25rem, -50%);transform:translate(-.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{--pico-tooltip-caret-slide-to:translate(-0.3rem, -50%);transform:translate(-.05rem,-50%);animation-name:tooltip-caret-slide}}@keyframes tooltip-slide{to{transform:var(--pico-tooltip-slide-to);opacity:1}}@keyframes tooltip-caret-slide{50%{opacity:0}to{transform:var(--pico-tooltip-caret-slide-to);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}} +\ No newline at end of file diff --git a/src/infrastructure/boot/environment.ts b/src/infrastructure/boot/environment.ts @@ -0,0 +1,60 @@ +import * as V from "$valita"; + +export const environement = V.object({ + /** + * HTTP + */ + HTTPS_HOST: V.string(), + HTTPS_PORT: V.unknown().map(Number), + HTTPS_KEY: V.string().map(Deno.readTextFileSync).optional(), + HTTPS_CERT: V.string().map(Deno.readTextFileSync).optional(), + + /** + * PERSISTANCE + */ + PERSISTANCE: V.union(V.literal("memory"), V.literal("postgres")), + + /** + * MAILER + */ + MAILER: V.union(V.literal("fake"), V.literal("smtp")), + SMTP_HOST: V.string().default(""), + SMTP_PORT: V.unknown().map(Number).default(25), + SMTP_FROM: V.string().default("kycid@smtp.local"), + SMTP_USER: V.string().optional(), + SMTP_PASS: V.string().optional(), + SMTP_TLS: V.unknown().optional().map(Boolean), + + /** + * SMS SENDER + */ + SMS_PROVIDER: V.union(V.literal("fake"), V.literal("swisscom")), + SWISSCOM_SMS_TOKEN_ENDPOINT: V.string().default( + "https://api.swisscom.com/oauth2/token", + ), + SWISSCOM_SMS_MESSAGE_ENDPOINT: V.string().default( + "https://api.swisscom.com/messaging/sms", + ), + SWISSCOM_SMS_CLIENT_ID: V.string().default(""), + SWISSCOM_SMS_CLIENT_SECRET: V.string().default(""), + + /** + * CONFIG + */ + OAUTH2_CLIENTS: V.string().default("./clients.json"), + IDDOCUMENT_ADMINS: V.string().default("./admins.json"), + + /** + * TESSERACT + */ + TESSERACT_PATH: V.string(), +}); + +export function createEnvironment() { + return { + environment: environement.parse( + Deno.env.toObject(), + { mode: "strip" }, + ), + }; +} diff --git a/src/infrastructure/boot/mailer.ts b/src/infrastructure/boot/mailer.ts @@ -0,0 +1,17 @@ +import { createFakeMailer } from "#infrastructure/fake/mailer.ts"; +import { createSmtpMailer } from "#infrastructure/smtp/factory.ts"; + +export type MailerDependencies = { + environment: { + MAILER: "fake" | "smtp"; + }; +} & Parameters<typeof createSmtpMailer>[0]; + +export function createMailer(dependencies: MailerDependencies) { + switch (dependencies.environment.MAILER) { + case "fake": + return createFakeMailer(); + case "smtp": + return createSmtpMailer(dependencies); + } +} diff --git a/src/infrastructure/boot/persistance.ts b/src/infrastructure/boot/persistance.ts @@ -0,0 +1,19 @@ +import { createMemoryPersistance } from "#infrastructure/memory/factory.ts"; +import { createPostgresPersistance } from "#infrastructure/postgres/factory.ts"; + +export type PersistanceDependencies = { + environment: { + PERSISTANCE: "memory" | "postgres"; + }; +}; + +export function createPersistance( + dependencies: PersistanceDependencies, +) { + switch (dependencies.environment.PERSISTANCE) { + case "memory": + return createMemoryPersistance(); + case "postgres": + return createPostgresPersistance(); + } +} diff --git a/src/infrastructure/boot/sms.ts b/src/infrastructure/boot/sms.ts @@ -0,0 +1,16 @@ +import { createFakeSms } from "#infrastructure/fake/sms.ts"; +import { SwisscomOptions } from "#infrastructure/swisscom/ekyc_send_sms_challenge.ts"; +import { createSwisscomSmsSender } from "#infrastructure/swisscom/factory.ts"; + +export type SwisscomDependencies = { + environment: SwisscomOptions & { SMS_PROVIDER: "fake" | "swisscom" }; +}; + +export function createSMSSender(dependencies: SwisscomDependencies) { + switch (dependencies.environment.SMS_PROVIDER) { + case "fake": + return createFakeSms(); + case "swisscom": + return createSwisscomSmsSender(dependencies); + } +} diff --git a/src/infrastructure/config/admin.ts b/src/infrastructure/config/admin.ts @@ -0,0 +1,20 @@ +import { AdminRepository } from "#core/application/id_document/admin_repository.ts"; +import { Admin } from "#core/domain/admin.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { EntityNotFound } from "#core/application/repository_error.ts"; + +export class ConfigAdminRepository implements AdminRepository { + constructor(private readonly path: string) { + } + + async find(id: UUID): Promise<Admin> { + const exists = (JSON.parse(await Deno.readTextFile(this.path)) as string[]) + .some(uuid => uuid === id.toString()) + + if (exists) { + return new Admin(id); + } + + throw new EntityNotFound(id.toString()); + } +} diff --git a/src/infrastructure/config/client.ts b/src/infrastructure/config/client.ts @@ -0,0 +1,35 @@ +import { ClientRepository } from "../../core/application/oauth2/client_repository.ts"; +import { EntityNotFound } from "../../core/application/repository_error.ts"; +import { Client } from "#core/domain/client.ts"; +import { Scope } from "#core/domain/scope.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export class ConfigClientRepositoryAdapter implements ClientRepository { + constructor(private readonly path: string) { + } + + async find(id: string): Promise<Client> { + const client = (JSON.parse(await Deno.readTextFile(this.path)) as { + id: string; + secret: string; + redirectUri: string; + scope: string; + description: string; + }[]) + .map((item) => + new Client( + new UUID(item.id), + new Token(item.secret), + new URL(item.redirectUri), + Scope.of(item.scope), + item.description, + ) + ) + .find((i) => i.id); + if (client) { + return client; + } + throw new EntityNotFound(id); + } +} diff --git a/src/infrastructure/config/factory.ts b/src/infrastructure/config/factory.ts @@ -0,0 +1,20 @@ +import { ConfigClientRepositoryAdapter } from "#infrastructure/config/client.ts"; +import { ConfigAdminRepository } from "#infrastructure/config/admin.ts"; + +export type ConfigDependencies = { + environment: { + OAUTH2_CLIENTS: string; + IDDOCUMENT_ADMINS: string; + }; +}; + +export function createConfig(dependencies: ConfigDependencies) { + return { + clientRepo: new ConfigClientRepositoryAdapter( + dependencies.environment.OAUTH2_CLIENTS, + ), + adminRepo: new ConfigAdminRepository( + dependencies.environment.IDDOCUMENT_ADMINS, + ), + }; +} diff --git a/src/infrastructure/fake/mailer.ts b/src/infrastructure/fake/mailer.ts @@ -0,0 +1,19 @@ +import { AuthEmailChallengeMailer } from "../../core/application/authn/email_challenge.ts"; + +export class FakeAuthEmailChallengeMailerAdapter + implements AuthEmailChallengeMailer { + public lastEmail: string | null = null; + public lastCode: string | null = null; + + send(email: string, code: string): void | Promise<void> { + this.lastEmail = email; + this.lastCode = code; + console.log("AUTH EMAIL CHALLENGE", email, code); + } +} + +export function createFakeMailer() { + return { + authEmailChallengeMailer: new FakeAuthEmailChallengeMailerAdapter(), + }; +} diff --git a/src/infrastructure/fake/sms.ts b/src/infrastructure/fake/sms.ts @@ -0,0 +1,18 @@ +import { PhoneSmsChallengeSender } from "../../core/application/phone/register.ts"; + +export class FakePhoneSmsChallengeSender implements PhoneSmsChallengeSender { + public lastPhoneNumber: string | null = null; + public lastCode: string | null = null; + + send(phoneNumber: string, code: string): void { + this.lastPhoneNumber = phoneNumber; + this.lastCode = code; + console.log("send sms", phoneNumber, code); + } +} + +export function createFakeSms() { + return { + phoneSmsChallengeSender: new FakePhoneSmsChallengeSender(), + }; +} diff --git a/src/infrastructure/memory/auth.ts b/src/infrastructure/memory/auth.ts @@ -0,0 +1,63 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { Auth } from "#core/domain/auth.ts"; +import { Email } from "#core/domain/email.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + AuthDto, + mapFromAuth, + mapToAuth, +} from "#infrastructure/memory/mapper/auth.ts"; + +export class MemoryAuthRepositoryAdapter implements AuthRepository { + constructor(private readonly entities: Map<string, AuthDto>) { + } + + find(id: UUID): Auth { + const entity = this.entities.get(id.toString()); + if (entity !== undefined) { + return mapToAuth(entity); + } + throw new EntityNotFound(id.toString()); + } + + findByEmail(email: Email): Auth { + const entity = Array.from(this.entities.values()).find((i) => + i.email === email.toString() + ); + if (entity !== undefined) { + return mapToAuth(entity); + } + throw new EntityNotFound(email.toString()); + } + + findBySessionToken(sessionToken: Token): Auth { + const entity = Array.from(this.entities.values()).find((i) => + i.sessionToken === sessionToken.toString() && + +i.sessionExpire > Date.now() + ); + if (entity !== undefined) { + return mapToAuth(entity); + } + throw new EntityNotFound(sessionToken.toString()); + } + + store(entity: Auth): void { + const dto = mapFromAuth(entity); + const latest = Math.max( + this.entities.get(dto.uuid)?.version ?? 0, + Array.from(this.entities.values()).find((i) => + i.email === entity.email.address.toString() + )?.version ?? 0, + ); + if (latest > dto.version) { + throw new EntityLocked(); + } + entity.version = ++dto.version; + this.entities.set(dto.uuid, dto); + } +} diff --git a/src/infrastructure/memory/customer_info.ts b/src/infrastructure/memory/customer_info.ts @@ -0,0 +1,43 @@ +import { + CustomerInfoRequest, + CustomerInfoResponse, + CustomerInfoUseCase, +} from "#core/application/customer_info.ts"; +import { AuthDto } from "#infrastructure/memory/mapper/auth.ts"; +import { IDDocumentDto } from "#infrastructure/memory/mapper/id_document.ts"; +import { PhoneEKYCDto } from "#infrastructure/memory/mapper/phone.ts"; + +export class MemoryCustomerInfoAdapter implements CustomerInfoUseCase { + constructor( + private readonly authEntities: Map<string, AuthDto>, + private readonly phoneEntities: Map<string, PhoneEKYCDto>, + private readonly idDocumentEntities: Map<string, IDDocumentDto>, + ) { + } + + execute(request: CustomerInfoRequest): CustomerInfoResponse { + const auth = Array.from(this.authEntities.values()) + .find((i) => i.uuid === request.uuid); + const phone = Array.from(this.phoneEntities.values()) + .find((i) => i.uuid === request.uuid); + const idDocument = Array.from(this.idDocumentEntities.values()) + .find((i) => i.uuid === request.uuid); + + return { + exists: Boolean(auth || phone || idDocument), + uuid: auth?.uuid ?? phone?.uuid ?? idDocument?.uuid ?? null, + email: auth?.email ?? null, + emailVerified: auth?.emailVerified ?? false, + phoneNumber: phone?.phoneNumber ?? null, + phoneNumberVerified: phone?.phoneNumberVerified ?? false, + firstName: idDocument?.firstName ?? null, + lastName: idDocument?.lastName ?? null, + birthDate: idDocument?.birthDate ?? null, + sex: idDocument?.sex ?? null, + nationality: idDocument?.nationality ?? null, + country: idDocument?.country ?? null, + idDocumentVerified: idDocument?.state === "approved", + idDocumentRegistered: idDocument?.state !== "capturing", + }; + } +} diff --git a/src/infrastructure/memory/factory.ts b/src/infrastructure/memory/factory.ts @@ -0,0 +1,53 @@ +import { MemoryAuthRepositoryAdapter } from "#infrastructure/memory/auth.ts"; +import { MemoryCustomerInfoAdapter } from "#infrastructure/memory/customer_info.ts"; +import { MemoryIDDocumentRepositoryAdapter } from "#infrastructure/memory/id_document.ts"; +import { MemoryIDDocumentListAdapter } from "#infrastructure/memory/id_document_list.ts"; +import { AuthDto } from "#infrastructure/memory/mapper/auth.ts"; +import { IDDocumentDto } from "#infrastructure/memory/mapper/id_document.ts"; +import { OAuth2FlowDto } from "#infrastructure/memory/mapper/oauth2flow.ts"; +import { PhoneEKYCDto } from "#infrastructure/memory/mapper/phone.ts"; +import { RateLimitDto } from "#infrastructure/memory/mapper/ratelimit.ts"; +import { MemoryOAuth2FlowRepositoryAdapter } from "#infrastructure/memory/oauth2_flow.ts"; +import { MemoryPhoneRepositoryAdapter } from "#infrastructure/memory/phone.ts"; +import { MemoryRateLimitRepositoryAdapter } from "#infrastructure/memory/ratelimit.ts"; + +export function createMemoryPersistance() { + const authEntities = new Map<string, AuthDto>(); + const phoneEntities = new Map<string, PhoneEKYCDto>(); + const oauth2flowEntities = new Map<string, OAuth2FlowDto>(); + const rateLimitEntities = new Map<string, RateLimitDto>(); + const idDocumentEntities = new Map<string, IDDocumentDto>(); + + const authRepo = new MemoryAuthRepositoryAdapter(authEntities); + const phoneRepo = new MemoryPhoneRepositoryAdapter(phoneEntities); + const flowRepo = new MemoryOAuth2FlowRepositoryAdapter(oauth2flowEntities); + const rateLimitRepo = new MemoryRateLimitRepositoryAdapter(rateLimitEntities); + const idDocumentRepo = new MemoryIDDocumentRepositoryAdapter( + idDocumentEntities, + ); + + const customerInfo = new MemoryCustomerInfoAdapter( + authEntities, + phoneEntities, + idDocumentEntities, + ); + + const idDocumentList = new MemoryIDDocumentListAdapter(idDocumentEntities); + + return { + authEntities, + phoneEntities, + oauth2flowEntities, + rateLimitEntities, + idDocumentEntities, + + authRepo, + phoneRepo, + flowRepo, + rateLimitRepo, + idDocumentRepo, + + customerInfo, + idDocumentList, + }; +} diff --git a/src/infrastructure/memory/id_document.ts b/src/infrastructure/memory/id_document.ts @@ -0,0 +1,32 @@ +import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; +import { EntityLocked } from "#core/application/repository_error.ts"; +import { IDDocument } from "#core/domain/id_document.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + IDDocumentDto, + mapFromIDDocument, + mapToIDDocument, +} from "#infrastructure/memory/mapper/id_document.ts"; + +export class MemoryIDDocumentRepositoryAdapter implements IDDocumentRepository { + constructor(private readonly entities: Map<string, IDDocumentDto>) { + } + + findOrCreate(id: UUID): IDDocument { + const dto = this.entities.get(id.toString()); + if (dto !== undefined) { + return mapToIDDocument(dto); + } + return new IDDocument(id); + } + + store(entity: IDDocument): void { + const dto = mapFromIDDocument(entity); + const latest = this.entities.get(dto.uuid)?.version ?? 0; + if (latest > dto.version) { + throw new EntityLocked(); + } + entity.version = ++dto.version; + this.entities.set(dto.uuid, dto); + } +} diff --git a/src/infrastructure/memory/id_document_list.ts b/src/infrastructure/memory/id_document_list.ts @@ -0,0 +1,40 @@ +import { + IDDocumentListRequest, + IDDocumentListResponse, + IDDocumentListUseCase, +} from "#core/application/id_document/list.ts"; + +import { IDDocumentDto } from "#infrastructure/memory/mapper/id_document.ts"; + +const NB_PER_PAGE = 10; + +export class MemoryIDDocumentListAdapter implements IDDocumentListUseCase { + constructor(private readonly idDocumentEntities: Map<string, IDDocumentDto>) { + } + + execute(request: IDDocumentListRequest): Promise<IDDocumentListResponse> { + const items = Array.from(this.idDocumentEntities.values()) + .filter((item) => item.state !== "capturing") + .filter((_, index) => index > (request?.cursor ?? 0)) + .slice(0, NB_PER_PAGE) + .map((i): IDDocumentListResponse["items"][number] => ({ + uuid: i.uuid, + firstName: i.firstName, + lastName: i.lastName, + birthDate: i.birthDate, + sex: i.sex, + nationality: i.nationality, + country: i.country, + docFront: i.front, + docBack: i.back, + faceLeft: i.faceLeft, + faceFront: i.faceFront, + faceRight: i.faceRight, + })); + + return Promise.resolve({ + items, + next: (request.cursor ?? 0) + NB_PER_PAGE, + }); + } +} diff --git a/src/infrastructure/memory/mapper/auth.ts b/src/infrastructure/memory/mapper/auth.ts @@ -0,0 +1,73 @@ +import { Auth } from "#core/domain/auth.ts"; +import { Code } from "#core/domain/code.ts"; +import { PasswordHash } from "#core/domain/crypto.ts"; +import { Email } from "#core/domain/email.ts"; +import { EmailChallenge } from "#core/domain/email_challenge.ts"; +import { Password } from "#core/domain/password.ts"; +import { SessionToken } from "#core/domain/session_token.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type AuthDto = { + uuid: string; + email: string; + emailVerified: boolean; + emailCode: string | null; + emailCodeExpire: Date; + emailChallengeRequest: number; + emailChallengeRequestExpire: Date; + emailChallengeAttempt: number; + emailChallengeAttemptExpire: Date; + passwordHash: string; + passwordAttempt: number; + passwordAttemptExpire: Date; + sessionToken: string | null; + sessionExpire: Date; + version: number; +}; + +export function mapFromAuth(auth: Auth): AuthDto { + return { + uuid: auth.id.toString(), + email: auth.email.address.toString(), + emailVerified: auth.email.verified, + emailCode: auth.email.code?.toString() ?? null, + emailCodeExpire: new Date(auth.email.codeExpire), + emailChallengeRequest: auth.email.request, + emailChallengeRequestExpire: new Date(auth.email.requestExpire), + emailChallengeAttempt: auth.email.attempt, + emailChallengeAttemptExpire: new Date(auth.email.attemptExpire), + passwordHash: auth.password.hash.toString(), + passwordAttempt: auth.password.attemptCount, + passwordAttemptExpire: new Date(auth.password.attemptExpire), + sessionToken: auth.session.valueOf()?.toString() ?? null, + sessionExpire: new Date(auth.session.expire), + version: auth.version, + }; +} + +export function mapToAuth(dto: AuthDto) { + return new Auth( + new UUID(dto.uuid), + new EmailChallenge( + new Email(dto.email), + dto.emailVerified, + dto.emailCode ? new Code(dto.emailCode) : undefined, + dto.emailCodeExpire.getTime(), + dto.emailChallengeRequest, + dto.emailChallengeRequestExpire.getTime(), + dto.emailChallengeAttempt, + dto.emailChallengeAttemptExpire.getTime(), + ), + new Password( + new PasswordHash(dto.passwordHash), + dto.passwordAttempt, + dto.passwordAttemptExpire?.getTime(), + ), + new SessionToken( + dto.sessionToken ? new Token(dto.sessionToken) : undefined, + dto.sessionExpire?.getTime(), + ), + dto.version, + ); +} diff --git a/src/infrastructure/memory/mapper/id_document.ts b/src/infrastructure/memory/mapper/id_document.ts @@ -0,0 +1,98 @@ +import { Admin } from "#core/domain/admin.ts"; +import { IDDocument, IDDocumentState } from "#core/domain/id_document.ts"; +import { IDInfo } from "#core/domain/id_info.ts"; +import { Picture } from "#core/domain/picture.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type IDInfoDto = { + firstName: string; + lastName: string; + birthDate: Date; + sex: string; + nationality: string; + country: string; +}; + +export type IDDocumentDto = { [K in keyof IDInfoDto]: IDInfoDto[K] | null } & { + uuid: string; + state: string; + back: string | null; + front: string | null; + faceLeft: string | null; + faceFront: string | null; + faceRight: string | null; + admin: string | null; + version: number; +}; + +const ToIDDocumentState = { + capturing: IDDocumentState.CAPTURING, + registered: IDDocumentState.REGISTERED, + approved: IDDocumentState.APPROVED, + declined: IDDocumentState.DECLINED, +}; + +const FromIDDocumentState = { + [IDDocumentState.CAPTURING]: "capturing", + [IDDocumentState.REGISTERED]: "registered", + [IDDocumentState.APPROVED]: "approved", + [IDDocumentState.DECLINED]: "declined", +}; + +export function mapToIDInfo(dto: IDInfoDto) { + return new IDInfo( + dto.firstName, + dto.lastName, + dto.birthDate, + dto.sex, + dto.nationality, + dto.country, + ); +} + +export function mapFromIDInfo(info: IDInfo): IDInfoDto { + return { + firstName: info.firstName, + lastName: info.lastName, + birthDate: info.birthDate, + sex: info.sex, + nationality: info.nationality, + country: info.country, + }; +} + +export function mapToIDDocument(dto: IDDocumentDto) { + return new IDDocument( + new UUID(dto.uuid), + ToIDDocumentState[dto.state as keyof typeof ToIDDocumentState], + dto.firstName ? mapToIDInfo(dto as never) : null, + dto.front ? new Picture(dto.front) : null, + dto.back ? new Picture(dto.back) : null, + dto.faceLeft ? new Picture(dto.faceLeft) : null, + dto.faceFront ? new Picture(dto.faceFront) : null, + dto.faceRight ? new Picture(dto.faceRight) : null, + dto.admin ? new Admin(new UUID(dto.admin)) : null, + dto.version, + ); +} + +export function mapFromIDDocument(idDocument: IDDocument) { + return { + uuid: idDocument.uuid.toString(), + state: FromIDDocumentState[idDocument.state], + info: idDocument.info ? mapFromIDInfo(idDocument.info) : null, + front: idDocument.front?.toString() ?? null, + back: idDocument.back?.toString() ?? null, + faceLeft: idDocument.faceLeft?.toString() ?? null, + faceFront: idDocument.faceFront?.toString() ?? null, + faceRight: idDocument.faceRight?.toString() ?? null, + admin: idDocument.admin?.uuid.toString() ?? null, + firstName: idDocument.info?.firstName ?? null, + lastName: idDocument.info?.lastName ?? null, + birthDate: idDocument.info?.birthDate ?? null, + sex: idDocument.info?.sex ?? null, + nationality: idDocument.info?.nationality ?? null, + country: idDocument.info?.country ?? null, + version: idDocument.version, + }; +} diff --git a/src/infrastructure/memory/mapper/oauth2flow.ts b/src/infrastructure/memory/mapper/oauth2flow.ts @@ -0,0 +1,44 @@ +import { Ephemeral } from "#core/domain/ephemeral.ts"; +import { OAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { Scope } from "#core/domain/scope.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type OAuth2FlowDto = { + uuid: string; + clientId: string; + scope: string; + state?: string | null; + resourceOwner?: string | null; + token?: string | null; + tokenExpire: Date; + version: number; +}; + +export function mapFromOAuth2Flow(flow: OAuth2Flow): OAuth2FlowDto { + return { + uuid: flow.id.toString(), + clientId: flow.clientId.toString(), + scope: flow.scope.toString(), + state: flow.state, + resourceOwner: flow.resourceOwner?.toString() ?? null, + token: flow.token?.toString() ?? null, + tokenExpire: new Date(flow.expire), + version: flow.version, + }; +} + +export function mapToOAuth2Flow(dto: OAuth2FlowDto) { + return new OAuth2Flow( + new UUID(dto.uuid), + new UUID(dto.clientId), + Scope.of(dto.scope), + dto.state, + dto.resourceOwner ? new UUID(dto.resourceOwner) : null, + new Ephemeral( + dto.token ? new Token(dto.token) : null, + dto.tokenExpire.getTime(), + ), + dto.version, + ); +} diff --git a/src/infrastructure/memory/mapper/phone.ts b/src/infrastructure/memory/mapper/phone.ts @@ -0,0 +1,54 @@ +import { Code } from "#core/domain/code.ts"; +import { PersonalPhoneNumber } from "#core/domain/personal_phone_number.ts"; +import { PhoneEKYC } from "#core/domain/phone_ekyc.ts"; +import { SmsChallenge } from "#core/domain/sms_challenge.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +export type PhoneEKYCDto = { + uuid: string; + phoneNumber: string | null; + phoneNumberVerified: boolean; + phoneNumberCode: string | null; + phoneNumberCodeExpire: Date; + phoneNumberChallengeRequest: number; + phoneNumberChallengeRequestExpire: Date; + phoneNumberChallengeAttempt: number; + phoneNumberChallengeAttemptExpire: Date; + version: number; +}; + +export function mapFromPhoneEKYC(phoneEKYC: PhoneEKYC): PhoneEKYCDto { + return { + uuid: phoneEKYC.id.toString(), + phoneNumber: phoneEKYC.phoneNumber?.toString() ?? null, + phoneNumberVerified: phoneEKYC.smsChallenge.verified, + phoneNumberCode: phoneEKYC.smsChallenge.code?.toString() ?? null, + phoneNumberCodeExpire: new Date(phoneEKYC.smsChallenge.codeExpire), + phoneNumberChallengeRequest: phoneEKYC.smsChallenge.request, + phoneNumberChallengeRequestExpire: new Date( + phoneEKYC.smsChallenge.requestExpire, + ), + phoneNumberChallengeAttempt: phoneEKYC.smsChallenge.attempt, + phoneNumberChallengeAttemptExpire: new Date( + phoneEKYC.smsChallenge.attemptExpire, + ), + version: phoneEKYC.version, + }; +} + +export function mapToPhoneEKYC(dto: PhoneEKYCDto) { + return new PhoneEKYC( + new UUID(dto.uuid), + dto.phoneNumber ? new PersonalPhoneNumber(dto.phoneNumber) : undefined, + new SmsChallenge( + dto.phoneNumberVerified, + dto.phoneNumberCode ? new Code(dto.phoneNumberCode) : undefined, + dto.phoneNumberCodeExpire.getTime(), + dto.phoneNumberChallengeRequest, + dto.phoneNumberChallengeRequestExpire.getTime(), + dto.phoneNumberChallengeAttempt, + dto.phoneNumberChallengeAttemptExpire.getTime(), + ), + dto.version, + ); +} diff --git a/src/infrastructure/memory/mapper/ratelimit.ts b/src/infrastructure/memory/mapper/ratelimit.ts @@ -0,0 +1,27 @@ +import { RATE_LIMIT, RATE_LIMIT_TTL } from "#core/domain/constants.ts"; +import { Limiter } from "#core/domain/limiter.ts"; +import { RateLimit } from "#core/domain/rate_limit.ts"; + +export type RateLimitDto = { + key: string; + count: number; + expire: Date; + version: number; +}; + +export function mapFromRateLimit(rateLimit: RateLimit): RateLimitDto { + return { + key: rateLimit.key, + count: rateLimit.limiter.count, + expire: new Date(rateLimit.limiter.expire), + version: rateLimit.version, + }; +} + +export function mapToRateLimit(dto: RateLimitDto) { + return new RateLimit( + dto.key, + new Limiter(RATE_LIMIT, RATE_LIMIT_TTL, dto.count, dto.expire.getTime()), + dto.version, + ); +} diff --git a/src/infrastructure/memory/oauth2_flow.ts b/src/infrastructure/memory/oauth2_flow.ts @@ -0,0 +1,45 @@ +import { OAuth2FlowRepository } from "#core/application/oauth2/flow_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { OAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + mapFromOAuth2Flow, + mapToOAuth2Flow, + OAuth2FlowDto, +} from "./mapper/oauth2flow.ts"; + +export class MemoryOAuth2FlowRepositoryAdapter implements OAuth2FlowRepository { + constructor(private readonly entities: Map<string, OAuth2FlowDto>) { + } + + find(id: UUID): OAuth2Flow { + const entity = this.entities.get(id.toString()); + if (entity !== undefined) { + return mapToOAuth2Flow(entity); + } + throw new EntityNotFound(id.toString()); + } + + findByToken(token: Token): OAuth2Flow { + const entity = Array.from(this.entities.values()) + .find((item) => item.token === token.toString()); + if (entity !== undefined) { + return mapToOAuth2Flow(entity); + } + throw new EntityNotFound(token.toString()); + } + + store(entity: OAuth2Flow): void { + const dto = mapFromOAuth2Flow(entity); + const latest = this.entities.get(dto.uuid)?.version ?? 0; + if (latest > dto.version) { + throw new EntityLocked(); + } + entity.version = ++dto.version; + this.entities.set(dto.uuid, dto); + } +} diff --git a/src/infrastructure/memory/phone.ts b/src/infrastructure/memory/phone.ts @@ -0,0 +1,32 @@ +import { PhoneRepository } from "#core/application/phone/phone_repository.ts"; +import { EntityLocked } from "#core/application/repository_error.ts"; +import { PhoneEKYC } from "#core/domain/phone_ekyc.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + mapFromPhoneEKYC, + mapToPhoneEKYC, + PhoneEKYCDto, +} from "#infrastructure/memory/mapper/phone.ts"; + +export class MemoryPhoneRepositoryAdapter implements PhoneRepository { + constructor(private readonly entities: Map<string, PhoneEKYCDto>) { + } + + findOrCreate(id: UUID): PhoneEKYC { + const entity = this.entities.get(id.toString()); + if (entity !== undefined) { + return mapToPhoneEKYC(entity); + } + return new PhoneEKYC(id); + } + + store(entity: PhoneEKYC): void { + const dto = mapFromPhoneEKYC(entity); + const latest = this.entities.get(dto.uuid)?.version ?? 0; + if (latest > dto.version) { + throw new EntityLocked(); + } + entity.version = ++dto.version; + this.entities.set(dto.uuid, dto); + } +} diff --git a/src/infrastructure/memory/ratelimit.ts b/src/infrastructure/memory/ratelimit.ts @@ -0,0 +1,32 @@ +import { EntityLocked } from "../../core/application/repository_error.ts"; +import { + mapFromRateLimit, + mapToRateLimit, + RateLimitDto, +} from "./mapper/ratelimit.ts"; + +import { RateLimitRepository } from "#core/application/oauth2/ratelimit_repository.ts"; +import { RateLimit } from "#core/domain/rate_limit.ts"; + +export class MemoryRateLimitRepositoryAdapter implements RateLimitRepository { + constructor(private readonly entities: Map<string, RateLimitDto>) { + } + + findOrCreate(key: string): RateLimit { + const entity = this.entities.get(key); + if (entity !== undefined) { + return mapToRateLimit(entity); + } + return new RateLimit(key); + } + + store(entity: RateLimit): void { + const dto = mapFromRateLimit(entity); + const latest = this.entities.get(dto.key)?.version ?? 0; + if (latest > dto.version) { + throw new EntityLocked(); + } + entity.version = ++dto.version; + this.entities.set(dto.key, dto); + } +} diff --git a/src/infrastructure/postgres/auth.ts b/src/infrastructure/postgres/auth.ts @@ -0,0 +1,143 @@ +import { AuthRepository } from "#core/application/authn/auth_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { Auth } from "#core/domain/auth.ts"; +import { Email } from "#core/domain/email.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + AuthDto, + mapFromAuth, + mapToAuth, +} from "#infrastructure/memory/mapper/auth.ts"; +import { mapError } from "#infrastructure/postgres/error.ts"; +import { Pool } from "$postgres"; + +export class PostgresAuthRepositoryAdapter implements AuthRepository { + constructor(readonly pool: Pool) { + } + + async find(uuid: UUID): Promise<Auth> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject< + AuthDto + >`select * from "auth" where "uuid" = ${uuid.toString()} limit 1;`; + if (result.rowCount !== 1) { + throw new EntityNotFound(uuid.toString()); + } + return mapToAuth(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } + + async findByEmail(email: Email): Promise<Auth> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject< + AuthDto + >`select * from "auth" where "email" = ${email.toString()} limit 1;`; + if (result.rowCount !== 1) { + throw new EntityNotFound(email.toString()); + } + return mapToAuth(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } + + async findBySessionToken(sessionToken: Token): Promise<Auth> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject< + AuthDto + >`select * from "auth" where "sessionToken" = ${sessionToken.toString()} and "sessionExpire" > current_timestamp limit 1;`; + if (result.rowCount !== 1) { + throw new EntityNotFound(sessionToken.toString()); + } + return mapToAuth(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } + + async store(auth: Auth): Promise<void> { + try { + const dto = mapFromAuth(auth); + const connection = await this.pool.connect(); + const transaction = connection.createTransaction( + `txn_${dto.uuid}_${dto.version}`, + ); + try { + await transaction.begin(); + dto.version++; + if (dto.version === 1) { + await transaction.queryObject<void>` + insert into "auth" ( + "uuid", "email", "emailVerified", "emailCode", "emailCodeExpire", + "emailChallengeRequest", "emailChallengeRequestExpire", "emailChallengeAttempt", "emailChallengeAttemptExpire", + "passwordHash", "passwordAttempt", "passwordAttemptExpire", + "sessionToken", "sessionExpire", "version" + ) values ( + ${dto.uuid}, ${dto.email}, ${dto.emailVerified}, ${dto.emailCode}, ${dto.emailCodeExpire}, + ${dto.emailChallengeRequest}, ${dto.emailChallengeRequestExpire}, ${dto.emailChallengeAttempt}, ${dto.emailChallengeAttemptExpire}, + ${dto.passwordHash}, ${dto.passwordAttempt}, ${dto.passwordAttemptExpire}, + ${dto.sessionToken}, ${dto.sessionExpire}, ${dto.version} + ); + `; + await transaction.commit(); + auth.version = dto.version; + return; + } + const result = await transaction.queryObject<{ version: number }>` + update "auth" set + "email" = ${dto.email}, + "emailVerified" = ${dto.emailVerified}, + "emailCode" = ${dto.emailCode}, + "emailCodeExpire" = ${dto.emailCodeExpire}, + "emailChallengeRequest" = ${dto.emailChallengeRequest}, + "emailChallengeRequestExpire" = ${dto.emailChallengeRequestExpire}, + "emailChallengeAttempt" = ${dto.emailChallengeAttempt}, + "emailChallengeAttemptExpire" = ${dto.emailChallengeAttemptExpire}, + "passwordAttempt" = ${dto.passwordAttempt}, + "passwordAttemptExpire" = ${dto.passwordAttemptExpire}, + "sessionToken" = ${dto.sessionToken}, + "sessionExpire" = ${dto.sessionExpire}, + "version" = "version" + 1 + where uuid = ${dto.uuid} + returning version; + `; + if (result.rowCount !== 1) { + transaction.rollback(); + throw new EntityNotFound(dto.uuid); + } + if (result.rows[0].version === dto.version) { + await transaction.commit(); + auth.version = result.rows[0].version; + return; + } + transaction.rollback(); + throw new EntityLocked(); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } +} diff --git a/src/infrastructure/postgres/customer_info.ts b/src/infrastructure/postgres/customer_info.ts @@ -0,0 +1,80 @@ +import { + CustomerInfoRequest, + CustomerInfoResponse, + CustomerInfoUseCase, +} from "#core/application/customer_info.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; +import { Pool } from "$postgres"; + +export class PostgresCustomerInfoAdapter implements CustomerInfoUseCase { + constructor(private readonly pool: Pool) { + } + + async execute(request: CustomerInfoRequest): Promise<CustomerInfoResponse> { + const connection = await this.pool.connect(); + try { + const uuid = new UUID(request.uuid); + const result = await connection.queryObject< + Omit<CustomerInfoResponse, "exists"> + >` + select + a."uuid", + a."email", + a."emailVerified", + p."phoneNumber", + p."phoneNumberVerified", + i."firstName", + i."lastName", + i."birthDate", + i."sex", + i."nationality", + i."country", + (i."state" = 'approved') "idDocumentVerified", + (i."state" != 'capturing') "idDocumentRegistered" + from "auth" a + left join "phone" p using (uuid) + left join "id_document" i using (uuid) + where a.uuid = ${uuid.toString()}; + `; + const row = result.rows[0]; + return { + exists: row !== undefined, + uuid: row.uuid ?? null, + email: row.email ?? null, + emailVerified: row.emailVerified ?? false, + phoneNumber: row.phoneNumber ?? null, + phoneNumberVerified: row.phoneNumberVerified ?? false, + firstName: row.firstName ?? null, + lastName: row.lastName ?? null, + birthDate: row.birthDate ?? null, + sex: row.sex ?? null, + nationality: row.nationality ?? null, + country: row.country ?? null, + idDocumentVerified: row.idDocumentVerified ?? false, + idDocumentRegistered: row.idDocumentRegistered ?? false, + }; + } catch (error) { + if (error instanceof InvalidUUID) { + return { + exists: false, + uuid: null, + email: null, + emailVerified: false, + phoneNumber: null, + phoneNumberVerified: false, + firstName: null, + lastName: null, + birthDate: null, + sex: null, + nationality: null, + country: null, + idDocumentVerified: false, + idDocumentRegistered: false, + }; + } + throw error; + } finally { + connection.release(); + } + } +} diff --git a/src/infrastructure/postgres/error.ts b/src/infrastructure/postgres/error.ts @@ -0,0 +1,27 @@ +import { + EntityLocked, + RepositoryError, +} from "../../core/application/repository_error.ts"; +import { ConnectionError, PostgresError, TransactionError } from "$postgres"; + +export function mapError(cause: unknown): Error { + if (cause instanceof TransactionError) { + if (cause.cause) { + return mapError(cause.cause); + } + return new EntityLocked({ cause }); + } + if (cause instanceof RepositoryError) { + return cause; + } + if (cause instanceof ConnectionError) { + return new RepositoryError("connection failure", { cause }); + } + if (!(cause instanceof PostgresError)) { + return new RepositoryError(undefined, { cause }); + } + if (["23505", "23P01"].includes(cause.fields.code)) { + throw new EntityLocked({ cause }); + } + return new RepositoryError(undefined, { cause }); +} diff --git a/src/infrastructure/postgres/factory.ts b/src/infrastructure/postgres/factory.ts @@ -0,0 +1,29 @@ +import { PostgresAuthRepositoryAdapter } from "#infrastructure/postgres/auth.ts"; +import { PostgresCustomerInfoAdapter } from "#infrastructure/postgres/customer_info.ts"; +import { PostgresIDDocumentRepositoryAdapter } from "#infrastructure/postgres/iddocument.ts"; +import { PostgresIDDocumentListAdapter } from "#infrastructure/postgres/iddocument_list.ts"; +import { PostgresOAuth2FlowRepositoryAdapter } from "#infrastructure/postgres/oauth2_flow.ts"; +import { PostgresPhoneRepositoryAdapter } from "#infrastructure/postgres/phone.ts"; +import { PostgresRateLimitRepositoryAdapter } from "#infrastructure/postgres/ratelimit.ts"; +import { Pool } from "$postgres"; + +export function createPostgresPersistance() { + const pool = new Pool(undefined, 4); + const authRepo = new PostgresAuthRepositoryAdapter(pool); + const phoneRepo = new PostgresPhoneRepositoryAdapter(pool); + const flowRepo = new PostgresOAuth2FlowRepositoryAdapter(pool); + const rateLimitRepo = new PostgresRateLimitRepositoryAdapter(pool); + const idDocumentRepo = new PostgresIDDocumentRepositoryAdapter(pool); + const idDocumentList = new PostgresIDDocumentListAdapter(pool); + const customerInfo = new PostgresCustomerInfoAdapter(pool); + + return { + authRepo, + phoneRepo, + flowRepo, + rateLimitRepo, + idDocumentRepo, + idDocumentList, + customerInfo, + }; +} diff --git a/src/infrastructure/postgres/iddocument.ts b/src/infrastructure/postgres/iddocument.ts @@ -0,0 +1,103 @@ +import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { IDDocument } from "#core/domain/id_document.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + IDDocumentDto, + mapFromIDDocument, + mapToIDDocument, +} from "#infrastructure/memory/mapper/id_document.ts"; +import { mapError } from "#infrastructure/postgres/error.ts"; +import { Pool } from "$postgres"; + +export class PostgresIDDocumentRepositoryAdapter + implements IDDocumentRepository { + constructor(readonly pool: Pool) { + } + + async findOrCreate(uuid: UUID): Promise<IDDocument> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject< + IDDocumentDto + >`select * from "id_document" where "uuid" = ${uuid.toString()} limit 1;`; + if (result.rowCount !== 1) { + return new IDDocument(uuid); + } + return mapToIDDocument(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } + + async store(entity: IDDocument): Promise<void> { + try { + const dto = mapFromIDDocument(entity); + const connection = await this.pool.connect(); + const transaction = connection.createTransaction( + `txn_${dto.uuid}_${dto.version}`, + ); + try { + await transaction.begin(); + dto.version++; + if (dto.version === 1) { + await transaction.queryArray` + insert into "id_document" ( + "uuid", "state", "back", "front", "faceLeft", "faceFront", "faceRight", + "admin", "firstName", "lastName", "birthDate", "sex", "nationality", "country", + "version" + ) values ( + ${dto.uuid}, ${dto.state}, ${dto.back}, ${dto.front}, ${dto.faceLeft}, ${dto.faceFront}, ${dto.faceRight}, + ${dto.admin}, ${dto.firstName}, ${dto.lastName}, ${dto.birthDate}, ${dto.sex}, ${dto.nationality}, ${dto.country}, + ${dto.version} + ); + `; + await transaction.commit(); + entity.version = dto.version; + return; + } + const result = await transaction.queryObject<{ version: number }>` + update "id_document" set + "state" = ${dto.state}, + "back" = ${dto.back}, + "front" = ${dto.front}, + "faceLeft" = ${dto.faceLeft}, + "faceFront" = ${dto.faceFront}, + "faceRight" = ${dto.faceRight}, + "admin" = ${dto.admin}, + "firstName" = ${dto.firstName}, + "lastName" = ${dto.lastName}, + "birthDate" = ${dto.birthDate}, + "sex" = ${dto.sex}, + "nationality" = ${dto.nationality}, + "country" = ${dto.country}, + "version" = "version" + 1 + where uuid = ${dto.uuid} + returning version; + `; + if (result.rowCount !== 1) { + transaction.rollback(); + throw new EntityNotFound(dto.uuid); + } + if (result.rows[0].version === dto.version) { + await transaction.commit(); + entity.version = dto.version; + return; + } + transaction.rollback(); + throw new EntityLocked(); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } +} diff --git a/src/infrastructure/postgres/iddocument_list.ts b/src/infrastructure/postgres/iddocument_list.ts @@ -0,0 +1,46 @@ +import { + IDDocumentListRequest, + IDDocumentListResponse, + IDDocumentListUseCase, +} from "#core/application/id_document/list.ts"; +import { Pool } from "$postgres"; + +const NB_PER_PAGE = 10; + +export class PostgresIDDocumentListAdapter implements IDDocumentListUseCase { + constructor(private readonly pool: Pool) { + } + + async execute( + request: IDDocumentListRequest, + ): Promise<IDDocumentListResponse> { + const connection = await this.pool.connect(); + try { + const items = await connection.queryObject< + IDDocumentListResponse["items"][number] + >` + select "uuid", + "front" as "docFront", + "back" as "docBack", + "faceLeft", + "faceFront", + "faceRight", + "firstName", + "lastName", + "birthDate", + "sex", + "nationality", + "country" + from "id_document" + where "state" = 'registered' + limit ${NB_PER_PAGE} offset ${request.cursor ?? 0} + `; + return { + items: items.rows, + next: (request.cursor ?? 0) + NB_PER_PAGE, + }; + } finally { + connection.release(); + } + } +} diff --git a/src/infrastructure/postgres/migrations/20240531140741_create_auth.ts b/src/infrastructure/postgres/migrations/20240531140741_create_auth.ts @@ -0,0 +1,42 @@ +import { + AbstractMigration, + ClientPostgreSQL, + Info, +} from "https://deno.land/x/nessie@2.0.11/mod.ts"; + +export default class extends AbstractMigration<ClientPostgreSQL> { + /** Runs on migrate */ + async up(_info: Info): Promise<void> { + await this.client.queryArray`create table "auth" ( + "uuid" uuid not null, + + -- EMAIL + "email" varchar not null, + "emailVerified" boolean not null default false, + "emailCode" varchar null, + "emailCodeExpire" timestamp not null default ('1970-01-01 00:00:00'), + "emailChallengeRequest" int4 not null default 0, + "emailChallengeRequestExpire" timestamp not null default ('1970-01-01 00:00:00'), + "emailChallengeAttempt" int4 not null default 0, + "emailChallengeAttemptExpire" timestamp not null default ('1970-01-01 00:00:00'), + + -- PASSWORD + "passwordHash" varchar not null, + "passwordAttempt" int4 not null default 0, + "passwordAttemptExpire" timestamp not null default ('1970-01-01 00:00:00'), + + -- SESSION TOKEN + "sessionToken" varchar null, + "sessionExpire" timestamp not null default ('1970-01-01 00:00:00'), + "version" int4 not null default (0), + + constraint auth_pk primary key ("uuid"), + constraint auth_email_uk unique ("email") + );`; + } + + /** Runs on rollback */ + async down(_info: Info): Promise<void> { + await this.client.queryArray`drop table auth cascade;`; + } +} diff --git a/src/infrastructure/postgres/migrations/20240606001232_create_phone.ts b/src/infrastructure/postgres/migrations/20240606001232_create_phone.ts @@ -0,0 +1,30 @@ +import { + AbstractMigration, + ClientPostgreSQL, + Info, +} from "https://deno.land/x/nessie@2.0.11/mod.ts"; + +export default class extends AbstractMigration<ClientPostgreSQL> { + /** Runs on migrate */ + async up(_info: Info): Promise<void> { + await this.client.queryArray`create table "phone" ( + "uuid" uuid not null, + "phoneNumber" varchar not null unique, + "phoneNumberVerified" boolean not null default false, + "phoneNumberCode" varchar null, + "phoneNumberCodeExpire" timestamp not null default ('1970-01-01 00:00:00'), + "phoneNumberChallengeRequest" int4 not null default 0, + "phoneNumberChallengeRequestExpire" timestamp not null default ('1970-01-01 00:00:00'), + "phoneNumberChallengeAttempt" int4 not null default 0, + "phoneNumberChallengeAttemptExpire" timestamp not null default ('1970-01-01 00:00:00'), + "version" int4 not null default 0, + constraint phone_pk primary key("uuid"), + constraint phone_number_uk unique ("phoneNumber") + );`; + } + + /** Runs on rollback */ + async down(_info: Info): Promise<void> { + await this.client.queryArray`drop table "phone" cascade;`; + } +} diff --git a/src/infrastructure/postgres/migrations/20240617195959_create_oauth2flow.ts b/src/infrastructure/postgres/migrations/20240617195959_create_oauth2flow.ts @@ -0,0 +1,28 @@ +import { + AbstractMigration, + ClientPostgreSQL, + Info, +} from "https://deno.land/x/nessie@2.0.11/mod.ts"; + +export default class extends AbstractMigration<ClientPostgreSQL> { + /** Runs on migrate */ + async up(_info: Info): Promise<void> { + await this.client.queryArray`create table "oauth2flow" ( + "uuid" uuid not null, + "clientId" uuid not null, + "scope" varchar not null, + "state" varchar null, + "resourceOwner" uuid null, + "token" varchar null, + "tokenExpire" timestamp not null default ('1970-01-01 00:00:00'), + "created" timestamp default (current_timestamp), + "version" int4 not null default 0, + constraint oauth2flow_pk primary key("uuid") + );`; + } + + /** Runs on rollback */ + async down(_info: Info): Promise<void> { + await this.client.queryArray`drop table "oauth2flow" cascade;`; + } +} diff --git a/src/infrastructure/postgres/migrations/20240618073559_create_ratelimit.ts b/src/infrastructure/postgres/migrations/20240618073559_create_ratelimit.ts @@ -0,0 +1,23 @@ +import { + AbstractMigration, + ClientPostgreSQL, + Info, +} from "https://deno.land/x/nessie@2.0.11/mod.ts"; + +export default class extends AbstractMigration<ClientPostgreSQL> { + /** Runs on migrate */ + async up(_info: Info): Promise<void> { + await this.client.queryArray`create table "ratelimit" ( + "key" varchar not null, + "count" int4 not null, + "expire" timestamp not null, + "version" int4 not null default 0, + constraint ratelimit_pk primary key("key") + );`; + } + + /** Runs on rollback */ + async down(_info: Info): Promise<void> { + await this.client.queryArray`drop table "ratelimit" cascade;`; + } +} diff --git a/src/infrastructure/postgres/migrations/20240619101025_create_iddocument.ts b/src/infrastructure/postgres/migrations/20240619101025_create_iddocument.ts @@ -0,0 +1,34 @@ +import { + AbstractMigration, + ClientPostgreSQL, + Info, +} from "https://deno.land/x/nessie@2.0.11/mod.ts"; + +export default class extends AbstractMigration<ClientPostgreSQL> { + /** Runs on migrate */ + async up(_info: Info): Promise<void> { + await this.client.queryArray`create table "id_document" ( + "uuid" uuid not null, + "firstName" varchar null, + "lastName" varchar null, + "birthDate" timestamp null, + "sex" varchar null, + "nationality" varchar null, + "country" varchar null, + "state" varchar not null, + "back" varchar null, + "front" varchar null, + "faceLeft" varchar null, + "faceFront" varchar null, + "faceRight" varchar null, + "admin" uuid null, + "version" int4 not null default 0, + constraint id_document_pk primary key("uuid") + );`; + } + + /** Runs on rollback */ + async down(_info: Info): Promise<void> { + await this.client.queryArray`drop table "id_document" cascade;`; + } +} diff --git a/src/infrastructure/postgres/oauth2_flow.ts b/src/infrastructure/postgres/oauth2_flow.ts @@ -0,0 +1,120 @@ +import { OAuth2FlowRepository } from "#core/application/oauth2/flow_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { OAuth2Flow } from "#core/domain/oauth2flow.ts"; +import { Token } from "#core/domain/token.ts"; +import { UUID } from "#core/domain/uuid.ts"; +import { + mapFromOAuth2Flow, + mapToOAuth2Flow, + OAuth2FlowDto, +} from "#infrastructure/memory/mapper/oauth2flow.ts"; +import { mapError } from "#infrastructure/postgres/error.ts"; +import { Pool } from "$postgres"; + +export class PostgresOAuth2FlowRepositoryAdapter + implements OAuth2FlowRepository { + constructor(readonly pool: Pool) { + } + + async find(uuid: UUID): Promise<OAuth2Flow> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject< + OAuth2FlowDto + >`select * from "oauth2flow" where "uuid" = ${uuid.toString()} limit 1;`; + if (result.rowCount !== 1) { + throw new EntityNotFound(uuid.toString()); + } + return mapToOAuth2Flow(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } + + async findByToken(token: Token): Promise<OAuth2Flow> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject< + OAuth2FlowDto + >`select * from "oauth2flow" where "token" = ${token.toString()} limit 1;`; + if (result.rowCount !== 1) { + throw new EntityNotFound(token.toString()); + } + return mapToOAuth2Flow(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } + + async store(flow: OAuth2Flow): Promise<void> { + try { + const dto = mapFromOAuth2Flow(flow); + const connection = await this.pool.connect(); + const transaction = connection.createTransaction( + `txn_${dto.uuid}_${dto.version}`, + ); + try { + await transaction.begin(); + await transaction + .queryArray`delete from "oauth2flow" where created < (current_timestamp - interval '1 day');`; + + dto.version++; + if (dto.version === 1) { + await transaction.queryObject<void>` + insert into "oauth2flow" ( + "uuid", "clientId", "scope", "state", + "resourceOwner", "token", "tokenExpire", + "version" + ) values ( + ${dto.uuid}, ${dto.clientId}, ${dto.scope}, ${dto.state}, + ${dto.resourceOwner}, ${dto.token}, ${dto.tokenExpire}, + ${dto.version} + ); + `; + await transaction.commit(); + flow.version = dto.version; + return; + } + const result = await transaction.queryObject<{ version: number }>` + update "oauth2flow" set + "uuid" = ${dto.uuid}, + "clientId" = ${dto.clientId}, + "scope" = ${dto.scope}, + "state" = ${dto.state}, + "resourceOwner" = ${dto.resourceOwner}, + "token" = ${dto.token}, + "tokenExpire" = ${dto.tokenExpire}, + "version" = "version" + 1 + where uuid = ${dto.uuid} + returning version; + `; + if (result.rowCount !== 1) { + transaction.rollback(); + throw new EntityNotFound(dto.uuid); + } + if (result.rows[0].version === dto.version) { + await transaction.commit(); + flow.version = result.rows[0].version; + return; + } + transaction.rollback(); + throw new EntityLocked(); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } +} diff --git a/src/infrastructure/postgres/phone.ts b/src/infrastructure/postgres/phone.ts @@ -0,0 +1,109 @@ +import { PhoneRepository } from "#core/application/phone/phone_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { PhoneEKYC } from "#core/domain/phone_ekyc.ts"; +import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; +import { + mapFromPhoneEKYC, + mapToPhoneEKYC, + PhoneEKYCDto, +} from "#infrastructure/memory/mapper/phone.ts"; +import { mapError } from "#infrastructure/postgres/error.ts"; +import { Pool } from "$postgres"; + +export class PostgresPhoneRepositoryAdapter implements PhoneRepository { + constructor(readonly pool: Pool) { + } + + async findOrCreate(id: UUID): Promise<PhoneEKYC> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject<PhoneEKYCDto>` + select "uuid", "phoneNumber", "phoneNumberVerified", + "phoneNumberCode", "phoneNumberCodeExpire", + "phoneNumberChallengeRequest", "phoneNumberChallengeRequestExpire", + "phoneNumberChallengeAttempt", "phoneNumberChallengeAttemptExpire", + "version" + from "phone" + where uuid = ${id.toString()} + limit 1; + `; + if (result.rowCount !== 1) { + return new PhoneEKYC(id); + } + return mapToPhoneEKYC(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + if (error instanceof InvalidUUID) { + throw new EntityNotFound(id.toString()); + } + throw mapError(error); + } + } + + async store(phoneEKYC: PhoneEKYC): Promise<void> { + try { + const dto = mapFromPhoneEKYC(phoneEKYC); + const connection = await this.pool.connect(); + const transaction = connection.createTransaction( + `txn_${dto.uuid}_${dto.version}`, + ); + try { + await transaction.begin(); + dto.version++; + if (dto.version === 1) { + await transaction.queryArray` + insert into "phone" ( + "uuid", "phoneNumber", "phoneNumberVerified", + "phoneNumberCode", "phoneNumberCodeExpire", + "phoneNumberChallengeRequest", "phoneNumberChallengeRequestExpire", + "phoneNumberChallengeAttempt", "phoneNumberChallengeAttemptExpire", + "version" + ) values ( + ${dto.uuid}, ${dto.phoneNumber}, ${dto.phoneNumberVerified}, + ${dto.phoneNumberCode}, ${dto.phoneNumberCodeExpire}, + ${dto.phoneNumberChallengeRequest}, ${dto.phoneNumberChallengeRequestExpire}, + ${dto.phoneNumberChallengeAttempt}, ${dto.phoneNumberChallengeAttemptExpire}, + ${dto.version} + ); + `; + await transaction.commit(); + phoneEKYC.version = dto.version; + return; + } + const result = await transaction.queryObject<{ version: number }>` + update "phone" set + "phoneNumber" = ${dto.phoneNumber}, "phoneNumberVerified" = ${dto.phoneNumberVerified}, + "phoneNumberCode" = ${dto.phoneNumberCode}, "phoneNumberCodeExpire" = ${dto.phoneNumberCodeExpire}, + "phoneNumberChallengeRequest" = ${dto.phoneNumberChallengeRequest}, + "phoneNumberChallengeRequestExpire" = ${dto.phoneNumberChallengeRequestExpire}, + "phoneNumberChallengeAttempt" = ${dto.phoneNumberChallengeAttempt}, + "phoneNumberChallengeAttemptExpire" = ${dto.phoneNumberChallengeAttemptExpire}, + "version" = "version" + 1 + where uuid = ${dto.uuid} + returning version; + `; + if (result.rowCount !== 1) { + transaction.rollback(); + throw new EntityNotFound(dto.uuid); + } + if (result.rows[0].version === dto.version) { + await transaction.commit(); + phoneEKYC.version = dto.version; + return; + } + transaction.rollback(); + throw new EntityLocked(); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } +} diff --git a/src/infrastructure/postgres/ratelimit.ts b/src/infrastructure/postgres/ratelimit.ts @@ -0,0 +1,94 @@ +import { RateLimitRepository } from "#core/application/oauth2/ratelimit_repository.ts"; +import { + EntityLocked, + EntityNotFound, +} from "#core/application/repository_error.ts"; +import { RateLimit } from "#core/domain/rate_limit.ts"; +import { InvalidUUID } from "#core/domain/uuid.ts"; +import { + RateLimitDto, + mapFromRateLimit, + mapToRateLimit, +} from "#infrastructure/memory/mapper/ratelimit.ts"; +import { mapError } from "#infrastructure/postgres/error.ts"; +import { Pool } from "$postgres"; + +export class PostgresRateLimitRepositoryAdapter + implements RateLimitRepository { + constructor(readonly pool: Pool) { + } + + async findOrCreate(key: string): Promise<RateLimit> { + try { + const connection = await this.pool.connect(); + try { + const result = await connection.queryObject<RateLimitDto>` + select * + from "ratelimit" + where key = ${key.toString()} + limit 1; + `; + if (result.rowCount !== 1) { + return new RateLimit(key) + } + return mapToRateLimit(result.rows[0]); + } finally { + connection.release(); + } + } catch (error) { + if (error instanceof InvalidUUID) { + throw new EntityNotFound(key.toString()); + } + throw mapError(error); + } + } + + async store(rateLimit: RateLimit): Promise<void> { + try { + const dto = mapFromRateLimit(rateLimit); + const connection = await this.pool.connect(); + const transaction = connection.createTransaction( + `txn_${dto.key}_${dto.version}`, + ); + try { + await transaction.begin(); + dto.version++; + if (dto.version === 1) { + await transaction.queryArray` + insert into "ratelimit" ( + "key", "count", "expire", "version" + ) values ( + ${dto.key}, ${dto.count}, ${dto.expire}, ${dto.version} + ); + `; + await transaction.commit(); + rateLimit.version = dto.version; + return; + } + const result = await transaction.queryObject<{ version: number }>` + update "ratelimit" set + "count" = ${dto.count}, + "expire" = ${dto.expire}, + "version" = "version" + 1 + where "key" = ${dto.key} + returning version; + `; + if (result.rowCount !== 1) { + transaction.rollback(); + throw new EntityNotFound(dto.key); + } + if (result.rows[0].version === dto.version) { + await transaction.commit(); + rateLimit.version = dto.version; + return; + } + transaction.rollback(); + throw new EntityLocked(); + } finally { + connection.release(); + } + } catch (error) { + throw mapError(error); + } + } +} diff --git a/src/infrastructure/postgres/seeds/.gitkeep b/src/infrastructure/postgres/seeds/.gitkeep diff --git a/src/infrastructure/smtp/auth.ts b/src/infrastructure/smtp/auth.ts @@ -0,0 +1,49 @@ +import { AuthEmailChallengeMailer } from "../../core/application/authn/email_challenge.ts"; +import { SmtpClient } from "$mailer"; + +export type SmtpOptions = { + SMTP_HOST: string; + SMTP_PORT: number; + SMTP_FROM: string; + SMTP_USER?: string | undefined; + SMTP_PASS?: string | undefined; + SMTP_TLS?: boolean | undefined; +}; + +export class SmtpAuthEmailChallengeMailerAdapter + implements AuthEmailChallengeMailer { + private readonly client: SmtpClient = new SmtpClient(); + + constructor(private readonly config: SmtpOptions) { + } + + async send(email: string, code: string): Promise<void> { + if (this.config.SMTP_TLS === true) { + await this.client.connectTLS({ + hostname: this.config.SMTP_HOST, + port: this.config.SMTP_PORT, + username: this.config.SMTP_USER, + password: this.config.SMTP_PASS, + }); + } else { + await this.client.connect({ + hostname: this.config.SMTP_HOST, + port: this.config.SMTP_PORT, + username: this.config.SMTP_USER, + password: this.config.SMTP_PASS, + }); + } + try { + await this.client.send({ + from: this.config.SMTP_FROM, + to: email, + subject: "Verification Email Code | KYCID", + content: "auto", + html: + `To verify your email, enter this following code <code><b>${code}</b></code>`, + }); + } finally { + await this.client.close(); + } + } +} diff --git a/src/infrastructure/smtp/factory.ts b/src/infrastructure/smtp/factory.ts @@ -0,0 +1,20 @@ +import { SmtpAuthEmailChallengeMailerAdapter } from "#infrastructure/smtp/auth.ts"; + +export type SmtpDependencies = { + environment: { + SMTP_HOST: string; + SMTP_PORT: number; + SMTP_USER?: string; + SMTP_PASS?: string; + SMTP_TLS: boolean; + SMTP_FROM: string; + }; +}; + +export function createSmtpMailer(dependencies: SmtpDependencies) { + return { + authEmailChallengeMailer: new SmtpAuthEmailChallengeMailerAdapter( + dependencies.environment, + ), + }; +} diff --git a/src/infrastructure/swisscom/ekyc_send_sms_challenge.ts b/src/infrastructure/swisscom/ekyc_send_sms_challenge.ts @@ -0,0 +1,59 @@ +import { PhoneSmsChallengeSender } from "../../core/application/phone/register.ts"; +import * as V from "$valita"; + +export type SwisscomOptions = { + SWISSCOM_SMS_TOKEN_ENDPOINT: string; + SWISSCOM_SMS_MESSAGE_ENDPOINT: string; + SWISSCOM_SMS_CLIENT_ID: string; + SWISSCOM_SMS_CLIENT_SECRET: string; +}; + +export class SwisscomPhoneSmsChallengeSenderAdapter + implements PhoneSmsChallengeSender { + constructor(private readonly options: SwisscomOptions) { + } + + async send(phoneNumber: string, code: string): Promise<void> { + const accessToken = await this.connect(); + const response = await fetch( + `${this.options.SWISSCOM_SMS_MESSAGE_ENDPOINT}`, + { + method: "POST", + headers: { + "Authorization": `Bearer ${accessToken}`, + "Content-Type": "application/json", + "SCS-Version": "2", + }, + body: JSON.stringify({ + to: phoneNumber, + text: `To verify your phone number, enter the code: ${code}`, + }), + }, + ); + if (response.status !== 201) { + const json = await response.json(); + throw new Error(JSON.stringify(json)); + } + } + + async connect(): Promise<unknown> { + const response = await fetch( + `${this.options.SWISSCOM_SMS_TOKEN_ENDPOINT}?grant_type=client_credentials`, + { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + "Content-Length": "0", + "Authorization": "Basic " + + btoa( + `${this.options.SWISSCOM_SMS_CLIENT_ID}:${this.options.SWISSCOM_SMS_CLIENT_SECRET}`, + ), + }, + }, + ); + const json = await response.json(); + return V.object({ access_token: V.string() }) + .parse(json, { mode: "strip" }) + .access_token; + } +} diff --git a/src/infrastructure/swisscom/factory.ts b/src/infrastructure/swisscom/factory.ts @@ -0,0 +1,16 @@ +import { + SwisscomOptions, + SwisscomPhoneSmsChallengeSenderAdapter, +} from "#infrastructure/swisscom/ekyc_send_sms_challenge.ts"; + +export type SwisscomDependencies = { + environment: SwisscomOptions; +}; + +export function createSwisscomSmsSender(dependencies: SwisscomDependencies) { + return { + phoneSmsChallengeSender: new SwisscomPhoneSmsChallengeSenderAdapter( + dependencies.environment, + ), + }; +} diff --git a/src/infrastructure/tesseract/factory.ts b/src/infrastructure/tesseract/factory.ts @@ -0,0 +1,17 @@ +import { TesseractIDDocumentMRZScanAdapter } from "#infrastructure/tesseract/mrz_scan.ts"; + +export type TesseractDependencies = { + environment: { + TESSERACT_PATH: string; + }; +}; + +export function createTesseractIDDocumentMRZScan( + dependencies: TesseractDependencies, +) { + const { environment } = dependencies; + const { TESSERACT_PATH } = environment; + return { + idDocumentMRZScan: new TesseractIDDocumentMRZScanAdapter(TESSERACT_PATH), + }; +} diff --git a/src/infrastructure/tesseract/models/ocrb.traineddata b/src/infrastructure/tesseract/models/ocrb.traineddata Binary files differ. diff --git a/src/infrastructure/tesseract/mrz_scan.ts b/src/infrastructure/tesseract/mrz_scan.ts @@ -0,0 +1,71 @@ +import { IDDocumentMRZScan, MRZInfo } from "#core/application/id_document/mrzscan.ts"; +import { parse } from "mrz"; + +const PREFIX = "data:image/png;base64,"; + +export class TesseractIDDocumentMRZScanAdapter implements IDDocumentMRZScan { + constructor(private readonly path: string) { + } + + async scan(image: string): Promise<MRZInfo> { + if (!image.startsWith(PREFIX)) { + throw new Error("invalid image"); + } + + try { + const buffer = Uint8Array.from( + atob(image.substring(PREFIX.length)), + (c) => c.charCodeAt(0), + ); + const command = new Deno.Command(this.path, { + args: [ + "-l", + "ocrb", + "stdin", + "stdout", + ], + env: { + TESSDATA_PREFIX: new URL("./models", import.meta.url).pathname, + }, + stdin: "piped", + stderr: "null", + stdout: "piped", + }); + const process = command.spawn(); + const writer = process.stdin.getWriter(); + await writer.ready; + await writer.write(buffer); + await writer.close(); + const content = new TextDecoder().decode( + (await process.output()).stdout!, + ); + + const lines = content + .split("\n") + .filter((line) => line.includes("<") && !line.includes(" ")); + + const result = parse( + lines, + { autocorrect: true }, + ); + + if (result.valid) { + console.log(result.fields); + return { + firstName: result.fields.firstName!, + lastName: result.fields.lastName!, + birthDate: new Date( + result.fields.birthDate!.split(/([0-9]{2})/).filter((i) => !!i) + .join("/"), + ), + sex: result.fields.sex!, + nationality: result.fields.nationality!, + country: result.fields.issuingState!, + }; + } + throw new Error("Invalid scan"); + } catch (cause) { + throw new Error("Invalid MRZ", { cause }); + } + } +} diff --git a/src/tests/acceptance.ts b/src/tests/acceptance.ts @@ -0,0 +1,13 @@ +import { RegistryComposer } from "#core/composer.ts"; +import { createMemoryPersistance } from "#infrastructure/memory/factory.ts"; +import { createFakeMailer } from "#infrastructure/fake/mailer.ts"; +import { createFakeSms } from "#infrastructure/fake/sms.ts"; +import { createUseCases } from "#core/factory.ts"; + +export const createAppForAcceptanceTest = () => + new RegistryComposer() + .add(createMemoryPersistance) + .add(createFakeMailer) + .add(createFakeSms) + .add(createUseCases) + .compose(); diff --git a/src/tests/auth_email_challenge.test.ts b/src/tests/auth_email_challenge.test.ts @@ -0,0 +1,130 @@ +import { + EMAIL_CHALLENGE_REQUEST_LIMIT, + EMAIL_CHALLENGE_TTL, +} from "#core/domain/constants.ts"; +import { assertAlmostEquals } from "$std/assert/assert_almost_equals.ts"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { assertNotEquals } from "$std/assert/assert_not_equals.ts"; +import { SECOND } from "$std/datetime/constants.ts"; +import { afterEach, beforeEach, describe, it } from "$std/testing/bdd.ts"; +import { FakeTime } from "$std/testing/time.ts"; +import { createAppForAcceptanceTest } from "./acceptance.ts"; + +const uuid = "9272d511-a47f-4c91-8e41-d056ca797b42"; +const email = "doydy1@bfh.ch"; +// hash("password") +const passwordHash = + "$argon2id$v=19$m=65536,t=2,p=1$JqSklInU0x0uFDs/tj+dDQ$Z6vJ+4MlZqSwPocHobYwbeUt+I18a4T5k5m90wB/dpg"; + +describe("given auth email challenge use case for acceptance test", () => { + let app: ReturnType<typeof createAppForAcceptanceTest>; + let clock: FakeTime; + + beforeEach(() => { + app = createAppForAcceptanceTest(); + clock = new FakeTime(new Date("2022-01-01T10:00:00").getTime()); + app.authEntities.set(uuid, { + uuid, + email, + emailVerified: false, + emailCode: null, + emailCodeExpire: new Date(0), + emailChallengeRequest: 0, + emailChallengeRequestExpire: new Date(0), + emailChallengeAttempt: 0, + emailChallengeAttemptExpire: new Date(0), + passwordHash, + passwordAttempt: 0, + passwordAttemptExpire: new Date(0), + sessionToken: null, + sessionExpire: new Date(0), + version: 1, + }); + }); + + afterEach(() => { + clock.restore(); + }); + + it("then auth should be unverified", () => { + const act = app.userSearch.execute({ email }); + assertEquals((act as { emailVerified: boolean }).emailVerified, false); + }); + + describe("when request email challenge with invalid uuid", () => { + const given = () => + app.authEmailChallenge.execute({ uuid: "invalid uuid" }); + + it("then should reject with invalid", async () => { + const act = await given(); + assertEquals(act.status, "invalid"); + }); + }); + + describe("when request email challenge with already verified email", () => { + const given = () => { + app.authEntities.set(uuid, { + uuid, + email, + emailVerified: true, + emailCode: null, + emailCodeExpire: new Date(0), + emailChallengeRequest: 0, + emailChallengeRequestExpire: new Date(0), + emailChallengeAttempt: 0, + emailChallengeAttemptExpire: new Date(0), + passwordHash, + passwordAttempt: 0, + passwordAttemptExpire: new Date(0), + sessionToken: null, + sessionExpire: new Date(0), + version: 2, + }); + return app.authEmailChallenge.execute({ uuid }); + }; + + it("then should be rejected with invalid", async () => { + const act = await given(); + assertEquals(act.status, "invalid"); + }); + }); + + describe("when request email challenge", () => { + const given = () => app.authEmailChallenge.execute({ uuid }); + + it("then should sent and delay 0", async () => { + const act = await given(); + assertEquals(act.status, "sent"); + assertEquals((act as { delay: number }).delay, 0); + }); + + it("then code should be sent", async () => { + app.authEmailChallengeMailer.lastEmail = null; + app.authEmailChallengeMailer.lastCode = null; + await given(); + assertEquals(app.authEmailChallengeMailer.lastEmail, email); + assertNotEquals(app.authEmailChallengeMailer.lastCode, null); + }); + }); + + describe("and request email challenge", () => { + beforeEach(async () => { + for (let i = 1; i < EMAIL_CHALLENGE_REQUEST_LIMIT; i++) { + await app.authEmailChallenge.execute({ uuid: uuid }); + } + }); + + describe("when request email challenge", () => { + const given = () => app.authEmailChallenge.execute({ uuid: uuid }); + + it("then should be send and delay 5min", async () => { + const act = await given(); + assertEquals(act.status, "sent"); + assertAlmostEquals( + (act as { delay: number }).delay / SECOND, + EMAIL_CHALLENGE_TTL / SECOND, + ); + }); + }); + }); +}); diff --git a/src/tests/auth_email_verify.test.ts b/src/tests/auth_email_verify.test.ts @@ -0,0 +1,111 @@ +import { + EMAIL_CHALLENGE_ATTEMPT_LIMIT, + EMAIL_CHALLENGE_TTL, +} from "#core/domain/constants.ts"; +import { assertAlmostEquals } from "$std/assert/assert_almost_equals.ts"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { SECOND } from "$std/datetime/constants.ts"; +import { afterEach, beforeEach, describe, it } from "$std/testing/bdd.ts"; +import { FakeTime } from "$std/testing/time.ts"; +import { createAppForAcceptanceTest } from "./acceptance.ts"; + +const uuid = "9272d511-a47f-4c91-8e41-d056ca797b42"; +const email = "doydy1@bfh.ch"; +const emailCode = "769262"; +// hash("password") +const passwordHash = + "$argon2id$v=19$m=65536,t=2,p=1$JqSklInU0x0uFDs/tj+dDQ$Z6vJ+4MlZqSwPocHobYwbeUt+I18a4T5k5m90wB/dpg"; + +describe("given auth email challenge use case for acceptance test", () => { + let clock: FakeTime; + let app: ReturnType<typeof createAppForAcceptanceTest>; + + beforeEach(() => { + clock = new FakeTime(new Date("2022-01-01T10:00:00").getTime()); + app = createAppForAcceptanceTest(); + app.authEntities.set(uuid, { + uuid, + email, + emailVerified: false, + emailCode, + emailCodeExpire: new Date(Date.now() + EMAIL_CHALLENGE_TTL), + emailChallengeRequest: 0, + emailChallengeRequestExpire: new Date(0), + emailChallengeAttempt: 0, + emailChallengeAttemptExpire: new Date(0), + passwordHash, + passwordAttempt: 0, + passwordAttemptExpire: new Date(0), + sessionToken: null, + sessionExpire: new Date(0), + version: 1, + }); + }); + + afterEach(() => { + clock.restore(); + }); + + describe("when verify email with valid code", () => { + const given = () => app.authVerifyEmail.execute({ uuid, code: emailCode }); + + it("then should reject with invalid", async () => { + const act = await given(); + assertEquals(act.status, "verified"); + }); + + it("then should be persisted", async () => { + await given(); + assertEquals(app.authEntities.get(uuid), { + uuid, + email, + emailVerified: true, + emailCode: null, + emailCodeExpire: new Date(0), + emailChallengeRequest: 0, + emailChallengeRequestExpire: new Date(0), + emailChallengeAttempt: 0, + emailChallengeAttemptExpire: new Date(0), + passwordHash, + passwordAttempt: 0, + passwordAttemptExpire: new Date(0), + sessionToken: null, + sessionExpire: new Date(0), + version: 2, + }); + }); + }); + + describe("when verify email with invalid code", () => { + const given = () => app.authVerifyEmail.execute({ uuid, code: "whatever" }); + it("then should reject with invalid without counting as attempt", async () => { + for (let i = 0; i < EMAIL_CHALLENGE_ATTEMPT_LIMIT; i++) { + const act = await given(); + assertEquals(act, { status: "invalid", delay: 0 }); + } + }); + }); + + describe("when verify email with wrong code", () => { + const given = () => app.authVerifyEmail.execute({ uuid, code: "878632" }); + it("then should reject with invalid", async () => { + const act = await given(); + assertEquals(act, { status: "invalid", delay: 0 }); + }); + }); + + describe("when verify email with wrong code n times and reached attempt limit", () => { + const given = () => app.authVerifyEmail.execute({ uuid, code: "878632" }); + it("then should reject with invalid", async () => { + for (let i = 0; i < EMAIL_CHALLENGE_ATTEMPT_LIMIT; i++) { + await given(); + } + const act = await given(); + assertEquals(act.status, "invalid"); + assertAlmostEquals( + (act as { delay: number }).delay / SECOND, + EMAIL_CHALLENGE_TTL / SECOND, + ); + }); + }); +}); diff --git a/src/tests/auth_register.test.ts b/src/tests/auth_register.test.ts @@ -0,0 +1,68 @@ +import { EntityNotFound } from "../core/application/repository_error.ts"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { assertThrows } from "$std/assert/assert_throws.ts"; +import { beforeEach, describe, it } from "$std/testing/bdd.ts"; +import { createAppForAcceptanceTest } from "./acceptance.ts"; +import { UUID } from "#core/domain/uuid.ts"; + +describe("given auth register use case for acceptance test", () => { + let app: ReturnType<typeof createAppForAcceptanceTest>; + + beforeEach(() => { + app = createAppForAcceptanceTest(); + }); + + describe("when register with valid sample", () => { + const given = () => + app.authRegister.execute({ + email: "doydy1@bfh.ch", + password: "password", + passwordConfirmation: "password", + }); + + it("then should be registered and persisted", async () => { + const act = await given(); + assertEquals(act.status, "registered"); + }); + + it("then should be persisted", async () => { + const background = await given(); + const act = app.authRepo.find(new UUID(background.uuid!)); + assertEquals(act.email.address.toString(), "doydy1@bfh.ch"); + }); + + it("the cannot be register twice", async () => { + await given(); + const act = await given(); + assertEquals(act.status, "conflict"); + }); + }); + + describe("when register with invalid email sample", () => { + const given = () => + app.authRegister.execute({ + email: "invalid email", + password: "password", + passwordConfirmation: "password", + }); + + it("then should be rejected with invalid", async () => { + const act = await given(); + assertEquals(act.status, "invalid"); + }); + }); + + describe("when register with invalid password sample", () => { + const given = () => + app.authRegister.execute({ + email: "doydy1@bfh.ch", + password: "password", + passwordConfirmation: "invalid confirm", + }); + + it("then should be rejected with invalid", async () => { + const act = await given(); + assertEquals(act.status, "invalid"); + }); + }); +}); diff --git a/src/tests/auth_repository.test.ts b/src/tests/auth_repository.test.ts @@ -0,0 +1,126 @@ +import { + AuthDto, + mapFromAuth, + mapToAuth, +} from "../infrastructure/memory/mapper/auth.ts"; +import { + EntityLocked, + EntityNotFound, + Repository, +} from "../core/application/repository_error.ts"; +import { Auth } from "#core/domain/auth.ts"; +import { MemoryAuthRepositoryAdapter } from "#infrastructure/memory/auth.ts"; +import "$dotenv"; +import { Pool } from "$postgres"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { assertRejects } from "$std/assert/assert_rejects.ts"; +import { PostgresAuthRepositoryAdapter } from "../infrastructure/postgres/auth.ts"; + +const uuid = "9272d511-a47f-4c91-8e41-d056ca797b42"; +const email = "doydy1@bfh.ch"; +// hash("password") +const passwordHash = + "$argon2id$v=19$m=65536,t=2,p=1$JqSklInU0x0uFDs/tj+dDQ$Z6vJ+4MlZqSwPocHobYwbeUt+I18a4T5k5m90wB/dpg"; + +const implementations = [ + function memoryAuthRepository() { + return new MemoryAuthRepositoryAdapter(new Map()); + }, + async function postgresAuthRepository() { + const pool = new Pool(undefined, 4); + const connection = await pool.connect(); + await connection.queryArray`delete from auth;`; + connection.release(); + return new PostgresAuthRepositoryAdapter(pool); + }, +] as ReadonlyArray<() => Promise<Repository<Auth>>>; + +for (const factory of implementations) { + Deno.test({ + name: `integration test of ${factory.name}`, + async fn(t) { + const authRepo = await factory(); + + await t.step("should be not found invalid uuid", async () => { + const act = async () => await authRepo.find("invalid uuid"); + await assertRejects(act, EntityNotFound); + }); + + await t.step("should be not found in empty", async () => { + const act = async () => await authRepo.find(uuid); + await assertRejects(act, EntityNotFound); + }); + + const sample1: AuthDto = { + uuid, + email, + emailVerified: true, + emailCode: null, + emailCodeExpire: new Date(0), + emailChallengeRequest: 0, + emailChallengeRequestExpire: new Date(0), + emailChallengeAttempt: 0, + emailChallengeAttemptExpire: new Date(0), + passwordHash, + passwordAttempt: 0, + passwordAttemptExpire: new Date(0), + sessionToken: null, + sessionExpire: new Date(0), + version: 0, + }; + + await t.step("should be store sample 1", async () => { + const act = await authRepo.store(mapToAuth(sample1)); + assertEquals(act, sample1.version + 1); + }); + + await t.step("should be find stored sample 1", async () => { + const act = mapFromAuth(await authRepo.find(uuid)); + assertEquals( + act, + Object.assign({}, sample1, { version: sample1.version + 1 }), + ); + }); + + const sample2: AuthDto = { + uuid, + email, + emailVerified: true, + emailCode: "769262", + emailCodeExpire: new Date("2024-07-10T10:00:00Z"), + emailChallengeRequest: 1, + emailChallengeRequestExpire: new Date("2024-07-10T10:00:00Z"), + emailChallengeAttempt: 1, + emailChallengeAttemptExpire: new Date("2024-07-10T10:00:25Z"), + passwordHash, + passwordAttempt: 0, + passwordAttemptExpire: new Date(0), + sessionToken: null, + sessionExpire: new Date(0), + version: 1, + }; + + await t.step("should be store sample 2", async () => { + const act = await authRepo.store(mapToAuth(sample2)); + assertEquals(act, sample2.version + 1); + }); + + await t.step("should be find stored sample 2", async () => { + const act = mapFromAuth(await authRepo.find(uuid)); + assertEquals( + act, + Object.assign({}, sample2, { version: sample2.version + 1 }), + ); + }); + + await t.step( + "should be optimistic lock on store invalid version", + async () => { + const act = async () => await authRepo.store(mapToAuth(sample2)); + await assertRejects(act, EntityLocked); + }, + ); + }, + sanitizeResources: false, + }); +} diff --git a/src/tests/phone_repository.test.ts b/src/tests/phone_repository.test.ts @@ -0,0 +1,121 @@ +import { + mapFromPhoneEKYC, + mapToPhoneEKYC, + PhoneEKYCDto, +} from "../infrastructure/memory/mapper/phone.ts"; +import { + EntityLocked, + EntityNotFound, + Repository, +} from "../core/application/repository_error.ts"; +import { PhoneEKYC } from "#core/domain/phone_ekyc.ts"; +import { MemoryPhoneRepositoryAdapter } from "#infrastructure/memory/phone.ts"; +import "$dotenv"; +import { Pool } from "$postgres"; +import { assertEquals } from "$std/assert/assert_equals.ts"; +import { assertRejects } from "$std/assert/assert_rejects.ts"; +import { FakeTime } from "$std/testing/time.ts"; +import { PostgresPhoneRepositoryAdapter } from "../infrastructure/postgres/phone.ts"; + +const uuid = "9272d511-a47f-4c91-8e41-d056ca797b42"; +const phoneNumber = "+41 77 777 77 77"; +const code = "769262"; + +const implementations = [ + function memoryPhoneRepository() { + return new MemoryPhoneRepositoryAdapter(new Map()); + }, + async function postgresAuthRepository() { + const pool = new Pool(undefined, 4); + const connection = await pool.connect(); + await connection.queryArray`delete from phone;`; + connection.release(); + return new PostgresPhoneRepositoryAdapter(pool); + }, +] as ReadonlyArray<() => Promise<Repository<PhoneEKYC>>>; + +for (const factory of implementations) { + Deno.test({ + name: `integration test of ${factory.name}`, + async fn(t) { + const clock = new FakeTime(new Date("2024-07-10T08:00:00Z")); + try { + const phoneRepo = await factory(); + + await t.step("should be not found invalid uuid", async () => { + const act = async () => await phoneRepo.find("invalid uuid"); + await assertRejects(act, EntityNotFound); + }); + + await t.step("should be not found in empty", async () => { + const act = async () => await phoneRepo.find(uuid); + await assertRejects(act, EntityNotFound); + }); + + const sample1: PhoneEKYCDto = { + uuid, + phoneNumber, + phoneNumberVerified: true, + phoneNumberCode: null, + phoneNumberCodeExpire: new Date(0), + phoneNumberChallengeRequest: 0, + phoneNumberChallengeRequestExpire: new Date(0), + phoneNumberChallengeAttempt: 0, + phoneNumberChallengeAttemptExpire: new Date(0), + version: 0, + }; + + await t.step("should be store sample 1", async () => { + const act = await phoneRepo.store(mapToPhoneEKYC(sample1)); + assertEquals(act, sample1.version + 1); + }); + + await t.step("should be find stored sample 1", async () => { + const act = mapFromPhoneEKYC(await phoneRepo.find(uuid)); + assertEquals( + act, + Object.assign({}, sample1, { version: sample1.version + 1 }), + ); + }); + + const sample2: PhoneEKYCDto = { + uuid, + phoneNumber, + phoneNumberVerified: true, + phoneNumberCode: code, + phoneNumberCodeExpire: new Date("2024-07-10T10:00:00Z"), + phoneNumberChallengeRequest: 1, + phoneNumberChallengeRequestExpire: new Date("2024-07-10T10:00:00Z"), + phoneNumberChallengeAttempt: 2, + phoneNumberChallengeAttemptExpire: new Date("2024-07-10T10:00:00Z"), + version: 1, + }; + + await t.step("should be store sample 2", async () => { + const act = await phoneRepo.store(mapToPhoneEKYC(sample2)); + assertEquals(act, sample2.version + 1); + }); + + await t.step("should be find stored sample 2", async () => { + const act = mapFromPhoneEKYC(await phoneRepo.find(uuid)); + assertEquals( + act, + Object.assign({}, sample2, { version: sample2.version + 1 }), + ); + }); + + await t.step( + "should be optimistic lock on store invalid version", + async () => { + const act = async () => + await phoneRepo.store(mapToPhoneEKYC(sample2)); + await assertRejects(act, EntityLocked); + }, + ); + } finally { + clock.restore(); + } + }, + sanitizeResources: false, + }); +}