763 Commits
Author SHA1 Message Date
fromme 67c685f6c1 chore: update project dependencies 2026-09-14 15:03:33 +02:00
fromme 7aad54e6f2 fix: keep the booking room assignment when restoring an edit draft 2026-09-14 15:02:04 +02:00
fromme b41820c39d feat: email the administrators when a role nomination appears 2026-09-13 12:50:01 +02:00
fromme fab89dead6 feat: derive ROLE_EMPLOYEE from the account's email domain 2026-09-13 12:49:51 +02:00
fromme 443a3ed248 chore: update deployer config after final migration to new host 2026-09-12 08:22:11 +02:00
fromme 5b133f724d chore: cgl fixes 2026-09-11 19:37:00 +02:00
fromme 5f8a586385 fix: derive contingent change signal from the sync diff 2026-09-11 19:34:29 +02:00
fromme e863025fb1 chore: align local dev environment with prod 2026-09-11 19:24:32 +02:00
fromme 91a38faecd chore: update scheduler notification config 2026-09-11 12:58:09 +02:00
fromme 1d3263373e feat: update filename formatting of booking confirmation pdf 2026-09-09 08:39:10 +02:00
fromme f8ff4b82a3 feat: replace custom discount with absolute value in favor of percentage 2026-09-08 17:11:00 +02:00
fromme d6c2cfaf1c fix: remove incorrect validation group 2026-09-08 16:25:43 +02:00
fromme cfe901b9c2 feat: include accommodation bookings in db anonymization 2026-09-08 15:41:28 +02:00
fromme 8443dae5ad feat: additional custom discount applied to total price 2026-09-08 15:29:00 +02:00
fromme dea7a3dc97 chore: update wording of maintenance mode message 2026-09-08 13:53:08 +02:00
fromme 9e3be24c51 chore: cleanup obsolete environment variables 2026-09-08 13:02:08 +02:00
fromme e744ebbe33 chore: update project dependencies 2026-09-08 12:40:25 +02:00
fromme 45ca0d2b46 feat: maintenance mode 2026-09-08 12:35:50 +02:00
fromme f12561c62b feat: switch to sftp source for buspro xml data 2026-09-04 11:57:03 +02:00
fromme 976b30ccc0 feat: add cms product code for future use 2026-09-03 17:40:29 +02:00
fromme 198fbfe6a2 chore: prepare switching to sftp source for buspro xml data 2026-09-03 16:23:49 +02:00
fromme acb719730c feat: add root config option for sftp connection in flysystem 2026-09-03 10:24:01 +02:00
fromme 0e3d4cbedb chore: adjust deployer config for new hetzner host 2026-09-03 10:23:40 +02:00
fromme 715fae8e33 chore: add bpn xml api documentation extract for agents 2026-09-02 10:33:47 +02:00
fromme f595183c05 fix: don't require email address from participants under 16 2026-09-01 15:15:58 +02:00
fromme 98e0cfcf6f chore: remove obsolete deployer rsync fix 2026-09-01 10:58:39 +02:00
Björn Fromme e14d29f7d4 fix: restore room occupancy lost to case-sensitive xml attribute lookup 2026-08-31 14:15:21 +02:00
Björn Fromme 24df764efb chore: update project dependencies 2026-08-31 12:56:21 +02:00
Björn Fromme e3c08afe73 fix: adjust deployer config to prevent symlink loop issue with rsync 2026-08-31 12:55:28 +02:00
Björn Fromme 81b724c11a fix: false draft-restored message 2026-08-31 09:31:00 +02:00
Björn Fromme bfad61f1dd feat: upgrade phpunit to 12.5 2026-08-31 09:31:00 +02:00
Björn Fromme 010cfe56b2 feat: upgrade project to symfony 7.4 2026-08-31 09:03:44 +02:00
Björn Fromme c1fa08fed0 chore: add clickup http request file and credentials 2026-08-31 08:58:55 +02:00
Björn Fromme ec41e2b02d chore: update project dependencies 2026-08-31 08:58:34 +02:00
Björn Fromme bbc1b6c68a feat: make booking init flow entry-point post only 2026-08-29 09:37:23 +02:00
Björn Fromme 80d734e7d6 feat: derive calendar date range from price configurations 2026-08-26 13:32:25 +02:00
Björn Fromme 61e020c3d0 feat: sort bookings by creation date in dashboard widget 2026-08-25 16:37:27 +02:00
Björn Fromme 4e6aaba9ff feat: admin dashboard widgets 2026-08-25 16:31:45 +02:00
Björn Fromme 578a21d327 fix: stop mutating booking state on edit-mode page views 2026-08-24 17:13:19 +02:00
Björn Fromme c9c28792e5 fix: resolve stale dependent selections after booking family insurance 2026-08-24 16:58:09 +02:00
Björn Fromme 35826088cb feat: relax filtering constraints for non-admin groups price users 2026-08-24 14:32:45 +02:00
Björn Fromme 178df9b787 feat: update wording of booking button to better match actual function 2026-08-24 14:01:53 +02:00
Björn Fromme 96a39d5cb2 chore: update project dependencies 2026-08-24 14:01:53 +02:00
Björn Fromme 83b8ba7f8d docs: include previously ignored documentation files 2026-08-24 09:20:56 +02:00
Björn Fromme 1796ec4964 chore: update wording of inline comments 2026-08-24 09:19:32 +02:00
Björn Fromme 48db290625 feat: manually create customer access link for offer and update status
addresses #869eea8d7
2026-08-24 09:19:16 +02:00
Björn Fromme 7c5f6dd5ef feat: create ClickUp task after confirming accommodation booking 2026-08-20 17:56:29 +02:00
Björn Fromme 0a1683667f feat: explicit icon map for hotel cms-data response 2026-08-20 14:45:05 +02:00
Björn Fromme ef439f6faf feat: re-generate access links for bookings when sent via email 2026-08-20 14:21:02 +02:00
Björn Fromme 98a303e941 feat: delete accommodation bookings in draft 2026-08-20 12:39:45 +02:00
Björn Fromme 3db1850e4f feat: edit selected accommodation of bookings in draft 2026-08-20 12:34:44 +02:00
Björn Fromme c1f0cda479 feat: always sync full 24 months horizon of contingents 2026-08-20 12:03:21 +02:00
Björn Fromme 351fbab498 feat: improved contingents api performance with db backed snapshots 2026-08-20 11:46:03 +02:00
Björn Fromme d5f9f4ef10 chore: adopt namespace pattern for accommodation booking controllers 2026-08-19 17:07:57 +02:00
Björn Fromme e105c611be feat: flip region and additional info in accommodation offer view 2026-08-19 15:39:58 +02:00
Björn Fromme 6cdb331aae feat: return to detail view after editing accommodation booking 2026-08-19 15:39:30 +02:00
Björn Fromme 7b0bf9ec94 feat: make cells clickable in accommodation booking list view 2026-08-19 15:39:09 +02:00
Björn Fromme 8617bf6c86 fix: prevent generating offer links while booking is in draft 2026-08-19 13:00:43 +02:00
Björn Fromme 2601e46ec4 fix: never persist a half-built user on first login 2026-08-19 12:30:42 +02:00
Björn Fromme 0c667d6b69 feat: align role assignment logic with myep-team 2026-08-19 12:14:09 +02:00
Björn Fromme 5a3957e143 feat: refactored accommodation booking status model 2026-08-19 11:46:52 +02:00
Björn Fromme e8accbb3ed feat: replace logo png with optimized version 2026-08-18 14:40:10 +02:00
Björn Fromme 2d7a02341d feat: booking details pdf 2026-08-18 14:26:24 +02:00
Björn Fromme d3666c4618 fix: skip discounts with value 0€ 2026-08-18 13:07:31 +02:00
Björn Fromme ef24c9a616 fix: streamlined discount display in all breakdowns 2026-08-18 13:04:33 +02:00
Björn Fromme 8dee65d0dc feat: additional confirmation cycle and status for groups inquiries 2026-08-18 12:48:17 +02:00
Björn Fromme 5045846eed fix: propagate updated at timestamp to parent entity 2026-08-18 09:52:28 +02:00
Björn Fromme e8143c055b fix: always redirect to account page first on login 2026-08-17 16:38:35 +02:00
Björn Fromme 920b09dacc fix: render admin menus conditionally 2026-08-17 16:30:12 +02:00
Björn Fromme b5f1163e2d fix: handle access denied errors properly 2026-08-17 16:29:58 +02:00
Björn Fromme 8271a69f45 fix: avoid content shift caused by scrollbar 2026-08-17 16:14:25 +02:00
Björn Fromme f00351706e feat: extract collapsible container into partial 2026-08-17 16:07:26 +02:00
Björn Fromme a5d97f1206 feat: enable entering additional remarks in offer confirmation 2026-08-17 15:30:17 +02:00
Björn Fromme 582e54ddc4 feat: insert final email texts 2026-08-17 14:36:10 +02:00
Björn Fromme adee913568 chore: update project dependencies 2026-08-17 14:25:56 +02:00
Björn Fromme 396aa0bac6 fix: correct semantic html structure in offer template 2026-08-17 14:25:27 +02:00
Björn Fromme 77de1643f0 feat: import users` real names from bpn API 2026-08-17 14:24:56 +02:00
Björn Fromme bf69fcceff feat: reword flash messages, add logging 2026-08-13 15:08:34 +02:00
Björn Fromme d74127ebe2 fix: drop the implicit ROLE_USER from the userinfo roles claim 2026-08-12 17:47:44 +02:00
Björn Fromme aa486a4931 feat: expose person_id and address_id as separate userinfo claims 2026-08-12 17:47:29 +02:00
Björn Fromme 7ebd2dad1a feat: restrict admin role assignment to the privileged roles 2026-08-12 17:47:21 +02:00
Björn Fromme 7a82127494 feat: sync non-privileged BusPro roles on every login 2026-08-12 17:47:15 +02:00
Björn Fromme 490acc2e8b chore: correct stale role_hierarchy comments 2026-08-12 17:47:01 +02:00
Björn Fromme 6af8044f7c fix: collect hotel codes from every CRM selection group 2026-08-12 17:46:33 +02:00
Björn Fromme 70a10c4dba fix: make email readonly in personal data form to prevent user lockout 2026-08-11 18:08:48 +02:00
Björn Fromme a1506ef58d chore: update project dependencies, fix deprecated config setting 2026-08-11 11:45:58 +02:00
Björn Fromme af04ff690d fix: enable bookings without ski passes 2026-08-11 11:16:11 +02:00
Björn Fromme 6c1073e41c feat: admin-managed roles and hotel codes 2026-08-10 10:07:24 +02:00
Björn Fromme 124c0af0f5 fix: assign proper administrative permissions 2026-08-07 08:42:54 +02:00
Björn Fromme 212bb660a1 chore: update project dependencies 2026-08-06 13:12:40 +02:00
Björn Fromme 6ee00f2bee feat: hide unavailable ski passes from selection in create flow 2026-08-06 13:08:46 +02:00
Björn Fromme b82e017f73 fix: exclude past dates in price tables 2026-08-06 12:19:30 +02:00
Björn Fromme 577f7445ab fix: correctly calculate undersubscription fees 2026-08-06 12:05:03 +02:00
Björn Fromme 3a5895e356 feat: extended role hierarchy 2026-08-06 11:18:38 +02:00
Björn Fromme dd658bf9d6 feat: admin list filtering and search 2026-08-06 10:57:36 +02:00
Björn Fromme aa8fa5c1b2 feat: accommodation booking type and status as dedicated properties 2026-08-06 08:52:09 +02:00
Björn Fromme 2cfa87f44b feat: indicate family insurance eligibility 2026-08-05 15:11:58 +02:00
Björn Fromme 0b642dcfe4 fix: reconcile assigned family insurance rate on updated participant 2026-08-05 15:11:48 +02:00
Björn Fromme 8a46908856 fix: incorrect rules around family insurances
addresses #869dr80qj
2026-08-05 15:11:37 +02:00
Björn Fromme 736128476b feat: assignable managers for accommodation bookings 2026-08-05 13:45:33 +02:00
Björn Fromme 8e4afc0813 feat: dedicated terms urls per country for accommodation bookings 2026-08-05 12:38:34 +02:00
Björn Fromme e5fa63b7e8 feat: dedicated logos per country for accommodation bookings 2026-08-05 12:28:43 +02:00
Björn Fromme 84df3a94d9 chore: update project dependencies 2026-08-05 09:02:14 +02:00
Björn Fromme 2c381ee741 feat: additional status 2026-08-04 18:09:40 +02:00
Björn Fromme dc86e715cb feat: create new bookings or inquiries on behalf of customer 2026-08-04 17:29:05 +02:00
Björn Fromme 5f2252af71 fix: render field in order with other fields 2026-08-04 17:11:53 +02:00
Björn Fromme 455456b6bc feat: manual sorting of additional services 2026-08-04 17:06:41 +02:00
Björn Fromme 045fdea923 chore: cleanup documents 2026-08-04 16:43:06 +02:00
Björn Fromme 8ff13614d2 fix: treat dates without price as unavailable 2026-08-04 11:29:58 +02:00
Björn Fromme 331c88c38e feat: exclusion groups for additional services 2026-08-04 10:24:29 +02:00
Björn Fromme c31d086356 fix: avoid form jumping to top after making a selection 2026-08-04 09:42:01 +02:00
Björn Fromme dde36ccba2 feat: use dedicated sender for accommodation related emails 2026-08-04 09:21:00 +02:00
Björn Fromme 97d98f7f12 fix: show missing fields' label in flash message 2026-08-03 19:51:38 +02:00
Björn Fromme 0546f223f0 fix: correct icon rendering on offer page 2026-08-03 19:37:04 +02:00
Björn Fromme 6b807f358e fix: correctly generate redirect url after form submission 2026-08-03 18:28:16 +02:00
Björn Fromme 6f84fc755b feat: replace board service placeholder to avoid duplicate entries 2026-08-03 18:22:07 +02:00
Björn Fromme b54c8917c9 feat: add logging to contingent api endpoint 2026-08-03 17:59:19 +02:00
Björn Fromme efc385bf54 fix: remove irrelevant schema drift from migration 2026-08-03 17:24:31 +02:00
Björn Fromme 18b59534f0 fix: typos in migration classes 2026-08-03 17:20:14 +02:00
Björn Fromme 8a361ee703 chore: update placehoder text 2026-08-03 16:37:35 +02:00
Björn Fromme 0f1f65fb79 feat: control menu items visibility per role 2026-08-03 16:29:21 +02:00
Björn Fromme 0b21bb00cb feat: sort groups price services by price first, then alphabetically 2026-08-03 16:23:47 +02:00
Björn Fromme 9d2aa11fdb feat: groups price calculator admin crud, booking/offer flow and api 2026-08-03 15:25:10 +02:00
Björn Fromme eabed8295a feat: adopt provided label for parking space service from xml data 2026-08-03 09:07:18 +02:00
Björn Fromme 7ec3903bdf chore: update project dependencies 2026-08-01 16:19:50 +02:00
Björn Fromme c929d4da3b feat: show tooltips for parking space option and omit price when 0,00
addresses #869ebkmhw
2026-08-01 16:19:14 +02:00
Björn Fromme 10d5356381 chore: update project dependencies 2026-07-23 17:54:47 +02:00
Björn Fromme b323c120f9 fix: consider parking space availability 2026-07-23 17:44:08 +02:00
Björn Fromme fafc60eba9 fix: retain original date of birth when anonymizing xml dumps 2026-07-16 15:53:33 +02:00
Björn Fromme bd2d8b58a3 chore: update documentation 2026-07-15 18:00:30 +02:00
Björn Fromme 52327864d6 chore: adjust cypress base url 2026-07-15 17:47:37 +02:00
Björn Fromme 3cc5d00587 feat: add insurance revocation link to footer 2026-07-14 12:27:29 +02:00
Björn Fromme f620cae4f9 chore: update project dependencies 2026-07-14 09:47:48 +02:00
Björn Fromme 6c4ea07e6e fix: prevent race condition on newsletter consent confirmation 2026-07-14 09:47:22 +02:00
Björn Fromme b95944701e chore: update project dependencies 2026-07-13 14:19:15 +02:00
Björn Fromme 2f8701c2e0 chore: fix cgl issues flagged by phpstan 2026-07-10 14:33:09 +02:00
Björn Fromme f47142c465 chore: add missing branch coverage for BookingEditPreFlightChecker 2026-07-10 14:33:09 +02:00
Björn Fromme 3105f2e7a0 fix: position loading indicator above modal 2026-07-10 14:33:09 +02:00
Björn Fromme 0ea43d0c6b fix: correct edit reload dirty-state 2026-07-10 14:33:09 +02:00
Björn Fromme 99b6876ce2 fix: ensure mandatory services are preselected in edit mode 2026-07-10 14:33:09 +02:00
Björn Fromme 4e26b8acc0 fix: reload booking data from API when no user edits are pending 2026-07-10 14:33:09 +02:00
Björn Fromme 0b2a16d117 fix: add placeholders for fields nationality and country 2026-07-10 14:33:09 +02:00
Björn Fromme b41b19d4c6 feat: pre-flight check of agency bookings
addresses #869bqxr4q
2026-07-10 14:33:09 +02:00
Björn Fromme f9142e3080 chore: update frontend tooling and dependencies 2026-07-10 14:31:47 +02:00
Björn Fromme 9660149c67 fix: prevent stale htmx cache on login potentially causing csrf issues
addresses #869dd1fch
2026-07-10 14:30:31 +02:00
Björn Fromme 2b957e1887 feat: revert password grant in favor of pkce 2026-07-10 12:26:26 +02:00
Björn Fromme 57a2503da2 chore: update project dependencies 2026-07-10 09:07:22 +02:00
Björn Fromme f5f84ad98e feat: password grant 2026-07-10 09:02:33 +02:00
Björn Fromme de37186706 feat: make server errors visible to the user for htmx requests 2026-07-02 10:02:05 +02:00
Björn Fromme 4d3fc69faa fix: register field handler in service container correctly 2026-07-02 09:33:16 +02:00
Björn Fromme 022819cbe6 feat: reveal password toggle for login form
addresses #869cqrw6w
2026-07-01 10:29:30 +02:00
Björn Fromme 1b0d7ce1a9 chore: update project dependencies 2026-07-01 10:21:41 +02:00
Björn Fromme a6ed60462d refactor: inject AgeConstraintParserRegistry into TravelParser 2026-06-26 17:20:42 +02:00
Björn Fromme a8d2852313 fix: log swallowed exceptions in date parsing and webhook 2026-06-26 17:17:49 +02:00
Björn Fromme 8907233ef5 fix: adopt response format of bpn personal data endpoint 2026-06-25 15:06:15 +02:00
Björn Fromme 7a3d3a3a96 fix: handle bpn notification response on personal data update 2026-06-25 15:06:15 +02:00
Björn Fromme 23a3430ea5 fix: skip blank xml nodes and attributes when anonymizing data 2026-06-24 13:59:04 +02:00
Björn Fromme a15c7578c3 fix: do not copy applicant address into participant for agency bookings 2026-06-24 13:13:14 +02:00
Björn Fromme 08f6633507 fix: sync booking model when transportation discount is replaced 2026-06-23 16:24:15 +02:00
Björn Fromme dbe33ec760 fix: exclude name and date of birth from editable fields for now 2026-06-23 15:47:33 +02:00
Björn Fromme 145f7de781 fix: make personal data editable in bookings as permitted by bpn 2026-06-23 15:24:10 +02:00
Björn Fromme 287ec30cf7 chore: simplify datatable css 2026-06-23 15:22:33 +02:00
Björn Fromme c29634b0d2 fix: narrow scope of table styles 2026-06-23 15:19:26 +02:00
Björn Fromme ffa2038acb fix: correct test references to use selection ID 1475 for exemption 2026-06-23 13:41:03 +02:00
Björn Fromme febbf8dd1d fix: pass hotelId when loading travel data for booking edit 2026-06-23 13:36:15 +02:00
Björn Fromme 09610ab3cd chore: update deployer config with basic auth for staging environment 2026-06-23 12:15:08 +02:00
Björn Fromme 33328074b0 chore: update project dependencies 2026-06-23 08:18:31 +02:00
Björn Fromme 1dc14a193a chore: update project dependencies 2026-06-22 09:03:47 +02:00
Björn Fromme 2fc7ffe458 feat: remove easy admin bundle, adopt admin theme 2026-06-22 08:59:47 +02:00
Björn Fromme 52ee6b26b1 feat: full anonymization of buspro xml dumps 2026-06-21 16:49:54 +02:00
Björn Fromme d77f92b6f0 fix: increase width of modal container 2026-06-18 10:06:06 +02:00
Björn Fromme e65cd3a96e chore: update project dependencies 2026-06-17 10:32:23 +02:00
Björn Fromme 80569e0977 feat: cli command to anonymize local database 2026-06-17 10:32:02 +02:00
Björn Fromme 66d0f511df chore: update project dependencies 2026-06-15 14:24:32 +02:00
Björn Fromme 93201fbd20 feat: disable body dimensions validation for selection id 1475
closes #869dne7qt
2026-06-12 11:39:32 +02:00
Björn Fromme b2fccae431 chore: remote obsolete contingents-related plumbing 2026-06-11 16:19:14 +02:00
Björn Fromme 8c99fba6fa chore: update project dependencies 2026-06-11 15:54:26 +02:00
Björn Fromme d207bc74cb feat: force booking status 'O' for selection id 1473
addresses #869d79q0r
2026-06-11 15:53:56 +02:00
Björn Fromme bcf75ce3c3 chore: update project dependencies 2026-06-10 11:44:29 +02:00
Björn Fromme d08d9dbb9f feat: make body dimensions optional even with rentals selected 2026-06-10 11:43:59 +02:00
Björn Fromme 33f0cb04e0 feat: update newsletter list ids 2026-06-09 14:18:01 +02:00
Björn Fromme 3fb95cab92 fix: prefill correct value for country in dummy data 2026-06-08 17:18:42 +02:00
Björn Fromme b768af15fe chore: update project dependencies 2026-06-08 08:33:33 +02:00
Björn Fromme 00889318ee fix: validate body dimensions when rentals are selected only 2026-06-02 14:22:47 +02:00
Björn Fromme f023bd9772 chore: remove redundant instance check flagged by phpstan 2026-05-28 15:49:09 +02:00
Björn Fromme 4ec1935eef fix: avoid phpstan crashing with multiple processes in parallel 2026-05-28 15:46:56 +02:00
Björn Fromme ee8c6a6545 fix: normalize non-numeric body dimension values of existing drafts 2026-05-28 15:35:34 +02:00
Björn Fromme 02b1cbfd6c chore: update project dependencies 2026-05-28 15:34:53 +02:00
Björn Fromme 97f88d5eeb fix: accept response code 422 in htmx as 'should swap' 2026-05-28 15:02:53 +02:00
Björn Fromme 5561a24050 chore: fix deprecations in flysystem config 2026-05-28 13:59:55 +02:00
Björn Fromme bdf8cffd04 feat: replace dropdowns with individual fields for body dimensions 2026-05-28 13:59:30 +02:00
Björn Fromme fa7e5c2091 chore: update project dependencies 2026-05-28 09:37:12 +02:00
Björn Fromme f1a5d478f3 chore: update project dependencies 2026-05-18 12:48:22 +02:00
Björn Fromme de4dadb9e5 feat: mention selected port by api client in log messages 2026-05-18 12:48:07 +02:00
Björn Fromme b18b09d4a5 chore: update project dependencies 2026-05-15 09:40:27 +02:00
Björn Fromme 3f66cb89e6 fix: cleanup mailjet webhook logging 2026-05-13 17:34:15 +02:00
Björn Fromme 495c130e79 chore: update project dependencies 2026-05-13 08:30:50 +02:00
Björn Fromme 7dfbc06bd1 feat: only handle unsubscribe events for configured list ids 2026-05-13 08:30:22 +02:00
Björn Fromme 132dfc6860 chore: update project dependencies 2026-05-11 11:04:22 +02:00
Björn Fromme e647b6c1f0 fix: remove messenger task from schedule to be run separately 2026-05-11 11:03:20 +02:00
Björn Fromme 8b3ef0df95 chore: update deployer config to be run on the host 2026-05-10 14:57:09 +02:00
Björn Fromme 224673a2c4 chore: update project dependencies 2026-05-07 11:41:09 +02:00
Björn Fromme eaff989bdd fix: always filter ski passes by participant's age 2026-05-07 11:40:45 +02:00
Björn Fromme 8ac62d2a02 chore: update project dependencies 2026-05-04 17:21:16 +02:00
Björn Fromme 1fa8f88a6d chore: code cleanup with rector and php-cs-fixer 2026-05-04 17:20:01 +02:00
Björn Fromme d211425ff2 chore: integrate with rector 2026-05-04 17:19:35 +02:00
Björn Fromme 5b16a515f3 fix: add missing scheduler task for messenger 2026-05-02 14:17:09 +02:00
Björn Fromme 259cbd02c5 fix: reduce logger noise 2026-04-30 15:17:21 +02:00
Björn Fromme 014a057164 chore: cleanup email template 2026-04-30 14:49:34 +02:00
Björn Fromme 9ebfdb3d95 chore: update project dependencies 2026-04-30 12:32:09 +02:00
Björn Fromme 4f6b82daa8 chore: fix phpstan errors, add inline docs 2026-04-30 12:31:58 +02:00
Björn Fromme 77ad96baf9 fix: ensure MailJet exclusion flag is revoked for new subscriptions 2026-04-30 12:24:42 +02:00
Björn Fromme 68900dd4ea fix: use plain password in configuration for MailJet webhook url 2026-04-30 11:44:17 +02:00
Björn Fromme c0c8ad515c fix: properly handle 'veg' services in booking edit flow 2026-04-29 11:59:39 +02:00
Björn Fromme 287c299c41 feat: improved performance by avoiding redundant MailJet API calls 2026-04-29 11:18:52 +02:00
Björn Fromme a2bcedafc4 feat: cli command to un-/register MailJet webhook url 2026-04-29 10:36:04 +02:00
Björn Fromme daf89f9189 fix: initialize DOI in booking create flow with newsletter subscription 2026-04-29 10:10:18 +02:00
Björn Fromme 2f96af9254 chore: remove obsolete command 2026-04-29 10:09:16 +02:00
Björn Fromme 18a97394e8 chore: cleanup, update project dependencies 2026-04-29 09:58:40 +02:00
Björn Fromme e4ef2f7adc feat: MailJet list handling with DOI, webhook receiver and API endpoint
addresses #869cut134
2026-04-29 09:51:57 +02:00
Björn Fromme df7885ca1c chore: update documentation files 2026-04-22 11:33:08 +02:00
Björn Fromme d5dfb6c550 fix: collect dataset transfer failures instead of breaking execution 2026-04-22 11:23:52 +02:00
Björn Fromme 9b84893d88 feat: api endpoints and xml sync for contingents data 2026-04-22 11:23:52 +02:00
Björn Fromme a1f68ec11d chore: adopt changed behavior from 02a1640b in test 2026-04-22 11:23:14 +02:00
Björn Fromme b9c6ace1da chore: remove obsolete packages, update dependencies 2026-04-22 11:22:38 +02:00
Björn Fromme c1c7466dc7 fix: add missing field handler registration 2026-04-21 16:01:48 +02:00
Björn Fromme 02a1640b51 feat: additional notification about invoice download
closes #869cxbk6c
2026-04-21 15:34:04 +02:00
Björn Fromme 083e68ee4d feat: placeholder text for room remarks field
closes #869ch2wv8
2026-04-21 15:10:50 +02:00
Björn Fromme 4f7cd2c025 chore: update project dependencies 2026-04-21 15:10:23 +02:00
Björn Fromme 80969d1da0 chore: further cleanup and refactor 2026-04-19 15:45:02 +02:00
Björn Fromme 5a0bf11c81 chore: update project dependencies 2026-04-19 13:58:39 +02:00
Björn Fromme ca6e38cb9c chore: replace global binds with dedicated service definition 2026-04-16 17:11:02 +02:00
Björn Fromme ca5a604a3e fix: corrupted logic of model transformer 2026-04-16 16:40:38 +02:00
Björn Fromme 0fcecc9c58 chore: fix phpstan errors 2026-04-16 16:27:35 +02:00
Björn Fromme 4e925171b3 chore: update frontend tooling 2026-04-16 13:47:26 +02:00
Björn Fromme 41e2fe19bc chore: update project dependencies 2026-04-16 13:39:35 +02:00
Björn Fromme a927d6bf59 chore: cgl cleanup 2026-04-16 13:34:54 +02:00
Björn Fromme c0cc183c59 feat: rename BookingSessionStore to BookingSessionManager 2026-04-16 13:34:54 +02:00
Björn Fromme b68c4ff9b4 chore: update booking-flow reference to current class names in docs 2026-04-16 13:34:54 +02:00
Björn Fromme 132329361f fix: pass logger explicitly to BookingCreateTrait::handleApiError 2026-04-16 13:34:54 +02:00
Björn Fromme 4d86629315 feat: move display-assembly out of BookingPriceCalculator 2026-04-16 13:34:54 +02:00
Björn Fromme d1c92f2957 feat: replace *Service suffix with role-based class names 2026-04-16 13:34:54 +02:00
Björn Fromme 0d2cc5b998 feat: consolidate micro-services and unify draft merge logic 2026-04-16 13:34:54 +02:00
Björn Fromme fdfd5d56c9 chore: add booking flow reference document 2026-04-16 13:34:54 +02:00
Björn Fromme 059c520a50 fix: link header logo with user profile page 2026-04-13 12:24:15 +02:00
Björn Fromme d8818dc435 feat: extract shared booking summary travel partial 2026-04-13 12:24:15 +02:00
Björn Fromme 2baa147afa feat: clarify booking summary participant count 2026-04-13 12:24:09 +02:00
Björn Fromme e179bbe259 feat: remove deprecated booking service alias 2026-04-13 12:23:57 +02:00
Björn Fromme 16cab4b768 feat: add typed dto for cms data 2026-04-12 18:17:54 +02:00
Björn Fromme 6ab34fa87c chore: merge service methods 2026-04-12 17:55:29 +02:00
Björn Fromme fcfd366dec chore: flatten namespace 2026-04-12 17:54:24 +02:00
Björn Fromme 98dd685679 feat: extract participant draft field applier 2026-04-12 14:40:05 +02:00
Björn Fromme 2597318488 chore: stabilize Bpn XML sync CLI assertions 2026-04-12 13:49:10 +02:00
Björn Fromme aa997826f8 feat: split summary DTOs into typed sub-objects 2026-04-12 11:23:19 +02:00
Björn Fromme 69705052b3 feat: centralize create/edit flow contexts, extract edit submit service 2026-04-12 10:17:04 +02:00
Björn Fromme f903f17ebd feat: replace edit participant facade with context factory 2026-04-11 18:28:32 +02:00
Björn Fromme 95d50e9833 fix: return proper response for stale participant edit urls 2026-04-11 18:28:32 +02:00
Björn Fromme 63e8a068b3 feat: move prepopulation guards into participant service 2026-04-11 18:28:32 +02:00
Björn Fromme dbc0b4acee feat: extract booking participant count service 2026-04-11 18:28:32 +02:00
Björn Fromme f31ac660d2 feat: extract room grouping from booking service 2026-04-11 18:28:32 +02:00
Björn Fromme 8b72f8c277 feat: extract booking session handling 2026-04-11 18:28:32 +02:00
Björn Fromme ca052682bb feat: simplify pricing and room selection display 2026-04-11 18:28:32 +02:00
Björn Fromme 1b0e479e49 feat: refactor participant card DTOs and labels 2026-04-11 18:28:32 +02:00
Björn Fromme f22ceae41c feat: split booking participant controllers 2026-04-11 18:28:32 +02:00
Björn Fromme 346256f895 feat: simplify booking pricing flow 2026-04-11 18:28:32 +02:00
Björn Fromme a0cbd5a23f chore: adjust http client config for mailjet api 2026-04-11 18:28:09 +02:00
Björn Fromme 803b0608cc chore: add test 2026-04-03 15:24:56 +02:00
Björn Fromme 7eb1cbdabd fix: remove redundant insurance hydration, cache snapshots and files map 2026-04-03 15:20:37 +02:00
Björn Fromme ca873a99f4 feat: improved button sizes in mobile view 2026-04-03 14:57:41 +02:00
Björn Fromme 8d666baf28 feat: back-button in booking create flow 2026-04-03 14:20:19 +02:00
Björn Fromme be0c9d67bb chore: update tests to adopt recent changes 2026-04-03 13:49:50 +02:00
Björn Fromme f0594ba09c chore: update project dependencies 2026-04-03 13:46:13 +02:00
Björn Fromme fce6d1615a chore: cleanup, add PHPStan type annotations 2026-04-03 13:45:41 +02:00
Björn Fromme a264526127 chore: integrate with PHPStan 2026-04-03 13:45:23 +02:00
Björn Fromme fbfffbb31a fix: simplify trait to address incorrect arguments 2026-03-28 10:18:34 +01:00
Björn Fromme bca3610cff feat: delete orphaned future snapshots after xml sync 2026-03-25 15:35:12 +01:00
Björn Fromme facd91375c chore: update project dependencies 2026-03-25 14:11:00 +01:00
Björn Fromme 96321005e0 feat: combine log entries into single sum-up entry 2026-03-25 14:10:25 +01:00
Björn Fromme 6f07678f04 fix: reduce snapshot payloads via serializer group and hydration 2026-03-24 17:06:10 +01:00
Björn Fromme 3b6ee90a7e feat: refresh existing snapshots from XML after sync 2026-03-24 11:13:11 +01:00
Björn Fromme 909e8a1d8e chore: update project dependencies 2026-03-23 19:41:04 +01:00
Björn Fromme 8f2baca339 chore: update scheduler config to delete expired oauth2 tokens 2026-03-23 19:38:12 +01:00
Björn Fromme 637166bfd6 chore: remove schema drift 2026-03-23 19:27:37 +01:00
Björn Fromme 45af3a21b7 chore: replace deprecated attribute 2026-03-23 19:23:59 +01:00
Björn Fromme 7e686cef6b chore: add inline documentation 2026-03-23 19:22:18 +01:00
Björn Fromme be43d30cc7 fix: skip snapshots of travels still available as XML from refreshing 2026-03-23 19:15:45 +01:00
Björn Fromme 77b16f287a chore: remove obsolete feature flag 2026-03-23 17:43:12 +01:00
Björn Fromme bc7fb794bf feat: persist travel snapshots and refresh extended availability 2026-03-23 17:29:10 +01:00
Björn Fromme c1ab6d8687 chore: adopt monolog config for staging environment from prod 2026-03-23 17:28:51 +01:00
Björn Fromme ccfafc5da4 fix: allow hotel-less travel data
addresses #869ckkwh7
2026-03-23 16:59:49 +01:00
Björn Fromme 502281e219 chore: add staging to http client environments 2026-03-23 11:50:40 +01:00
Björn Fromme b81cc58d5e chore: update http-client config 2026-03-20 14:24:04 +01:00
Björn Fromme 05ac07d656 fix: delete unavailable files during xml sync
addresses #869chrmp4
2026-03-20 14:23:51 +01:00
Björn Fromme 3234c78f0d feat: harden xml parsing to avoid uncaught errors 2026-03-20 12:14:02 +01:00
Björn Fromme 3849ae306c feat: extended log view and searching by error codes 2026-03-20 11:44:55 +01:00
Björn Fromme 301b14f518 feat: dedicated room pricing calculation for step 1 of create flow 2026-03-19 16:40:59 +01:00
Björn Fromme df8566e1b5 feat: move scope of enforced 'option' status to full booking
addresses #869chtfeq
2026-03-19 16:15:07 +01:00
Björn Fromme 45d05786da fix: correctly calculate room pricing based on participant assignment 2026-03-19 15:45:23 +01:00
Björn Fromme 6a6bebb2d1 feat: update wording and style of password reset flash message 2026-03-19 12:41:06 +01:00
Björn Fromme ea76c808de chore: update field label 2026-03-19 09:46:06 +01:00
Björn Fromme f9069540a9 chore: update project dependencies 2026-03-19 09:44:03 +01:00
Björn Fromme 8a9868b644 chore: update http request config with current travel date 2026-03-19 09:43:37 +01:00
Björn Fromme d1e2bf3e7d feat: integrate with MailJet API for newsletter registration 2026-03-19 09:42:00 +01:00
Björn Fromme 66c55f0722 chore: update project dependencies 2026-03-18 15:25:31 +01:00
Björn Fromme ca7d0b6965 feat: extended price mismatch diagnostics in logs 2026-03-18 15:24:52 +01:00
Björn Fromme 02ff28acdd fix: use correct amount of rooms to calculate rooms pricing 2026-03-18 15:24:29 +01:00
Björn Fromme cb56a4fe46 feat: implement mutability cutoff for rentals
addresses #869cca42x
2026-03-17 10:29:43 +01:00
Björn Fromme 752e6752b4 feat: limit room remarks field to 200 characters to align with buspro 2026-03-17 10:01:40 +01:00
Björn Fromme 00df76269a chore: cleanup after master flatten rewrite 2026-03-17 09:44:50 +01:00
Björn Fromme 99483b3506 chore: update project dependencies 2026-03-17 08:58:44 +01:00
Björn Fromme 5619a6f22f fix: XML scope for services too broad 2026-03-16 20:25:56 +01:00
Björn Fromme c510cbf590 feat: auto-booking services
addresses #869cfcptv
2026-03-16 20:24:58 +01:00
Björn Fromme 6d9265de0f fix: restore unintended file changes after master flatten rewrite 2026-03-16 14:15:51 +01:00
Björn Fromme 49ea562322 fix: enforce submit-time immutability, scope booking cache per user 2026-03-16 12:03:00 +01:00
Björn Fromme 1f087b6c08 chore: update test to recent changes 2026-03-16 12:03:00 +01:00
Björn Fromme 37c839600e fix: reduce mutability data cache ttl to avoid staleness
addresses #869cdzmkq
2026-03-16 12:03:00 +01:00
Björn Fromme cef2e4fa49 fix: ensure mutability is accounted for when restoring drafts
addresses #869cdzmkq
2026-03-16 12:03:00 +01:00
Björn Fromme 11ff2b9084 fix: assign mandatory services when applying dummy data 2026-03-16 12:03:00 +01:00
Björn Fromme 69f16b59cb chore: update project dependencies 2026-03-16 12:03:00 +01:00
Björn Fromme 0e644260b6 feat: update wording 2026-03-16 12:03:00 +01:00
Björn Fromme 33609ab534 feat: shortened and filename-safe request ids 2026-03-16 12:03:00 +01:00
Björn Fromme 1cc7a025a1 fix: ensure pickups node exists in api payload 2026-03-16 12:03:00 +01:00
Björn Fromme 709b0ff61e fix: ensure drop-offs are submitted when same as pickups 2026-03-16 12:03:00 +01:00
Björn Fromme 0d7d90a442 feat: anonymization command for request/response XML dumps 2026-03-16 12:03:00 +01:00
Björn Fromme 5cbdc5eaf2 chore: update project dependencies 2026-03-16 12:03:00 +01:00
Björn Fromme a7c3064df6 feat: adopt new pickups planning payload JSON structure 2026-03-16 12:03:00 +01:00
Björn Fromme f63d52c9d6 chore: cleanup 2026-03-16 12:03:00 +01:00
Björn Fromme b752256bda fix: validate mandatory services selection 2026-03-16 12:03:00 +01:00
Björn Fromme 474d171779 fix: correctly validate pickup selection
closes #869c94jqn
2026-03-16 12:03:00 +01:00
Björn Fromme 51ce9b6e45 fix: don't restore selections from draft for immutable fields 2026-03-16 12:03:00 +01:00
Björn Fromme 9cef24f827 fix: enforce mutability checks for all fields 2026-03-16 12:03:00 +01:00
Björn Fromme e6880b7fed chore: remove dead code 2026-03-16 12:03:00 +01:00
Björn Fromme e505eba111 chore: add git ignored temp directory 2026-03-16 12:03:00 +01:00
Björn Fromme 4e067d13b3 feat: avoid indexing of content by crawlers 2026-03-16 12:03:00 +01:00
Björn Fromme 40c0042158 feat: use normalized checkbox values in field handlers 2026-03-16 12:03:00 +01:00
Björn Fromme 6abfa122e4 chore: update plan for symfony 7.4 upgrade 2026-03-16 12:03:00 +01:00
Björn Fromme 032540a712 chore: update project dependencies 2026-03-16 12:03:00 +01:00
Björn Fromme cf95048f2b fix: prevent race conditions in htmx boost response handling 2026-03-16 12:03:00 +01:00
Björn Fromme 29a1ce7de7 fix: ensure loading indicator when entering booking flow in Chrome 2026-03-16 12:03:00 +01:00
Björn Fromme 1670b8b8d2 fix: avoid selection trap for mandatory services with age constraints 2026-03-16 12:03:00 +01:00
Björn Fromme 3644b935fd fix: always fill-in empty participants names when submitting to api 2026-03-16 12:03:00 +01:00
Björn Fromme 20162cceef chore: update project dependencies 2026-03-16 12:03:00 +01:00
Björn Fromme 44a9de7db7 fix: correct sort order of pickups and drop-offs 2026-03-16 12:03:00 +01:00
Björn Fromme f99a2d99a2 fix: show pickup select field for outbound bus travel only 2026-03-16 12:03:00 +01:00
Björn Fromme f795a3ea21 feat: selectable drop-offs for inbound bus travel 2026-03-16 12:03:00 +01:00
Björn Fromme f8a56b7de2 chore: split scheduler config for prod and staging 2026-03-16 12:03:00 +01:00
Björn Fromme 8a667ccaba chore: update project dependencies 2026-03-16 12:03:00 +01:00
Björn Fromme 6ddd0b00bd fix: handle empty api responses more gracefully 2026-03-16 12:03:00 +01:00
Björn Fromme c597cfda51 feat: legal links in page footer 2026-03-16 12:03:00 +01:00
Björn Fromme f673bc59d0 fix: catch unexpected api response for personal data 2026-03-16 12:03:00 +01:00
Björn Fromme 78b925daa6 fix: backward compatibility for new session format 2026-03-16 12:03:00 +01:00
Björn Fromme 4e05c94912 fix: correctly determine file size and avoid type mismatch 2026-03-16 12:03:00 +01:00
Björn Fromme acb599b760 feat: show booking status in sidebar 2026-03-16 12:03:00 +01:00
Björn Fromme c7b70dbd56 feat: dummy data fill
closes #869c3khk0
2026-03-16 12:03:00 +01:00
Björn Fromme b4f7299f27 chore: update project dependencies 2026-03-16 12:03:00 +01:00
Björn Fromme 6fd5a218a3 feat: reduce session payload 2026-03-16 12:03:00 +01:00
Björn Fromme a1518c06fb chore: use correct database type to replicate prod environment 2026-03-16 12:03:00 +01:00
Björn Fromme c517a0b41f chore: add staging environment to deployer config 2026-03-16 12:03:00 +01:00
Björn Fromme ded904fac8 fix: correct room assignment and count
closes #869c2jnzr
2026-03-16 12:03:00 +01:00
Björn Fromme abea6bff7b chore: align node and npm versions of DDEV with host, use npm ci 2026-03-16 12:03:00 +01:00
Björn Fromme 06f53ba6eb feat: fill default names for canceled participants in agency bookings 2026-03-16 12:03:00 +01:00
Björn Fromme eda0919f52 chore: update frontend tooling 2026-03-16 12:03:00 +01:00
Björn Fromme 1f27c744d2 chore: code cleanup 2026-03-16 12:02:59 +01:00
Björn Fromme bbc011ddb9 feat: update personal data of canceled participants as well
addresses #869bze0kq
2026-03-16 12:02:59 +01:00
Björn Fromme c2054a1ef6 chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme f9d420fecd feat: revert allow updating room assignments in edit mode 2026-03-16 12:02:59 +01:00
Björn Fromme 3e1d719512 chore: update platform specs in composer.json for prod 2026-03-16 12:02:59 +01:00
Björn Fromme f685bd18ab chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme f46cc59041 fix: allow updating room assignments in edit mode 2026-03-16 12:02:59 +01:00
Björn Fromme 380b1ed329 chore: streamline namespacing 2026-03-16 12:02:59 +01:00
Björn Fromme 1056b4fba6 chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme 19031dba99 fix: enforce profile completion of applicant in all situations 2026-03-16 12:02:59 +01:00
Björn Fromme 028db7a7ee fix: ensure complete participant data even when canceled 2026-03-16 12:02:59 +01:00
Björn Fromme a1764faaeb chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme 8529bb0e21 fix: streamline datalayer integration for all events 2026-03-16 12:02:59 +01:00
Björn Fromme 9eefdd1858 fix: properly initialize CMP, GTM and data layer for tracking 2026-03-16 12:02:59 +01:00
Björn Fromme e5803860df feat: remove street from hotel address in sidebar
addresses #869bwq1vh
2026-03-16 12:02:59 +01:00
Björn Fromme 2754d734aa chore: update frontend dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme 3487ca4822 chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme 02ebddc34a feat: require all personal data fields for registration 2026-03-16 12:02:59 +01:00
Björn Fromme 3957f6bd09 feat: tracking integration with GTM and CMP 2026-03-16 12:02:59 +01:00
Björn Fromme 11ab98b3d8 feat: domain-based theme-detection 2026-03-16 12:02:59 +01:00
Björn Fromme e24403949c chore: update database and php versions to match prod environment 2026-03-16 12:02:59 +01:00
Björn Fromme 288f6b91d0 chore: update deployer config for new hosting environment 2026-03-16 12:02:59 +01:00
Björn Fromme 8ca105966d fix: don't normalize hotel and product codes when fetching cms data 2026-03-16 12:02:59 +01:00
Björn Fromme 592cd517ff chore: update project url in ddev 2026-03-16 12:02:59 +01:00
Björn Fromme 586b410a66 chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme a444940db2 feat: display error codes in admin overview 2026-03-16 12:02:59 +01:00
Björn Fromme afe5aef9f7 feat: error-codes in flash messages to reference log entries 2026-03-16 12:02:59 +01:00
Björn Fromme 21a3e8fafc feat: user-friendly error messages on login 2026-03-16 12:02:59 +01:00
Björn Fromme 26bbba5a2e feat: streamlined flash messages 2026-03-16 12:02:59 +01:00
Björn Fromme b68d5c9398 fix: revert pickup pricing to match current BusPro behavior
Reverts split pricing calculation to use outbound-only pricing,
matching BusPro's current behavior where pickup is only charged when
outbound transportation is BUS.

- Use pickup->price directly instead of calculateEffectivePrice()
- PKW+BUS scenario now correctly charges €0 (matches BusPro loophole)
- priceOutbound/priceInbound remain populated for future activation
- Updated documentation with current behavior and future plan
2026-03-16 12:02:59 +01:00
Björn Fromme c1425f0562 feat: extensible participant status determination for booking creation
Adds a rule-based system to determine participant status in CREATE
payloads. Participants selecting a 'Begleitperson' service now receive
status 'O' (Option), all others default to 'F' (Final).

- Add ParticipantStatusRuleInterface for defining status rules
- Add ParticipantStatusRuleRegistry for priority-based rule evaluation
- Add ChaperonServiceStatusRule for Begleitperson detection
- Integrate status evaluation into BookingPayloadBuilder
2026-03-16 12:02:59 +01:00
Björn Fromme e1f1b60608 feat: infotext for insurance booking conditions
closes #869bvcu2p
2026-03-16 12:02:59 +01:00
Björn Fromme ea1c95528c chore: update httpclient config to use random values for contactform 2026-03-16 12:02:59 +01:00
Björn Fromme 0cac2969ae feat: log contact form submissions 2026-03-16 12:02:59 +01:00
Björn Fromme b856c51389 chore: remove debug logging in toast controller 2026-03-16 12:02:59 +01:00
Björn Fromme aa3b23ecb8 feat: info text and correct field type for service group 'VEG'
addresses #869bvch71
2026-03-16 12:02:59 +01:00
Björn Fromme 1e653e213a fix: don't hide voucher fields for booking status 'O'
closes #869bvbkrd
2026-03-16 12:02:59 +01:00
Björn Fromme 7d91dcfb70 chore: update test to fix deprecation warning 2026-03-16 12:02:59 +01:00
Björn Fromme 8e7e6266f0 chore: update project dependencies 2026-03-16 12:02:59 +01:00
Björn Fromme 167ccf5151 feat: ignored room types
closes #869bvbmcw
2026-03-16 12:02:59 +01:00
Björn Fromme c582e0820a feat: move profile completeness check from login to booking flow entry
- Add profileComplete flag to User entity to avoid API calls
- Set flag during login (BpnAuthenticator) and profile save
- Check flag in IndexController when entering booking flow
- Remove ProfileCompletionSubscriber (no longer needed)

Users with incomplete profiles are only redirected when starting
a new booking, not on every login. Eliminates extra API call by
caching completeness status on the user entity.
2026-03-16 12:02:59 +01:00
Björn Fromme 7d3a63d744 chore: update alert wording to be more descriptive 2026-03-16 12:02:59 +01:00
Björn Fromme 0a0987873f feat: enforce profile data completeness before entering booking flow 2026-03-16 12:02:59 +01:00
Björn Fromme 18d60c8781 feat: allow editing of nationality in personal data 2026-03-16 12:02:59 +01:00
Björn Fromme 7708ea6a0f fix: default participant's nationality to German to avoid missing data 2026-03-16 12:02:59 +01:00
Björn Fromme 71a46c6b63 chore: update rsync excludes in deployer config 2026-03-16 12:02:55 +01:00
Björn Fromme 667324df69 feat: body dimensions mandatory with selected rentals, updated help text
feat: body dimensions mandatory with selected rentals
2026-03-16 12:02:28 +01:00
Björn Fromme 957e20d763 fix: preserve selected services from booking even when unavailable
When editing a booking, services that were previously booked but are no
longer available in the travel catalog were being dropped. This caused
API error 650 ("Anzahl Leistung stimmt nicht mit Teilnehmerzuordnung
überein") because the service participant counts no longer matched.

The fix ensures that in edit mode, booked services are merged with
travel data services in both:
- Form rendering (ParticipantFieldOptionsProvider): so checkboxes appear
- Handler validation (AbstractParticipantFieldHandler): so selections
  are accepted

This allows users to keep their existing service selections or
deliberately replace them with other available options. Create mode
remains unchanged.
2026-03-16 12:02:28 +01:00
Björn Fromme 029a87c6ca doc: add technical documentation 2026-03-16 12:02:28 +01:00
Björn Fromme baa4609102 fix: ensure unique services mapping when creating api payload 2026-03-16 12:02:28 +01:00
Björn Fromme 875943e4da feat: match modes for room selection condition to detect MBZ*
addresses #869btdcyh
2026-03-16 12:02:28 +01:00
Björn Fromme 10e674cdd0 feat: improved logic to control field visibility
addresses #869btdphv
2026-03-16 12:02:28 +01:00
Björn Fromme 0bf78b0b81 fix: correctly handle discounts applied by dpn api 2026-03-16 12:02:28 +01:00
Björn Fromme c90b93556a feat: cli command to download travel xml data from buspro api 2026-03-16 12:02:28 +01:00
Björn Fromme f45718ea06 fix: correct body dimensions values 2026-03-16 12:02:28 +01:00
Björn Fromme 6d418ee8cc fix: account for discounts applied by bpn api in validation request 2026-03-16 12:02:28 +01:00
Björn Fromme 4851b1b72d feat: revert room price fetching for performance reasons 2026-03-16 12:02:28 +01:00
Björn Fromme dfb6f88be9 feat: trigger form refresh for dob when completely entered only 2026-03-16 12:02:28 +01:00
Björn Fromme f28227384d fix: fetch fresh room prices from api to avoid calculation mismatch 2026-03-16 12:02:28 +01:00
Björn Fromme cef9be92f3 fix: consider booking status O correctly 2026-03-16 12:02:28 +01:00
Björn Fromme f849d67a79 fix: correctly compare age range 2026-03-16 12:02:28 +01:00
Björn Fromme fba3becb06 feat: always load fresh api data when starting to edit booking 2026-03-16 12:02:28 +01:00
Björn Fromme a23ff6d119 chore: update project dependencies 2026-03-16 12:02:28 +01:00
Björn Fromme 384744c958 feat: xlsx export of booking edit draft data for admins 2026-03-16 12:02:28 +01:00
Björn Fromme 70c6617e88 feat: merge draft data with api response for selected fields 2026-03-16 12:02:28 +01:00
Björn Fromme 9afe3b334e fix: ensure nationality is assigned when editing booking data 2026-03-16 12:02:28 +01:00
Björn Fromme ad67d4c7ae chore: update project dependencies 2026-03-16 12:02:28 +01:00
Björn Fromme b7eaed3ac3 fix: populate booking number with edit drafts 2026-03-16 12:02:28 +01:00
Björn Fromme 136e2d68a2 feat: integrate with easy admin bundle 2026-03-16 12:02:27 +01:00
Björn Fromme bdcd54687d feat: streamlined booking number property 2026-03-16 12:02:27 +01:00
Björn Fromme 99190b0ef1 wip: integrate with easy admin bundle 2026-03-16 12:02:27 +01:00
Björn Fromme c7702b0c37 feat: cleanup favicons 2026-03-16 12:02:27 +01:00
Björn Fromme 9b88a2c14d feat: custom hx redirect class 2026-03-16 12:02:27 +01:00
Björn Fromme 6a945e6a08 feat: adjust xml dump reader command to new filename format 2026-03-16 12:02:27 +01:00
Björn Fromme 9c7cf0778f chore: update lts upgrade plan with current state of the project 2026-03-16 12:02:27 +01:00
Björn Fromme dd0f1a25d0 feat: always allow editing of participants for internal bookings
Prior to this commit the mutability flag from BusProNet was evaluated
and would potentially conflict with this rule. This flag is now
completely ignored for internal bookings.
2026-03-16 12:02:27 +01:00
Björn Fromme 7f4cf3060e fix: add suffix to request id in xml-dump filenames to avoid overwrites 2026-03-16 12:02:27 +01:00
Björn Fromme 30496a4875 feat: cleanup, log successful bookings 2026-03-16 12:02:27 +01:00
Björn Fromme 027508f495 chore: add draft cleanup command to schedule 2026-03-16 12:02:27 +01:00
Björn Fromme b5e2b2a2ad fix: use correct property path for travel date determination 2026-03-16 12:02:27 +01:00
Björn Fromme 9c9db05b86 feat: cli command to backfill travel dates on draft records, single use 2026-03-16 12:02:27 +01:00
Björn Fromme 1fa17a7df7 feat: cli command to clean up outdated or stale booking draft records 2026-03-16 12:02:27 +01:00
Björn Fromme e09e5858d8 fix: don't update booking session and draft on form refresh
Each form refresh would create a draft even for users that just explore
booking options causing stale draft records in the database.
2026-03-16 12:02:27 +01:00
Björn Fromme 6ede062a66 feat: streamlined display of hotel image, name and address 2026-03-16 12:02:27 +01:00
Björn Fromme b351b4042f chore: update project dependencies 2026-03-16 12:02:27 +01:00
Björn Fromme 95d0ce33d4 feat: new service category 'VEG' 2026-03-16 12:02:27 +01:00
Björn Fromme 75366167e8 chore: update httpclient config 2026-03-16 12:02:27 +01:00
Björn Fromme 7fa7e4be45 feat: command to read xml-dumps from bpn api by provided request id 2026-03-16 12:02:27 +01:00
Björn Fromme d14dafbade fix: include gender and nationality into group of mandatory fields 2026-03-16 12:02:27 +01:00
Björn Fromme e222f448bb feat: proper determination of agency initiated bookings
For booking that are agency initiated (groups) different rules apply
concerning mutability and requirement of personal data and whether the
first participant is the applicant or not. This commit adds logic to
evaluate the agency id assigned to the booking data to decide.
2026-03-16 12:02:27 +01:00
Björn Fromme f55ed3dc4c feat: log request ids to map xml dumps of bpn api communication 2026-03-16 12:02:27 +01:00
Björn Fromme fedfcc247e fix: update draft together with session on refresh 2026-03-16 12:02:27 +01:00
Björn Fromme 8186adfaeb fix: show actual error message 2026-03-16 12:02:27 +01:00
Björn Fromme 00304facba fix: allow null argument for gender mapping 2026-03-16 12:02:27 +01:00
Björn Fromme ff241f437f fix: insurance ids are strings 2026-03-16 12:02:27 +01:00
Björn Fromme 4a6b9cd64d fix: exclude pickup surcharge when self-organized outbound 2026-03-16 12:02:27 +01:00
Björn Fromme 8646dfbf02 fix: avoid float rounding errors when comparing 2026-03-16 12:02:27 +01:00
Björn Fromme d6f2681c61 feat: load hotel data locally for sidebar 2026-03-16 12:02:27 +01:00
Björn Fromme 5a47ca6053 feat: default status of new bookings to option during beta phase
addresses #869bpb7fg
2026-03-16 12:02:22 +01:00
Björn Fromme d7fd273475 fix: ensure rental insurance is selectable when insurance is available
addresses #869bp9ev5
2026-03-16 12:01:09 +01:00
Björn Fromme ce828a6ef5 fix: correctly distinguish between first participant and applicant 2026-03-16 12:01:09 +01:00
Björn Fromme 15dbd72f93 fix: don't include default date of birth in contact form submissions 2026-03-16 12:01:09 +01:00
Björn Fromme e3bdd8737f feat: update field label 2026-03-16 12:01:09 +01:00
Björn Fromme 7942656026 fix: redirect to dashboard as default when logged in 2026-03-16 12:01:09 +01:00
Björn Fromme 1fe8a2cb17 feat: load balancing of api requests, cleanup api client 2026-03-16 12:01:09 +01:00
Björn Fromme ab48b1f867 fix: properly handle parking service selection 2026-03-16 12:01:09 +01:00
Björn Fromme 3043842254 fix: add missing LoggerInterface dependency to BookingDataProcessorTest 2026-03-16 12:01:09 +01:00
Björn Fromme 249e326de4 feat: retry api requests when closed immediately due to overload 2026-03-16 12:01:09 +01:00
Björn Fromme b3cace3b43 fix: avoid null pointer exceptions, log warning about removed services 2026-03-16 12:01:09 +01:00
Björn Fromme ad578179d8 fix: avoid scrolling to the bottom when making a selection
closes #869bnn1bw
2026-03-16 12:01:09 +01:00
Björn Fromme c57351f8b5 chore: update scheduler config 2026-03-16 12:01:09 +01:00
Björn Fromme c5934e4c5b chore: reduce logger noise 2026-03-16 12:01:09 +01:00
Björn Fromme 06e64bd3b8 fix: only assign dummy data to the applicant 2026-03-16 12:01:09 +01:00
Björn Fromme 48572812a9 fix: assign dummy values to missing applicant data fields
This fix avoids rejection of API requests due to missing data of the
applicant. The current user most probably is not aware about this so
they get confused about the error messages otherwise.
2026-03-16 12:01:09 +01:00
Björn Fromme 46b610370a feat: draft inspection cli command 2026-03-16 12:01:09 +01:00
Björn Fromme 96d4b8ed45 fix: apply correct return type and response handling 2026-03-16 12:01:09 +01:00
Björn Fromme c18ba3d815 fix: only invalidate cache and remove draft on successful edit 2026-03-16 12:01:09 +01:00
Björn Fromme fd81079247 chore: code cleanup 2026-03-16 12:01:09 +01:00
Björn Fromme e5781fbabc fix: invalidate booking data caches after updating personal data 2026-03-16 12:01:09 +01:00
Björn Fromme 8887b06583 fix: streamline price label for transportation services 2026-03-16 12:01:09 +01:00
Björn Fromme 9955ff7df9 feat: link terms in confirmation checkbox label 2026-03-16 12:01:09 +01:00
Björn Fromme db74b6049c feat: remove cancel confirmation since obsolete because of drafts 2026-03-16 12:01:09 +01:00
Björn Fromme 0b5c7af4be feat: automatic saving of drafts when editing bookings 2026-03-16 12:01:09 +01:00
Björn Fromme 721016a00e fix: adopt general styles to error page template 2026-03-16 12:01:09 +01:00
Björn Fromme 563522d261 chore: update deployer config 2026-03-16 12:01:09 +01:00
Björn Fromme 04f4455491 chore: update project dependencies 2026-03-16 12:01:09 +01:00
Björn Fromme b976ce480a fix: restore .user.ini from master 2026-03-16 12:01:09 +01:00
Björn Fromme 6d5f7cfd22 chore: update upgrade plan with current state of the project 2026-03-16 12:01:09 +01:00
Björn Fromme 9baed0987e chore: update project dependencies 2026-03-16 12:01:09 +01:00
Björn Fromme b76d17d35c feat: add env variable for website base url 2026-03-16 12:01:09 +01:00
Björn Fromme 4e182612e8 chore: complete scheduler config for email notifications 2026-03-16 12:01:09 +01:00
Björn Fromme 645729a518 feat: remove outdated log entries scheduled 2026-03-16 12:01:09 +01:00
Björn Fromme 9ee4c1cd5c fix: fail gracefully when remote XML data cannot be read during sync 2026-03-16 12:01:09 +01:00
Björn Fromme 02742aef5b fix: catch travel data not found errors to show proper flash message 2026-03-16 12:01:09 +01:00
Björn Fromme 87af2c3855 chore: update project dependencies 2026-03-16 12:01:09 +01:00
Björn Fromme ea1ce4a029 docs: add inline documentation where missing 2026-03-16 12:01:09 +01:00
Björn Fromme 2fe9185a6f feat: cron controlled cli command to sync xml data with remote 2026-03-16 12:00:56 +01:00
Björn Fromme ef191c55be chore: cleanup flysystem config 2026-03-16 12:00:56 +01:00
Björn Fromme abd74a127a chore: update json test-data for pickups planning 2026-03-16 12:00:56 +01:00
Björn Fromme 52ac269b8d fix: avoid duplicated pickup planning entries 2026-03-16 12:00:56 +01:00
Björn Fromme 643f65ce3b chore: reduce noise in logs 2026-03-16 12:00:56 +01:00
Björn Fromme 465ce3e69a feat: add logging to api endpoint 2026-03-16 12:00:56 +01:00
Björn Fromme 207b648f36 fix: don't show bulk insurance labels in summary 2026-03-16 12:00:56 +01:00
Björn Fromme 7f2d52a5ce feat: accept multiple travel codes per pickup planning 2026-03-16 12:00:56 +01:00
Björn Fromme f1eaa95c44 chore: update project dependencies 2026-03-16 12:00:56 +01:00
Björn Fromme e203de172d chore: rotate auth log 2026-03-16 12:00:56 +01:00
Björn Fromme 79b7e2aaa5 feat: forcibly invalidate availabilities cache on booking start 2026-03-16 12:00:56 +01:00
Björn Fromme 3c2ade9299 feat: loading indicator on initial page load 2026-03-16 12:00:56 +01:00
Björn Fromme f3f2dc6cec fix: adopt changes in test 2026-03-16 12:00:56 +01:00
Björn Fromme 12b69bd681 feat: load availability data once per booking session 2026-03-16 12:00:56 +01:00
Björn Fromme 8f542ff448 chore: disable saving cookies for api requests 2026-03-16 12:00:56 +01:00
Björn Fromme 80c81c11fb feat: log pickups planning data api calls 2026-03-16 12:00:56 +01:00
Björn Fromme e3809bd930 chore: update project dependencies 2026-03-16 12:00:56 +01:00
Björn Fromme d755e29459 chore: reduce logger noise 2026-03-16 12:00:56 +01:00
Björn Fromme 105eb5a9cd chore: retain xml dumps for three days to save on webspace 2026-03-16 12:00:56 +01:00
Björn Fromme 65f8436aa7 feat: extended oauth2 user info and refactored authenticator 2026-03-16 12:00:56 +01:00
Björn Fromme 4afdd79252 fix: ensure template variable exists 2026-03-16 12:00:56 +01:00
Björn Fromme d1e807b11f feat: adjust oauth2 implementation for TYPO3 backend login 2026-03-16 12:00:56 +01:00
Björn Fromme ee84690cd9 feat: basic themes for event sites 2026-03-16 12:00:56 +01:00
Björn Fromme c7a27f1dc7 feat: api endpoints for pickups planning 2026-03-16 12:00:56 +01:00
Björn Fromme 1fd9f8d1f8 feat: always show all available ski passes but readonly if age doesn't match 2026-03-16 12:00:56 +01:00
Björn Fromme b57d849ecd feat: update labels of voucher fields
addresses #869bf8tzv
2026-03-16 12:00:56 +01:00
Björn Fromme 654ae4dc0b feat: use query parameters for booking urls 2026-03-16 12:00:56 +01:00
Björn Fromme 3984a623bf fix: properly assign readonly state to form fields for unavailable services 2026-03-16 12:00:56 +01:00
Björn Fromme 96619c6cec fix: reset room assignments after updated selection if required 2026-03-16 12:00:56 +01:00
Björn Fromme 3dd92ccdb4 feat: consistent display of included services and prices 2026-03-16 12:00:56 +01:00
Björn Fromme b111a615a9 feat: show unavailable transportation services as readonly 2026-03-16 12:00:56 +01:00
Björn Fromme 2372958713 fix: don't show incorrect notification about updated rentals 2026-03-16 12:00:56 +01:00
Björn Fromme 82a8541af1 feat: show inquiry status with rooms in step 1 2026-03-16 12:00:56 +01:00
Björn Fromme ea162972fa feat: hide parking from participants under 18 2026-03-16 12:00:55 +01:00
Björn Fromme 094d6858d1 fix: don't auto assign discounted transport to babies 2026-03-16 12:00:55 +01:00
Björn Fromme 65398d59d4 chore: simplify parameter handling 2026-03-16 12:00:55 +01:00
Björn Fromme 3df9659ce2 feat: configurable choices for body dimensions
closes #8697phk21
2026-03-16 12:00:55 +01:00
Björn Fromme c4f4f53fd6 chore: update deployer config for prod 2026-03-16 12:00:55 +01:00
Björn Fromme b567b6a840 feat: re-implement contact form submissions api endpoint for website 2026-03-16 12:00:55 +01:00
Björn Fromme ab18e5f134 feat: adjust participant number size depending on value 2026-03-16 12:00:55 +01:00
Björn Fromme 929115c02b feat: update deployer config to build assets upfront 2026-03-16 12:00:55 +01:00
Björn Fromme e26884c099 feat: align rendering of pickups field with other services 2026-03-16 12:00:55 +01:00
Björn Fromme 077bcdcaf5 fix: avoid loading indicator issues when using browser history for navigation 2026-03-16 12:00:55 +01:00
Björn Fromme 685ac5a94a chore: update project dependencies 2026-03-16 12:00:55 +01:00
Björn Fromme 3d1b75b591 fix: ensure flash message is displayed after redirect 2026-03-16 12:00:55 +01:00
Björn Fromme e1bfe9b93c feat: show room prices in room assignment form field 2026-03-16 12:00:55 +01:00
Björn Fromme 5b75a165ce fix: account for htmx issues in mobile safari with select fields 2026-03-16 12:00:55 +01:00
Björn Fromme e12fbc85d4 fix: disable autocomplete in chrome for good 2026-03-16 12:00:55 +01:00
Björn Fromme 6bbef0a975 feat: various improvements in styles and layout 2026-03-16 12:00:55 +01:00
Björn Fromme bc175ca438 fix: avoid stale caches 2026-03-16 12:00:55 +01:00
Björn Fromme ef15772b97 feat: streamlined rendering of fields as static text in forms 2026-03-16 12:00:55 +01:00
Björn Fromme da5b913757 feat: render room assignment as radio buttons 2026-03-16 12:00:55 +01:00
Björn Fromme 6b5a51f652 feat: replace overly complex and unnecessary form choice loader for rooms 2026-03-16 12:00:55 +01:00
Björn Fromme af2620c8b3 fix: ensure footer bar is visible on mobile safari 2026-03-16 12:00:55 +01:00
Björn Fromme 15fdfdc42e feat: load cms data early to display image on login page 2026-03-16 12:00:55 +01:00
Björn Fromme ce88e1f97b feat: improved layout for participant form 2026-03-16 12:00:55 +01:00
Björn Fromme a67e3a5eac fix: disable autocompletion on personal data fields 2026-03-16 12:00:55 +01:00
Björn Fromme cc747f0690 feat: body dimensions optional 2026-03-16 12:00:55 +01:00
Björn Fromme a6d2661562 feat: improved error handling and redirect on invalid session 2026-03-16 12:00:55 +01:00
Björn Fromme 4b95b12a7b feat: indicate incomplete participant data in cards 2026-03-16 12:00:55 +01:00
Björn Fromme cca8554e3d feat: special treatment of services for participants of age 0-2 2026-03-16 12:00:55 +01:00
Björn Fromme 28c426ca3c feat: increase availability cache ttl and ensure fresh data when entering form 2026-03-16 12:00:55 +01:00
Björn Fromme be83a4295a docs: upgrade plan to symfony 7.4 2026-03-16 12:00:55 +01:00
Björn Fromme 87439ee509 feat: optional return url 2026-03-16 12:00:41 +01:00
Björn Fromme 36ef54d541 chore: cleanup 2026-03-16 11:59:12 +01:00
Björn Fromme 400407358d fix: remove obsolete htmx attributes from forms 2026-03-16 11:59:12 +01:00
Björn Fromme 502b121e43 chore: cleanup 2026-03-16 11:59:12 +01:00
Björn Fromme 61447ced4f fix: enforce https 2026-03-16 11:59:12 +01:00
Björn Fromme 1e107c68b4 feat: implement hx-boost for reliable loading indication 2026-03-16 11:59:12 +01:00
Björn Fromme 602fb31f27 fix: ensure loading indicator is triggered 2026-03-16 11:59:12 +01:00
Björn Fromme 2a8531a025 chore: update project dependencies 2026-03-16 11:59:12 +01:00
Björn Fromme 980589e190 fix: remove form options cache causing issues 2026-03-16 11:59:12 +01:00
Björn Fromme 4a2d1f4a02 feat: implement screendesign 2026-03-16 11:59:12 +01:00
Björn Fromme 39e6cc4d68 chore: update project dependencies 2026-03-16 11:59:12 +01:00
Björn Fromme e5018432cb feat: adjust loading indicator styles 2026-03-16 11:59:12 +01:00
Björn Fromme dbf0b03bac fix: add loading indicator to all 'back' buttons 2026-03-16 11:59:12 +01:00
Björn Fromme 01060035bc fix: consider mode in summary 2026-03-16 11:59:12 +01:00
Björn Fromme fa0cf5a654 fix: correctly handle email uniqueness by excluding the applicant from validation 2026-03-16 11:59:12 +01:00
Björn Fromme 4f1a1cad8e feat: request replay command for bpn api 2026-03-16 11:59:12 +01:00
Björn Fromme 8c8aae9a1e feat: refactoring and cleanup 2026-03-16 11:59:12 +01:00
Björn Fromme 230c53875f feat: finalize voucher handling and discount display in summary and overview 2026-03-16 11:59:12 +01:00
Björn Fromme 2e40cbc7c7 feat: special treatment of participants with age 0-2 (babies) 2026-03-16 11:59:12 +01:00
Björn Fromme cd1ffc3e9a fix: don't disable room selection field with single option 2026-03-16 11:59:12 +01:00
Björn Fromme 4db2cd7eda fix: clear target path when canceling booking flow 2026-03-16 11:59:12 +01:00
Björn Fromme f230b36382 feat: conditionally render room assignment field in participant edit form 2026-03-16 11:59:12 +01:00
Björn Fromme b872f2a5db feat: prevent selection of baby rooms without regular rooms 2026-03-16 11:59:11 +01:00
Björn Fromme c6678d16a6 feat: step input for room type selection 2026-03-16 11:59:11 +01:00
Björn Fromme b73a02048e fix: correctly determine number of participants 2026-03-16 11:59:11 +01:00
Björn Fromme 1f2f2751e4 feat: correct determination of inquiry status and conditional voucher field display 2026-03-16 11:59:11 +01:00
Björn Fromme 85998534fe feat: correct handling of vouchers 2026-03-16 11:59:11 +01:00
Björn Fromme 8e7b8bd75f feat: layout improvements 2026-03-16 11:59:11 +01:00
Björn Fromme fb983f23dd feat: improved promotional and purchase vouchers 2026-03-16 11:59:11 +01:00
Björn Fromme 7df99521c4 feat: promotional and purchase vouchers 2026-03-16 11:59:11 +01:00
Björn Fromme a8c0a1aa61 feat: fetch additional content from cms via api 2026-03-16 11:59:11 +01:00
Björn Fromme fc05350ae4 feat: sort pickups by their times 2026-03-16 11:59:11 +01:00
Björn Fromme ba7de8fa01 fix: never validate insurance selection in edit mode 2026-03-16 11:59:11 +01:00
Björn Fromme 778cf80e6b fix: don't validate insurance selection of participants when in bulk assignment 2026-03-16 11:59:11 +01:00
Björn Fromme f01bb7d271 chore: update project dependencies 2026-03-16 11:59:11 +01:00
Björn Fromme 6a031e5a71 feat: loading indicators for regular get requests 2026-03-16 11:59:11 +01:00
Björn Fromme 37924841e1 feat: improved timeout handling for api client 2026-03-16 11:59:11 +01:00
Björn Fromme be90248fc7 feat: remove 'remember me' functionality from login form in booking process 2026-03-16 11:59:11 +01:00
Björn Fromme cb38beb32c feat: surcharges and discounts per participant and in summary 2026-03-16 11:59:11 +01:00
Björn Fromme cc8500d0f4 fix: don't rely on individual prices being available for all participants 2026-03-16 11:59:11 +01:00
Björn Fromme 61d4e36f1f feat: ensure inquiry info is always visible 2026-03-16 11:59:11 +01:00
Björn Fromme 5c5f164aa2 feat: improved dynamic validation 2026-03-16 11:59:11 +01:00
Björn Fromme 5275e6c732 fix: ensure validation of participant data 2026-03-16 11:59:11 +01:00
Björn Fromme f3ea6734a1 fix: keep browser history intact when navigating between cards view and participant form 2026-03-16 11:59:11 +01:00
Björn Fromme bb20176c76 wip: integrate with typo3 to fetch product and hotel data 2026-03-16 11:59:11 +01:00
Björn Fromme beee44a10e fix: streamlined single room selection handling 2026-03-16 11:59:11 +01:00
Björn Fromme 43823dbda1 feat: improved mutability checks for personal data in edit or create mode 2026-03-16 11:59:11 +01:00
Björn Fromme ff39bf365c feat: improved handling of fields to be rendered as static text 2026-03-16 11:59:11 +01:00
Björn Fromme 5d69e4a8aa feat: gravatar integration 2026-03-16 11:59:11 +01:00
Björn Fromme 142db19627 feat: integrate with scheduler bundle 2026-03-16 11:59:11 +01:00
Björn Fromme 7b84ecbb56 fix: adapt changes in create mode for edit mode, cleanup 2026-03-16 11:59:11 +01:00
Björn Fromme dc6de1734a feat: authenticated booking 2026-03-16 11:59:11 +01:00
Björn Fromme 1e464cef0a feat: performance improvements 2026-03-16 11:59:11 +01:00
Björn Fromme 4decaa6789 chore: fix deprecations in preparation uf upgrading to symfony 7.3 2026-03-16 11:59:11 +01:00
Björn Fromme a057088808 fix: incorrect and unnecessary template inheritance 2026-03-16 11:59:11 +01:00
Björn Fromme e46053a7b7 chore: consolidate documentation 2026-03-16 11:59:11 +01:00
Björn Fromme 91d9e82d84 feat: price info tooltip for bulk insurance booking
addresses #869axbjzz
2026-03-16 11:59:11 +01:00
Björn Fromme 608f5ed3e9 feat: rearrange field order
addresses #869axbhz3
2026-03-16 11:59:11 +01:00
Björn Fromme 9b2e209b4f feat: group rentals and rental insurance fields visually
addresses #869ay16cp
2026-03-16 11:59:11 +01:00
Björn Fromme bae1582631 feat: dedicated section for discounts in summary
addresses #869ay1724
2026-03-16 11:59:11 +01:00
Björn Fromme c3fe76d78c feat: automatic unselection of discounted transportation 2026-03-16 11:59:11 +01:00
Björn Fromme 8abab0e379 fix: improved position of info icon 2026-03-16 11:59:11 +01:00
Björn Fromme d31204188b fix: adopt wrapper dto to dynamic form field 2026-03-16 11:59:11 +01:00
Björn Fromme a74f34b559 feat: display service descriptions as tooltip with info icon
addresses #869axbnj0
2026-03-16 11:59:11 +01:00
Björn Fromme 37cda348b0 feat: remove room selection field entirely for single room type
addresses #869axcukn
2026-03-16 11:59:11 +01:00
Björn Fromme 38656e73c5 chore: cleanup, update documentation 2026-03-16 11:59:11 +01:00
Björn Fromme 03ac430be4 fix: validation error indication on cards 2026-03-16 11:59:11 +01:00
Björn Fromme 89979d6ce4 wip: email uniqueness validation 2026-03-16 11:59:11 +01:00
Björn Fromme 54a3145710 wip: improved validation and feedback 2026-03-16 11:59:11 +01:00
Björn Fromme 7aea149b6c feat: unique email addresses of participants unless child, cleanup
addresses #869axbn21
2026-03-16 11:59:11 +01:00
Björn Fromme f50aa55e8b feat: additional conformation checkbox for terms and conditions
addresses #869axbm44
2026-03-16 11:59:11 +01:00
Björn Fromme 6c0d7c30c6 feat: improved layout for pickup selection to make price visible
addresses #869axbjmd
2026-03-16 11:59:11 +01:00
Björn Fromme af163d597e feat: prefer discounted transportation services
addresses #869axbjbz
2026-03-16 11:59:11 +01:00
Björn Fromme d0c8302d21 feat: improved form field layout for date of birth 2026-03-16 11:59:11 +01:00
Björn Fromme 44e2d76525 feat: show placeholders for individual date parts in date of birth field 2026-03-16 11:59:11 +01:00
Björn Fromme 8f274bbb44 feat: replace date field for participant's birthday 2026-03-16 11:59:11 +01:00
Björn Fromme 8436124cbc wip: implement e2e tests with cypress 2026-03-16 11:59:11 +01:00
Björn Fromme 647fa8e212 feat: unassign rooms from other participants when unavailable 2026-03-16 11:59:11 +01:00
Björn Fromme 6cc5886073 feat: automatically assign rooms only for unique room type selection 2026-03-16 11:59:11 +01:00
Björn Fromme 513c889926 chore: update project dependencies 2026-03-16 11:59:11 +01:00
Björn Fromme 9c6f4d59b3 chore: cleanup, updated docs 2026-03-16 11:59:11 +01:00
Björn Fromme a0d5768752 feat: consolidated insurance service 2026-03-16 11:59:11 +01:00
Björn Fromme 4f951cdf8a feat: integrate with spatie/ray for debugging and performance optimization 2026-03-16 11:59:11 +01:00
Björn Fromme 619e2ba1ee feat: extended pricing breakdown on confirmation page 2026-03-16 11:59:11 +01:00
Björn Fromme 7d6a80eefa fix: fix floating point precision error 2026-03-16 11:59:11 +01:00
Björn Fromme 2403f8fb29 chore: update documentation 2026-03-16 11:59:11 +01:00
Björn Fromme b485112ed3 chore: adjust and cleanup tests 2026-03-16 11:59:11 +01:00
Björn Fromme 1f5c835f8a wip: bulk insurance refactoring 2026-03-16 11:59:11 +01:00
Björn Fromme a3d7ee63d3 wip: bulk insurance booking fix 2026-03-16 11:59:11 +01:00
Björn Fromme a8cf67728b wip: finalize implementation 2026-03-16 11:59:11 +01:00
Björn Fromme c830fc7841 wip: finalize implementation 2026-03-16 11:59:11 +01:00
Björn Fromme 5ef3bb9cbf wip: finalize implementation 2026-03-16 11:59:11 +01:00
Björn Fromme b882175f36 feat: readonly room selection for single room types 2026-03-16 11:59:11 +01:00
Björn Fromme d20215929d feat: display booked insurance in edit mode 2026-03-16 11:59:11 +01:00
Björn Fromme ea312b9986 chore: remove debug statements 2026-03-16 11:59:11 +01:00
Björn Fromme 0559341f31 fix: show feedback modal 2026-03-16 11:59:10 +01:00
Björn Fromme 1f4dc2d4a2 fix: adopt changed template name 2026-03-16 11:59:10 +01:00
Björn Fromme 14ca0f5c59 fix: adjust deployer config 2026-03-16 11:59:10 +01:00
Björn Fromme e51c4843c5 feat: refactor to cards 2026-03-16 11:59:10 +01:00
Björn Fromme 32a9fac9ed fix: ensure skipass is selected 2026-03-16 11:59:10 +01:00
Björn Fromme de8cbf6178 wip: refactor to cards with individual participant forms 2026-03-16 11:59:10 +01:00
Björn Fromme 33e1aea80c wip: add documentation for plan 2026-03-16 11:59:10 +01:00
Björn Fromme 83589ee677 feat: htmx powered requests, improved loading indicator
feat: loading indicator and htmx form submit
2026-03-16 11:59:10 +01:00
Björn Fromme 023ecdebc9 feat: inquiry bookings 2026-03-16 11:59:10 +01:00
Björn Fromme 2d9cb2c0b9 chore: remove outdated documentation 2026-03-16 11:59:10 +01:00
Björn Fromme 5c0814ef9b wip: modernized edit flow, fix insurance tier calculation 2026-03-16 11:59:10 +01:00
Björn Fromme 28831a3b06 wip: modernized edit flow 2026-03-16 11:59:10 +01:00
Björn Fromme 0d073a36a3 wip: insurance booking in edit flow 2026-03-16 11:59:10 +01:00
Björn Fromme 069600d602 fix: set correct default agency 2026-03-16 11:59:10 +01:00
Björn Fromme d70a27f2fd wip: backport booking create flow form handling to edit flow 2026-03-16 11:59:10 +01:00
Björn Fromme e330626b03 feat: unify pickup selection 2026-03-16 11:59:10 +01:00
Björn Fromme 0f4b16c194 feat: comprehensive booking overview for confirmation 2026-03-16 11:59:10 +01:00
Björn Fromme c89bda86b7 fix: use correct country tokens 2026-03-16 11:59:10 +01:00
Björn Fromme 56fa5355fd chore: update project dependencies 2026-03-16 11:59:10 +01:00
Björn Fromme 7ea52670b9 wip: submit booking to api 2026-03-16 11:59:10 +01:00
Björn Fromme ee264e88d4 wip: confirmation step 2026-03-16 11:59:10 +01:00
Björn Fromme 3f7db4e772 feat: implement payment step 2026-03-16 11:59:10 +01:00
Björn Fromme 3d9fc18a83 fix: don't submit data of removed fields 2026-03-16 11:59:10 +01:00
Björn Fromme 9eeed7f992 wip: backport form handing system from create flow to edit flow 2026-03-16 11:59:10 +01:00
Björn Fromme ba0a86cbea fix: ignore past travels in list view when patching data 2026-03-16 11:59:10 +01:00
Björn Fromme 41d8d65d82 feat: inform user about automatic reassignments or reset selections 2026-03-16 11:59:10 +01:00
Björn Fromme 57843b8a6f feat: insurance info urls in tooltips 2026-03-16 11:59:10 +01:00
Björn Fromme d6258d0ca1 feat: customizable label for unavailable services 2026-03-16 11:59:10 +01:00
Björn Fromme 66ccebb02b feat: make room selection fields read-only for single room type 2026-03-16 11:59:10 +01:00
Björn Fromme e3081e56f8 feat: extended insurance parsing, pass info urls to view 2026-03-16 11:59:10 +01:00
Björn Fromme 201b223813 fix: filter rentals by skipass duration 2026-03-16 11:59:10 +01:00
Björn Fromme 08d534e39b feat: auto-assign rooms 2026-03-16 11:59:10 +01:00
Björn Fromme 4489169553 wip: improved insurance selection 2026-03-16 11:59:10 +01:00
Björn Fromme 16c239716b wip: check eligibility based on ski pass availability 2026-03-16 11:59:10 +01:00
Björn Fromme f5913eb947 chore: update docs 2026-03-16 11:59:10 +01:00
Björn Fromme f2681af9ee feat: bulk insurance booking by applicant 2026-03-16 11:59:10 +01:00
Björn Fromme 66dd51d75a feat: improved form layout 2026-03-16 11:59:10 +01:00
Björn Fromme 5f78361533 chore: remove debugging statements 2026-03-16 11:59:10 +01:00
Björn Fromme 3c1192298b feat: show room pricing details 2026-03-16 11:59:10 +01:00
Björn Fromme 0bd9d79bbe fix: layout improvements 2026-03-16 11:59:10 +01:00
Björn Fromme a2e055f313 fix: consider participant's age at travel date 2026-03-16 11:59:10 +01:00
Björn Fromme ca1d5c4303 fix: ensure mandatory services are selected 2026-03-16 11:59:10 +01:00
Björn Fromme e6eebc00a3 wip: insurance booking 2026-03-16 11:59:10 +01:00
Björn Fromme 29bdf794f3 wip: insurance booking 2026-03-16 11:59:10 +01:00
Björn Fromme 4ba81b8f03 wip: insurance booking 2026-03-16 11:59:10 +01:00
Björn Fromme 8af7f0e797 wip: insurance booking phase 5 2026-03-16 11:59:10 +01:00
Björn Fromme c67fa18ad3 wip: insurance booking phase 4 2026-03-16 11:59:10 +01:00
Björn Fromme 6c9da6537e wip: insurance booking phase 3 2026-03-16 11:59:10 +01:00
Björn Fromme 241785b428 wip: insurance booking phases 1 and 2 2026-03-16 11:59:10 +01:00
Björn Fromme 411166ffba feat: correct calculation and display of individual pricing 2026-03-16 11:59:10 +01:00
Björn Fromme 203c9ebbca chore: update project dependencies 2026-03-16 11:59:10 +01:00
Björn Fromme ede37d5d0f feat: improved error handling in controllers, cleanup 2026-03-16 11:59:10 +01:00
Björn Fromme 4f02529b15 feat: improved error handling of xml parsers and loaders 2026-03-16 11:59:10 +01:00
Björn Fromme 0f6b73340e feat: parser and loader for insurance data 2026-03-16 11:59:10 +01:00
Björn Fromme 96c53cc173 feat: functionality to determine family status of a booking 2026-03-16 11:59:10 +01:00
Björn Fromme 7ce3bc18b2 feat: prevent booking flow without available rooms 2026-03-16 11:59:10 +01:00
Björn Fromme 82b47e314b feat: validate room selection 2026-03-16 11:59:10 +01:00
Björn Fromme 9d2474c1e3 feat: render tooltips 2026-03-16 11:59:10 +01:00
Björn Fromme 787f69fc46 feat: streamlined tooltip data attributes 2026-03-16 11:59:10 +01:00
Björn Fromme 054d4e52b2 chore: update project dependencies 2026-03-16 11:59:10 +01:00
Björn Fromme 0d1ef6d40e feat: mark unavailable services as read-only and add tooltip 2026-03-16 11:59:10 +01:00
Björn Fromme ead448b8d4 feat: simplify validation 2026-03-16 11:59:10 +01:00
Björn Fromme 7ff10e6792 feat: simplify handling of ski pass service 2026-03-16 11:59:10 +01:00
Björn Fromme 3d6c94e7c5 feat: cached api results for availabilities 2026-03-16 11:59:10 +01:00
Björn Fromme 7673e64738 chore: streamline property naming 2026-03-16 11:59:10 +01:00
Björn Fromme 4230c53812 feat: enrich travel data with live availabilities 2026-03-16 11:59:10 +01:00
Björn Fromme 3198e03cc4 feat: replace xss extension with symfony component 2026-03-16 11:59:10 +01:00
Björn Fromme 1e48e107fc wip: skipass-duration based rentals filtering 2026-03-16 11:59:10 +01:00
Björn Fromme ed7c889c4f wip: transportation services with discount 2026-03-16 11:59:10 +01:00
Björn Fromme 84f4481ef0 wip: service descriptions and car license plate field 2026-03-16 11:59:10 +01:00
Björn Fromme b84997d058 wip: rentals insurance field 2026-03-16 11:59:10 +01:00
Björn Fromme 3063a7c05f wip: improved refresh logic 2026-03-16 11:59:10 +01:00
Björn Fromme 36fe4c9e9a wip: transportation services in summary 2026-03-16 11:59:10 +01:00
Björn Fromme 5c5134b69f wip: update documentation 2026-03-16 11:59:10 +01:00
Björn Fromme e7fb764158 wip: dynamic availability of services 2026-03-16 11:59:10 +01:00
Björn Fromme fe624cfd1c wip: implement transportation, pickups and parking 2026-03-16 11:59:10 +01:00
Björn Fromme 81b8237570 wip: transportation services 2026-03-16 11:59:10 +01:00
Björn Fromme a019c7dae0 wip: prepare transportation services 2026-03-16 11:59:10 +01:00
Björn Fromme 552dd029fa wip: update docs 2026-03-16 11:59:10 +01:00
Björn Fromme bd5c6359fe wip: show pricing 2026-03-16 11:59:10 +01:00
Björn Fromme 6bd483d768 wip: dynamic services fields 2026-03-16 11:59:09 +01:00
Björn Fromme 7003c0d81b wip: age based filtering of options 2026-03-16 11:59:09 +01:00
Björn Fromme b038d9a41f wip: age based filtering of options 2026-03-16 11:59:09 +01:00
Björn Fromme 89c42cf7e4 wip: age based filtering of options 2026-03-16 11:59:09 +01:00
Björn Fromme cd1e5ad3ad chore: update project dependencies 2026-03-16 11:59:09 +01:00
Björn Fromme f36c761c28 wip: conditional mandatory body dimensions 2026-03-16 11:59:09 +01:00
Björn Fromme 0f7d95d31b wip: additional services with constraints 2026-03-16 11:59:09 +01:00
Björn Fromme 4b92f56ed7 wip: courses 2026-03-16 11:59:09 +01:00
Björn Fromme b54fb07e84 wip: booking process 2026-03-16 11:59:09 +01:00
Björn Fromme 11825191cf wip: major refactoring 2026-03-16 11:59:09 +01:00
Björn Fromme d719b17aec wip: form refactoring 2026-03-16 11:59:09 +01:00
Björn Fromme 65a33922cf wip: improved booking summary 2026-03-16 11:59:09 +01:00
Björn Fromme 727ee9b014 wip: refactor 2026-03-16 11:59:09 +01:00
Björn Fromme 4d51f0334f wip: booking summary for step 1 2026-03-16 11:59:09 +01:00
Björn Fromme 86e4866d6a wip: refactor 2026-03-16 11:59:09 +01:00
Björn Fromme e75276ed88 wip: refactor 2026-03-16 11:59:09 +01:00
Björn Fromme bfdf4c0453 fix: correct handling of readonly checkboxes with tooltips 2026-03-16 11:59:09 +01:00
Björn Fromme f90902c5e3 chore: update browserslist 2026-03-16 11:59:09 +01:00
Björn Fromme d0d6844fbd wip: field states and dependencies 2026-03-16 11:59:09 +01:00
Björn Fromme cd7a724e62 wip: refactor forms 2026-03-16 11:59:09 +01:00
Björn Fromme 1f5877460b wip: refactor forms 2026-03-16 11:59:09 +01:00
Björn Fromme 8da77ee13b wip: collapsible forms 2026-03-16 11:59:09 +01:00
Björn Fromme d205cd09ef wip: refactor forms 2026-03-16 11:59:09 +01:00
Björn Fromme b44d8505b2 wip: feedback about booked and assigned rooms 2026-03-16 11:59:09 +01:00
Björn Fromme 9d99fe9272 wip: refactoring 2026-03-16 11:59:09 +01:00
Björn Fromme 431839d36d wip: refactoring 2026-03-16 11:59:09 +01:00
Björn Fromme cce1f688b9 wip: refactoring 2026-03-16 11:59:09 +01:00
1017 changed files with 159052 additions and 14811 deletions
-9
View File
@@ -1,9 +0,0 @@
{
"permissions": {
"allow": [
"Bash(php -l:*)",
"Bash(php:*)"
],
"deny": []
}
}
+71 -43
View File
@@ -1,45 +1,62 @@
name: myep-next
name: myep
type: php
docroot: public
php_version: "8.2"
php_version: "8.4"
webserver_type: apache-fpm
xdebug_enabled: false
additional_hostnames: []
additional_fqdns: []
additional_hostnames:
- mysnz
- mysbw
- myser
additional_fqdns: [ ]
database:
type: mariadb
version: "10.11"
type: mariadb
version: "11.8"
webimage_extra_packages: [ ripgrep, bubblewrap, socat ]
use_dns_when_possible: true
timezone: Europe/Berlin
composer_version: "2"
web_environment: []
web_environment: [ ]
nodejs_version: "22"
corepack_enable: false
# Key features of DDEV's config.yaml:
# name: <projectname> # Name of the project, automatically provides
# http://projectname.ddev.site and https://projectname.ddev.site
# If the name is omitted, the project will take the name of the enclosing directory,
# which is useful if you want to have a copy of the project side by side with this one.
# type: <projecttype> # backdrop, craftcms, django4, drupal, drupal6, drupal7, laravel, magento, magento2, php, python, shopware6, silverstripe, typo3, wordpress
# See https://ddev.readthedocs.io/en/stable/users/quickstart/ for more
# type: <projecttype> # asterios, backdrop, cakephp, codeigniter, craftcms, drupal, drupal6, drupal7, drupal8, drupal9, drupal10, drupal11, drupal12, generic, joomla, laravel, magento, magento2, maho, modx, php, shopware6, silverstripe, symfony, typo3, wordpress, wp-bedrock
# See https://docs.ddev.com/en/stable/users/quickstart/ for more
# information on the different project types
# "drupal" covers recent Drupal 8+
# docroot: <relative_path> # Relative path to the directory containing index.php.
# php_version: "8.2" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2", "8.3", "8.4"
# php_version: "8.4" # PHP version to use, "5.6" through "8.5"
# You can explicitly specify the webimage but this
# is not recommended, as the images are often closely tied to DDEV's' behavior,
# is not recommended, as the images are often closely tied to DDEV's behavior,
# so this can break upgrades.
# webimage: <docker_image> # nginx/php docker image.
# webimage: <docker_image>
# Its unusual to change this option, and we dont recommend it without Docker experience and a good reason.
# Typically, this means additions to the existing web image using a .ddev/web-build/Dockerfile.*
# database:
# type: <dbtype> # mysql, mariadb, postgres
# version: <version> # database version, like "10.11" or "8.0"
# MariaDB versions can be 5.5-10.8, 10.11, and 11.4.
# MySQL versions can be 5.5-8.0.
# PostgreSQL versions can be 9-17.
# MariaDB versions can be 5.5-10.8, 10.11, 11.4, 11.8, 12.3
# MySQL versions can be 5.5-8.0, 8.4, 9.7
# PostgreSQL versions can be 9-18
# You can explicitly specify the dbimage but this
# is not recommended, as the images are often closely tied to DDEV's behavior,
# so this can break upgrades.
# dbimage: <docker_image>
# Its unusual to change this option, and we dont recommend it without Docker experience and a good reason.
# Typically, this means additions to the existing db image using a .ddev/db-build/Dockerfile.*
# router_http_port: <port> # Port to be used for http (defaults to global configuration, usually 80)
# router_https_port: <port> # Port for https (defaults to global configuration, usually 443)
@@ -49,12 +66,20 @@ corepack_enable: false
# "ddev xdebug" to enable Xdebug and "ddev xdebug off" to disable it work better,
# as leaving Xdebug enabled all the time is a big performance hit.
# xhprof_enabled: false # Set to true to enable Xhprof and "ddev start" or "ddev restart"
# Note that for most people the commands
# "ddev xhprof" to enable Xhprof and "ddev xhprof off" to disable it work better,
# as leaving Xhprof enabled all the time is a big performance hit.
# xhgui_http_port: "8143"
# xhgui_https_port: "8142"
# The XHGui ports can be changed from the default 8143 and 8142
# Very rarely used
# webserver_type: nginx-fpm, apache-fpm, or nginx-gunicorn
# host_xhgui_port: "8142"
# Can be used to change the host binding port of the XHGui
# application. Rarely used; only when port conflict and
# bind_all_ports is used (normally with router disabled)
# xhprof_mode: [prepend|xhgui|global]
# Default is "xhgui"
# webserver_type: nginx-fpm, apache-fpm, generic
# timezone: Europe/Berlin
# If timezone is unset, DDEV will attempt to derive it from the host system timezone
@@ -70,22 +95,24 @@ corepack_enable: false
# commands are executed.
# composer_version: "2"
# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1
# You can set it to "" or "2" (default) for Composer v2
# to use the latest major version available at the time your container is built.
# It is also possible to use each other Composer version channel. This includes:
# It is also possible to use any other Composer version channel. This includes:
# - 2.2 (latest Composer LTS version)
# - stable
# - preview
# - snapshot
# Alternatively, an explicit Composer version may be specified, for example "2.2.18".
# To reinstall Composer after the image was built, run "ddev debug rebuild".
# To reinstall Composer after the image was built, run "ddev utility rebuild".
# nodejs_version: "20"
# nodejs_root: <relative_path>
# Relative path to the directory containing the Node.js version file from the
# project root. Only used with "nodejs_version: auto" or "nodejs_version: engine".
# nodejs_version: "24"
# change from the default system Node.js version to any other version.
# See https://ddev.readthedocs.io/en/stable/users/configuration/config/#nodejs_version for more information
# and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation,
# Note that using of 'ddev nvm' is discouraged because "nodejs_version" is much easier to use,
# can specify any version, and is more robust than using 'nvm'.
# See https://docs.ddev.com/en/stable/users/configuration/config/#nodejs_version for more information
# and https://www.npmjs.com/package/n#specifying-nodejs-versions for the full documentation.
# corepack_enable: false
# Change to 'true' to 'corepack enable' and gain access to latest versions of yarn/pnpm
@@ -118,7 +145,7 @@ corepack_enable: false
# ddev_version_constraint: ""
# Example:
# ddev_version_constraint: ">= 1.22.4"
# ddev_version_constraint: ">= 1.24.8"
# This will enforce that the running ddev version is within this constraint.
# See https://github.com/Masterminds/semver#checking-version-constraints for
# supported constraint formats
@@ -145,10 +172,8 @@ corepack_enable: false
# - "global": uses the value from the global config.
# - "none": disables performance optimization for this project.
# - "mutagen": enables Mutagen for this project.
# - "nfs": enables NFS for this project.
#
# See https://ddev.readthedocs.io/en/stable/users/install/performance/#nfs
# See https://ddev.readthedocs.io/en/stable/users/install/performance/#mutagen
# See https://docs.ddev.com/en/stable/users/install/performance/#mutagen
# fail_on_hook_fail: False
# Decide whether 'ddev start' should be interrupted by a failing hook
@@ -177,10 +202,10 @@ corepack_enable: false
# The mailpit port is not normally bound on the host at all, instead being routed
# through ddev-router, but it can be bound directly to localhost if specified here.
# webimage_extra_packages: [php7.4-tidy, php-bcmath]
# webimage_extra_packages: ['php${DDEV_PHP_VERSION}-tidy', 'php${DDEV_PHP_VERSION}-yac']
# Extra Debian packages that are needed in the webimage can be added here
# dbimage_extra_packages: [telnet,netcat]
# dbimage_extra_packages: [netcat, telnet, sudo]
# Extra Debian packages that are needed in the dbimage can be added here
# use_dns_when_possible: true
@@ -192,12 +217,15 @@ corepack_enable: false
# project_tld: ddev.site
# The top-level domain used for project URLs
# The default "ddev.site" allows DNS lookup via a wildcard
# If you prefer you can change this to "ddev.local" to preserve
# pre-v1.9 behavior.
# ngrok_args: --basic-auth username:pass1234
# Provide extra flags to the "ngrok http" command, see
# https://ngrok.com/docs/ngrok-agent/config or run "ngrok http -h"
# share_default_provider: ngrok
# The default share provider to use for "ddev share"
# Defaults to global configuration, usually "ngrok"
# Can be "ngrok" or "cloudflared" or the name of a custom provider from .ddev/share-providers/
# share_provider_args: --basic-auth username:pass1234
# Provide extra flags to the share provider script
# See https://docs.ddev.com/en/stable/users/configuration/config/#share_provider_args
# disable_settings_management: false
# If true, DDEV will not create CMS-specific settings files like
@@ -259,7 +287,7 @@ corepack_enable: false
# override_config: false
# By default, config.*.yaml files are *merged* into the configuration
# But this means that some things can't be overridden
# For example, if you have 'use_dns_when_possible: true'' you can't override it with a merge
# For example, if you have 'use_dns_when_possible: true' you can't override it with a merge
# and you can't erase existing hooks or all environment variables.
# However, with "override_config: true" in a particular config.*.yaml file,
# 'use_dns_when_possible: false' can override the existing values, and
@@ -269,13 +297,13 @@ corepack_enable: false
# web_environment: []
# or
# additional_hostnames: []
# can have their intended affect. 'override_config' affects only behavior of the
# can have their intended effect. 'override_config' affects only behavior of the
# config.*.yaml file it exists in.
# Many DDEV commands can be extended to run tasks before or after the
# DDEV command is executed, for example "post-start", "post-import-db",
# "pre-composer", "post-composer"
# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more
# See https://docs.ddev.com/en/stable/users/extend/custom-commands/ for more
# information on the commands that can be extended and the tasks you can define
# for them. Example:
#hooks:
+4
View File
@@ -0,0 +1,4 @@
services:
web:
external_links:
- "ddev-router:ep-reisen.ddev.site"
+77 -9
View File
@@ -25,7 +25,7 @@ APP_SECRET=642ead390b8a38f0a017ec84d5362129
#
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
# DATABASE_URL="mysql://app:[email protected]:3306/app?serverVersion=8.0.32&charset=utf8mb4"
DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=10.11.11-MariaDB&charset=utf8mb4"
DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=mariadb-11.8.9&charset=utf8mb4"
# DATABASE_URL="postgresql://app:[email protected]:5432/app?serverVersion=16&charset=utf8"
###< doctrine/doctrine-bundle ###
@@ -40,29 +40,97 @@ MESSENGER_TRANSPORT_DSN=doctrine://default?auto_setup=0
MAILER_DSN=null://null
###< symfony/mailer ###
MAILJET_API_KEY=
MAILJET_API_SECRET=
MAILJET_API_BASE_URL=https://api.mailjet.com/v3/REST
MAILJET_DEFAULT_LIST_ID=
# Development default for HTTP Basic Auth password; override in production secrets.
MAILJET_WEBHOOK_BASIC_PASSWORD=secret
APP_NEWSLETTER_CONFIRMATION_TTL_HOURS=1
# Dedicated signing secret for accommodation booking customer access links (kept separate
# from APP_SECRET so it can be rotated independently). Unlike lazily-used API keys, UriSigner
# validates this is non-empty at construction time, so a real dev value is required here
# (override in .env.local/production secrets as usual).
ACCOMMODATION_OFFER_LINK_SECRET=abf8ec28cc2162d9121d35d6f8cbf7c29728cdacce0303e22e1bac854501728a
ACCOMMODATION_TERMS_AT=
ACCOMMODATION_TERMS_CH=
ACCOMMODATION_TERMS_IT=
BPN_CONNECT_BASE_URL=https://bpn-connect.ep-reisen.app
BPN_CONNECT_API_KEY=
# ClickUp task created when an accommodation booking is confirmed. Token/ids are secrets and
# stay empty here — set them in .env.local. Without them the handler skips with a warning.
CLICKUP_API_TOKEN=
CLICKUP_LIST_ID=
CLICKUP_TEMPLATE_ID=
CLICKUP_API_BASE_URL=https://api.clickup.com/api/v2
APP_BPN_USER=
APP_BPN_PASSWORD=
APP_BPN_IP=
APP_BPN_PORT=
APP_BPN_PORTS=
APP_BPN_DEBUG=false
APP_BPN_CONNECTION_TIMEOUT=5
APP_BPN_STREAM_TIMEOUT=30
APP_BPN_TOTAL_TIMEOUT=45
APP_TRAVEL_INFO_BASE_URL=https://www.ep-reisen.de/reiseinformationen/
APP_TRAVEL_INFO_BASE_URL="https://www.ep-reisen.de/reiseinformationen/"
APP_LEGAL_NOTICE_URL="https://www.ep-reisen.de/unternehmen/impressum-skireiseveranstalter/"
APP_TERMS_AND_CONDITIONS_URL="https://www.ep-reisen.de/skireisen/infos/allgemeine-infos/agb/"
APP_PRIVACY_POLICY_URL="https://www.ep-reisen.de/unternehmen/impressum-skireiseveranstalter/datenschutz-winterreisen/"
APP_CMS_API_BASE_URL="https://www.ep-reisen.de/"
APP_WEBSITE_BASE_URL="https://www.ep-reisen.de/"
APP_BASE_URL="https://my.ep-reisen.de"
APP_CUSTOMER_SERVICE_EMAIL="[email protected]"
APP_INSURANCE_REVOCATION_URL="https://www.hmrv.de/daten-aendern/vertrag-beenden/widerruf"
# Travel Data Service Configuration
APP_TRAVEL_PREFER_REMOTE=false
APP_TRAVEL_ENABLE_FALLBACK=true
APP_TRAVEL_SNAPSHOT_RETENTION_BUFFER_DAYS=14
API_KEYS=
# Emails
APP_DEFAULT_EMAIL_FROM=[email protected]
APP_DEFAULT_EMAIL_TO=[email protected]
ACCOMMODATION_INQUIRY_EMAIL=[email protected]
XML_EXPORT_PATH="%kernel.project_dir%/var/xmlexport"
# Global common defaults
APP_SEASON_WINTER_FROM=2026-10-01
APP_SEASON_SUMMER_FROM=2026-05-01
APP_RUNNING_COSTS_FACTOR_EUR=2.75
APP_RUNNING_COSTS_FACTOR_CHF=3.2
APP_UNDERSUBSCRIPTION_SURCHARGE_30_EUR=5.0
APP_UNDERSUBSCRIPTION_SURCHARGE_30_CHF=5.0
APP_UNDERSUBSCRIPTION_SURCHARGE_40_EUR=2.5
APP_UNDERSUBSCRIPTION_SURCHARGE_40_CHF=2.5
SFTP_XML_EXPORT_HOST=
SFTP_XML_EXPORT_PORT=
SFTP_XML_EXPORT_USER=
SFTP_XML_EXPORT_PASSWORD=
# Booking Configuration
# Status for new bookings: 'F' (Fixed/Final), 'O' (Option - requires agency confirmation)
# Use 'O' during beta phase, switch to 'F' for production
DEFAULT_BOOKING_STATUS=F
SFTP_XML_SOURCE_HOST=
SFTP_XML_SOURCE_PORT=
SFTP_XML_SOURCE_USER=
SFTP_XML_SOURCE_PASSWORD=
SFTP_XML_SOURCE_ROOT=
###> league/oauth2-server-bundle ###
OAUTH_PRIVATE_KEY=%kernel.project_dir%/config/secret/private.key
OAUTH_PUBLIC_KEY=%kernel.project_dir%/config/secret/public.key
OAUTH_ENCRYPTION_KEY=580084fd179e67399467f59ee96658ac
###< league/oauth2-server-bundle ###
###> symfony/lock ###
# Choose one of the stores below
# postgresql+advisory://db_user:db_password@localhost/db_name
LOCK_DSN=flock
###< symfony/lock ###
MAINTENANCE_MODE_ENABLED=false
MAINTENANCE_MODE_IP_WHITELIST=188.245.62.21
MAINTENANCE_MODE_ROUTE_WHITELIST=
MAINTENANCE_MODE_PATH_WHITELIST=/api,/token
+1
View File
@@ -4,3 +4,4 @@ APP_SECRET='$ecretf0rt3st'
SYMFONY_DEPRECATIONS_HELPER=999999
PANTHER_APP_ENV=panther
PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots
MAILJET_WEBHOOK_BASIC_PASSWORD=secret
+11 -5
View File
@@ -8,13 +8,9 @@
/vendor/
###< symfony/framework-bundle ###
###> phpunit/phpunit ###
/phpunit.xml
.phpunit.result.cache
###< phpunit/phpunit ###
###> symfony/phpunit-bridge ###
.phpunit.result.cache
.phpunit.cache
/phpunit.xml
###< symfony/phpunit-bridge ###
@@ -31,3 +27,13 @@ yarn-error.log
/.php-cs-fixer.php
/.php-cs-fixer.cache
###< friendsofphp/php-cs-fixer ###
/ray.php
###> phpstan/phpstan ###
phpstan.neon
###< phpstan/phpstan ###
###> config reference ###
/config/reference.php
###< config reference ###
+3 -4
View File
@@ -2,12 +2,11 @@
$finder = (new PhpCsFixer\Finder())
->in(__DIR__)
->exclude('var')
;
->exclude('var');
return (new PhpCsFixer\Config())
->setRules([
'@Symfony' => true,
'@DoctrineAnnotation' => true,
])
->setFinder($finder)
;
->setFinder($finder);
+90 -2
View File
@@ -1,70 +1,158 @@
### user profile minimum
# @no-cookie-jar
GET {{base_url}}/api/userinfo
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_email")}}
### user profile full
# @no-cookie-jar
GET {{base_url}}/api/userinfo
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_profile")}}
### user crm attributes
# @no-cookie-jar
GET {{base_url}}/api/crm-attributes
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_profile")}}
### API last update at
# @no-cookie-jar
GET {{base_url}}/api/last-update
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API countries
# @no-cookie-jar
GET {{base_url}}/api/countries
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API hotels
# @no-cookie-jar
GET {{base_url}}/api/hotels
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API hotel
# @no-cookie-jar
GET {{base_url}}/api/hotels/198924
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API pickups
# @no-cookie-jar
GET {{base_url}}/api/pickups
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API pickup
# @no-cookie-jar
GET {{base_url}}/api/pickups/1
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API travels
# @no-cookie-jar
GET {{base_url}}/api/travels
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API travel
GET {{base_url}}/api/travels/DWWWE211125
# @no-cookie-jar
GET {{base_url}}/api/travels/DPWMP140326
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API travel remote
# @no-cookie-jar
GET {{base_url}}/api/travels/11603
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API hotel availability remote
GET {{base_url}}/api/travels/11603/152546/2026-01-03/availability
# @no-cookie-jar
GET {{base_url}}/api/travels/11606/152546/2026-01-24/availability
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API products remote
# @no-cookie-jar
GET {{base_url}}/api/products
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API contact form
# @no-cookie-jar
POST {{base_url}}/api/contactform
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
{
"lastName": "{{$random.name.lastName}}",
"firstName": "{{$random.name.firstName}}",
"gender": "d",
"street": "{{$random.address.streetAddress}}",
"zipCode": "{{$random.address.zipCode}}",
"city": "{{$random.address.city}}",
"email": "{{$random.email}}",
"phone": "{{$random.phoneNumber.cellPhone}}"
}
### API newsletter lists map
# @no-cookie-jar
GET {{base_url}}/api/newsletters
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_newsletter")}}
### API newsletter subscriptions
# @no-cookie-jar
POST {{base_url}}/api/newsletter-subscriptions
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_newsletter")}}
{
"email": "{{$random.email}}",
"firstName": "{{$random.address.firstName}}",
"lastName": "{{$random.address.lastName}}",
"listIds": [10321569,10321382,10321383]
}
### API contingent calendar
# @no-cookie-jar
GET {{base_url}}/api/contingents/calendar?hotelCode=DGS&dateFrom=2026-06-01&dateTo=2026-06-30
Accept: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API contintent prices
# @no-cookie-jar
GET {{base_url}}/api/contingents/prices?hotelCode=DGS&year=2026
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API pickups planning webhook
# @no-cookie-jar
POST {{base_url}}/api/pickups-planning
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
< ./assets/json/zustiegplanung.json
### API pickups planning
# @no-cookie-jar
GET {{base_url}}/api/pickups-planning/DPWWTS191125
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
### API accommodation booking
# @no-cookie-jar
GET {{base_url}}/api/accommodation-bookings/e4591076-eb65-41e8-a115-09d18d15604a
Accept: application/json
Content-Type: application/json
Authorization: Bearer {{$auth.token("oauth2_api")}}
+8
View File
@@ -0,0 +1,8 @@
import htmx from 'htmx.org'
htmx.config.includeIndicatorStyles = false
htmx.config.historyCacheSize = 0
htmx.config.allowScriptTags = false
import './bootstrap.js'
import './styles/admin.css'
+15 -4
View File
@@ -1,13 +1,24 @@
import './bootstrap.js'
import './loading.js'
import './styles/app.css'
import '@iframe-resizer/child'
import htmx from 'htmx.org'
window.htmx = htmx
htmx.config.includeIndicatorStyles = false
htmx.config.historyEnabled = false
htmx.config.historyCacheSize = 0
htmx.config.historyEnabled = true
htmx.config.historyCacheSize = 10
htmx.config.allowScriptTags = false
htmx.config.withCredentials = true
htmx.config.selfRequestsOnly = false
htmx.config.timeout = 50000 // 50 seconds - slightly higher than backend timeout (45s)
document.body.addEventListener('htmx:beforeSwap', (event) => {
// Symfony renders invalid forms with 422; let HTMX swap those responses so inline
// validation errors are actually shown to the user.
if (event.detail?.xhr?.status === 422) {
event.detail.shouldSwap = true
event.detail.isError = false
}
})
@@ -0,0 +1,84 @@
import { Controller } from '@hotwired/stimulus'
import { useFetch } from '../mixins/use_fetch'
import Autocomplete from '@trevoreyre/autocomplete-js'
export default class extends Controller {
static targets = [ 'input', 'field', 'resetButton', 'searchIcon' ]
static values = { url: String, choices: Array, selected: Boolean }
initialize() {
useFetch(this)
}
connect() {
const searchHandler = input => {
return new Promise(resolve => {
// Check input minimum length
if (input.length < 2) {
return resolve([])
}
// Search choices if provided
if (this.choicesValue.length > 0) {
return resolve(this.choicesValue.filter(choice => {
return -1 !== choice.text.toLowerCase().search(input.toLowerCase())
}))
}
// Use API otherwise
let data = { search: input }
fetch(this.urlValue, { method: 'POST', body: JSON.stringify(data), credentials: 'include' })
.then(this.checkStatus)
.then(this.parseJSON)
.then(data => {
resolve(data)
})
})
}
const submitHandler = result => {
this.fieldTarget.value = result.value
this.selectedValue = true
this.element.dispatchEvent(new CustomEvent('select', {
detail: { result }
}))
}
this.autocomplete = new Autocomplete(this.element, {
search: searchHandler,
getResultValue: result => result.text,
submitOnEnter: true,
onSubmit: submitHandler,
debounceTime: 250,
})
if (this.fieldTarget.value) {
this.selectedValue = true
}
// prevent form submission when selecting entry in autocomplete list with enter key
this.element.addEventListener('keypress', e => {
if (e.key === 'Enter') {
e.preventDefault()
}
})
}
reset() {
this.inputTarget.value = null
this.fieldTarget.value = null
this.selectedValue = false
this.element.dispatchEvent(new CustomEvent('reset'))
}
selectedValueChanged() {
this.resetButtonTarget.classList.toggle('hidden', false === this.selectedValue)
this.searchIconTarget.classList.toggle('hidden', this.selectedValue)
}
disconnect() {
this.autocomplete.destroy()
}
}
+59
View File
@@ -0,0 +1,59 @@
import { Controller } from '@hotwired/stimulus'
/**
* Monitors birthday input fields (day, month, year) and dispatches a custom event
* only when all three fields are filled with valid values.
*
* This prevents premature HTMX refreshes when users are still entering the date,
* improving UX by waiting until the complete date is entered.
*/
export default class extends Controller {
static targets = ['day', 'month', 'year']
/**
* Checks if all birthday fields are filled and dispatches a completion event.
*
* Called on input/change events from the day, month, and year fields.
* Only dispatches the 'birthday:complete' event when all three fields
* contain valid values that could form a complete date.
*/
check() {
const day = this.dayTarget.value.trim()
const month = this.monthTarget.value.trim()
const year = this.yearTarget.value.trim()
if (false === this.isComplete(day, month, year)) {
return
}
this.element.dispatchEvent(new CustomEvent('birthday:complete', { bubbles: true }))
}
/**
* Validates that all date components are filled with plausible values.
*
* @param {string} day The day value
* @param {string} month The month value
* @param {string} year The year value
*
* @returns {boolean} True if all fields contain complete values
*/
isComplete(day, month, year) {
// Day: 1-2 digits
if (0 === day.length || day.length > 2) {
return false
}
// Month: 1-2 digits
if (0 === month.length || month.length > 2) {
return false
}
// Year: exactly 4 digits for a complete year
if (4 !== year.length) {
return false
}
return true
}
}
-29
View File
@@ -1,29 +0,0 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static targets = ['field']
static values = { availabilities: Object }
toggle(event) {
let field = event.target
let id = field.value
let availabilities = this.availabilitiesValue
if (field.checked) {
availabilities[id].available--
} else {
availabilities[id].available++
}
field.disabled = 0 >= availabilities[id].available
field.classList.toggle('cursor-not-allowed', field.disabled)
this.availabilitiesValue = availabilities
}
availabilitiesValueChanged(availabilities) {
this.fieldTargets.forEach((field) => {
let id = field.value
if (false === field.checked && 0 >= availabilities[id].available) {
field.disabled = true
}
})
}
}
@@ -0,0 +1,32 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static classes = [ 'hidden' ]
static targets = [ 'container', 'checkboxGroup' ]
static values = { visible: Boolean }
connect() {
this.updateVisibility()
}
check() {
this.updateVisibility()
}
updateVisibility() {
if (!this.hasCheckboxGroupTarget) {
return
}
const checkboxes = this.checkboxGroupTarget.querySelectorAll('input[type="checkbox"]')
const hasChecked = Array.from(checkboxes).some(checkbox => checkbox.checked)
this.visibleValue = hasChecked
}
visibleValueChanged(visible) {
if (this.hasContainerTarget) {
this.containerTarget.classList.toggle(this.hiddenClass, false === visible)
}
}
}
@@ -0,0 +1,37 @@
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static values = {
content: String,
label: String,
}
connect() {
this.originalLabel = this.element.innerText
}
disconnect() {
clearTimeout(this.resetTimer)
}
copy() {
navigator.clipboard.writeText(this.contentValue).then(() => {
this.dispatch('copied', {
detail: {
content: this.contentValue,
}
})
}).catch((error) => {
console.error('Failed to copy to clipboard:', error)
})
if (this.hasLabelValue) {
this.element.innerText = this.labelValue
clearTimeout(this.resetTimer)
this.resetTimer = setTimeout(() => {
this.element.innerText = this.originalLabel
}, 3000)
}
}
}
@@ -0,0 +1,13 @@
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
static values = {
payload: Object
};
connect() {
if (typeof window.dataLayer !== 'undefined') {
window.dataLayer.push(this.payloadValue);
}
}
}
@@ -0,0 +1,70 @@
import { Controller } from '@hotwired/stimulus'
import { Calendar } from 'vanilla-calendar-pro'
/* stimulusFetch: 'lazy' */
export default class extends Controller {
static targets = ['field', 'hiddenField']
static values = {
minDate: String,
maxDate: String,
disableWeekends: Boolean,
disabledDates: Array,
}
connect() {
const options = {
inputMode: true,
locale: 'de-DE',
selectedTheme: 'light',
selectedDates: this.hiddenFieldTarget.value ? [this.hiddenFieldTarget.value] : [],
onClickDate: (self) => {
const iso = self.context.selectedDates[0] ?? null
this.hiddenFieldTarget.value = iso ?? ''
if (iso) {
const [year, month, day] = iso.split('-')
this.fieldTarget.value = `${day}.${month}.${year}`
} else {
this.fieldTarget.value = ''
}
this.element.dispatchEvent(new CustomEvent('datepicker:picked', {
detail: { date: this.fieldTarget.value }
}))
},
onHide: () => {
this.element.dispatchEvent(new CustomEvent('datepicker:closed'))
},
}
if (this.minDateValue) options.dateMin = this.minDateValue
if (this.maxDateValue) options.dateMax = this.maxDateValue
if (this.disableWeekendsValue) options.disableWeekdays = [0, 6]
if (this.disabledDatesValue.length) options.disableDates = this.disabledDatesValue
this.picker = new Calendar(this.fieldTarget, options)
this.picker.init()
this.handleManualInput = () => {
const value = this.fieldTarget.value.trim()
if (!value) {
this.hiddenFieldTarget.value = ''
this.picker.set({ selectedDates: [] }, { dates: true })
} else {
const match = value.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/)
if (match) {
const [, day, month, year] = match
const iso = `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`
this.hiddenFieldTarget.value = iso
this.picker.set({ selectedDates: [iso] }, { dates: true })
}
}
this.element.dispatchEvent(new CustomEvent('datepicker:closed'))
}
this.fieldTarget.addEventListener('change', this.handleManualInput)
}
disconnect() {
this.fieldTarget.removeEventListener('change', this.handleManualInput)
this.picker.destroy()
}
}
@@ -1,23 +1,23 @@
import { Controller } from '@hotwired/stimulus'
import {Controller} from '@hotwired/stimulus'
export default class extends Controller {
static targets = [ 'fields', 'field', 'addButton', 'index' ]
static targets = ['fields', 'field', 'addButton', 'index']
static values = {
prototype: String,
maxItems: Number,
itemsCount: Number,
}
connect () {
this.index = this.itemsCountValue = this.fieldTargets.length
connect() {
this.itemsCountValue = this.fieldTargets.length
}
addItem() {
let prototype = JSON.parse(this.prototypeValue)
const newField = prototype.replace(/__name__/g, this.index)
const index = this.fieldTargets.length + 1
const prototype = JSON.parse(this.prototypeValue)
const newField = prototype.replace(/__name__/g, index)
this.fieldsTarget.insertAdjacentHTML('beforeend', newField)
this.index++
this.itemsCountValue++
}
+29
View File
@@ -0,0 +1,29 @@
import { Controller } from '@hotwired/stimulus'
import GLightbox from 'glightbox'
/* stimulusFetch: 'lazy' */
export default class extends Controller {
static targets = ['item']
connect() {
this.lightbox = GLightbox({
elements: this.itemTargets.map((el) => ({
href: el.dataset.galleryHref,
type: 'image',
alt: el.dataset.galleryAlt ?? '',
})),
})
this.itemTargets.forEach((el, index) => {
el.addEventListener('click', (e) => {
e.preventDefault()
this.lightbox.openAt(index)
})
})
}
disconnect() {
this.lightbox.destroy()
}
}
-14
View File
@@ -1,14 +0,0 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static values = { offsetTop: { type: Number}}
connect() {
if ('parentIframe' in window) {
window.iFrameResizer = {
onReady: function () {
window.parentIFrame.scrollTo(0, this.offsetTopValue)
}
}
}
}
}
-12
View File
@@ -1,12 +0,0 @@
import { Controller} from '@hotwired/stimulus'
export default class extends Controller {
static targets = [ 'indicator' ]
static classes = [ 'hidden' ]
toggle() {
this.indicatorTarget.classList.remove(this.hiddenClass)
this.element.scrollIntoView({ block: 'start', behavior: 'smooth'})
}
}
@@ -0,0 +1,16 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static outlets = [ 'mobilenav' ]
static classes = [ 'closed' ]
trigger({ params: { mode } }) {
this.mobilenavOutlet.toggle(mode)
}
toggle(mode) {
// Add animation classes only now to avoid fouc
this.element.classList.add('transition-transform', 'duration-300')
this.element.classList.toggle(this.closedClass, 'close' === mode)
}
}
@@ -0,0 +1,36 @@
import { Controller } from '@hotwired/stimulus'
import { useClickOutside } from 'stimulus-use'
export default class extends Controller {
static targets = [ 'label', 'dropdown', 'choice' ]
static values = { placeholder: String }
connect() {
this.update()
useClickOutside(this)
}
toggle() {
this.dropdownTarget.classList.toggle('hidden')
}
update() {
let labels = []
this.choiceTargets.forEach((choice) => {
if (choice.checked) {
labels.push(choice.dataset.label)
}
this.labelTarget.innerText = labels.join(', ')
})
if (0 === labels.length) {
this.labelTarget.innerText = this.placeholderValue
}
}
clickOutside(e) {
this.dropdownTarget.classList.toggle('hidden', true)
}
}
@@ -0,0 +1,11 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static targets = [ 'field' ]
toggle() {
let type = this.fieldTarget.getAttribute('type') === 'password' ? 'text' : 'password'
this.fieldTarget.setAttribute('type', type)
}
}
@@ -0,0 +1,166 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static targets = ['mount', 'error', 'message', 'resetButton', 'day', 'dateFrom', 'dateTo', 'submit']
static values = {
hotelCode: String,
selectedFrom: String,
selectedTo: String,
calendarRefreshUrl: String,
}
connect() {
this.startDate = null
this.endDate = null
this.sessionRestored = false
// Re-apply highlights after every HTMX month swap (navigation or initial load).
this.mountTarget.addEventListener('htmx:afterSwap', () => requestAnimationFrame(() => this.initAfterLoad()))
this.mountTarget.addEventListener('htmx:responseError', () => this.showError())
}
initAfterLoad() {
// Restore from session values exactly once on the first swap.
if (!this.sessionRestored) {
this.sessionRestored = true
const from = this.selectedFromValue
const to = this.selectedToValue
if (from && to) {
this.startDate = from
this.endDate = to
if (this.hasResetButtonTarget) this.resetButtonTarget.classList.remove('hidden')
}
}
this.updateDisplay()
}
selectDate(event) {
const btn = event.currentTarget
btn.blur()
const date = btn.dataset.date
const status = btn.dataset.status
if (!status || status === 'blocked' || status === 'past') return
if (this.startDate && this.endDate) {
this.resetSelection()
}
if (!this.startDate) {
if (status === 'checkout-only') {
this.showMessage('Bitte wähle einen Anreisetag.')
return
}
this.startDate = date
this.endDate = null
this.updateDisplay()
this.showMessage('Bitte wähle das Abreisedatum.')
return
}
if (date === this.startDate) {
this.resetSelection()
return
}
const [from, to] = date < this.startDate ? [date, this.startDate] : [this.startDate, date]
if (this.hasBlockedInRange(from, to)) {
this.resetSelection()
this.showMessage('Dieser Zeitraum enthält nicht verfügbare Daten.')
return
}
const startBtn = this.dayTargets.find(b => b.dataset.date === from)
const minNights = parseInt(startBtn?.dataset.minNights) || 0
const nights = (new Date(to) - new Date(from)) / 86400000
if (minNights > 0 && nights < minNights) {
this.showMessage(`Weniger als ${minNights} Nächte nur auf Anfrage.`)
} else {
this.hideMessage()
}
this.startDate = from
this.endDate = to
this.updateDisplay()
this.activateSubmit(from, to)
this.saveAndRefreshSummary(from, to)
this.dispatch('range-select', { detail: { dateFrom: from, dateTo: to } })
}
hasBlockedInRange(from, to) {
for (const btn of this.dayTargets) {
const d = btn.dataset.date
const s = btn.dataset.status
if (d >= from && d < to && (s === 'blocked' || s === 'past' || s === 'checkout-only')) return true
}
return false
}
updateDisplay() {
for (const btn of this.dayTargets) {
const d = btn.dataset.date
btn.classList.remove('pc-day--pending-start', 'pc-day--selected-start', 'pc-day--selected-end', 'pc-day--in-range')
if (!this.startDate) continue
if (d === this.startDate) {
btn.classList.add(this.endDate ? 'pc-day--selected-start' : 'pc-day--pending-start')
} else if (this.endDate) {
if (d === this.endDate) btn.classList.add('pc-day--selected-end')
else if (d > this.startDate && d < this.endDate) btn.classList.add('pc-day--in-range')
}
}
}
activateSubmit(dateFrom, dateTo) {
if (this.hasDateFromTarget) this.dateFromTarget.value = dateFrom
if (this.hasDateToTarget) this.dateToTarget.value = dateTo
if (this.hasSubmitTarget) {
this.submitTarget.disabled = false
this.submitTarget.classList.remove('opacity-50', 'cursor-not-allowed', 'pointer-events-none')
}
if (this.hasResetButtonTarget) this.resetButtonTarget.classList.remove('hidden')
}
resetSelection() {
this.startDate = null
this.endDate = null
this.updateDisplay()
this.hideMessage()
if (this.hasDateFromTarget) this.dateFromTarget.value = ''
if (this.hasDateToTarget) this.dateToTarget.value = ''
if (this.hasSubmitTarget) {
this.submitTarget.disabled = true
this.submitTarget.classList.add('opacity-50', 'cursor-not-allowed', 'pointer-events-none')
}
if (this.hasResetButtonTarget) this.resetButtonTarget.classList.add('hidden')
this.saveAndRefreshSummary()
}
reset() {
this.resetSelection()
}
saveAndRefreshSummary(dateFrom = '', dateTo = '') {
if (!this.hasCalendarRefreshUrlValue) return
htmx.ajax('POST', this.calendarRefreshUrlValue, {
values: { date_from: dateFrom, date_to: dateTo },
swap: 'none',
target: this.element,
})
}
showMessage(text) {
if (this.hasMessageTarget) this.messageTarget.textContent = text
}
hideMessage() {
if (this.hasMessageTarget) this.messageTarget.textContent = ''
}
showError() {
if (this.hasErrorTarget) this.errorTarget.classList.remove('hidden')
}
}
@@ -0,0 +1,33 @@
import { Controller } from '@hotwired/stimulus'
/**
* Unchecks conflicting additional services as soon as one is selected, so the user sees the
* result immediately instead of waiting for the debounced htmx refresh. The server resolves
* the same conflicts again and stays the source of truth.
*/
export default class extends Controller {
static targets = [ 'input' ]
select(event) {
const input = event.target
if (!input.checked) {
return
}
const group = input.dataset.exclusionGroup
if (!group) {
return
}
const exclusive = '1' === input.dataset.exclusive
this.inputTargets
.filter(other => other !== input)
.filter(other => other.dataset.exclusionGroup === group)
.filter(other => exclusive || '1' === other.dataset.exclusive)
.forEach(other => { other.checked = false })
}
}
@@ -0,0 +1,30 @@
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
static classes = ['closed', 'iconClosed', 'iconExpanded']
static targets = ['submenu', 'button', 'icon']
static values = { expanded: Boolean }
toggleSubmenu() {
this.expandedValue = !this.expandedValue
}
expandedValueChanged(expanded) {
this.submenuTarget.classList.toggle(this.closedClass, false === expanded)
if (false === this.hasButtonTarget) {
return
}
this.buttonTarget.setAttribute('aria-expanded', expanded)
if (false === this.hasIconTarget) {
return
}
if (true === expanded) {
this.iconTarget.classList.add(...this.iconExpandedClasses)
this.iconTarget.classList.remove(...this.iconClosedClasses)
} else {
this.iconTarget.classList.add(...this.iconClosedClasses)
this.iconTarget.classList.remove(...this.iconExpandedClasses)
}
}
}
+90
View File
@@ -0,0 +1,90 @@
import { Controller } from '@hotwired/stimulus'
import Sortable from 'sortablejs'
export default class extends Controller {
static targets = [ 'list', 'item', 'handle', 'positionField', 'positionLabel', 'status' ]
static values = {
url: String,
}
connect() {
this.abortController = null
// The sortable container may be nested (e.g. a tbody) when the controller element also
// has to wrap elements that must not be dragged, like the status message.
new Sortable(this.hasListTarget ? this.listTarget : this.element, {
draggable: '[data-sortable-target="item"]',
handle: '[data-sortable-target="handle"]',
sort: true,
fallbackOnBody: true,
onEnd: e => {
this.updateOrdering()
this.persist()
}
})
}
disconnect() {
this.abortController?.abort()
}
updateOrdering() {
this.positionFieldTargets.forEach((field, index) => {
field.value = index + 1
})
this.positionLabelTargets.forEach((label, index) => {
label.innerText = index + 1
})
}
/**
* Sends the new order to the server. Only active when a url value is present, so the
* controller stays usable for plain form ordering.
*/
persist() {
if (!this.hasUrlValue || this.urlValue === '') {
return
}
// A drag while the previous request is still running makes that request obsolete.
this.abortController?.abort()
this.abortController = new AbortController()
const ids = this.itemTargets
.map(item => Number(item.dataset.sortableId))
.filter(id => Number.isInteger(id) && id > 0)
this.setStatus('speichert …')
fetch(this.urlValue, {
method: 'POST',
credentials: 'include',
signal: this.abortController.signal,
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ ids }),
})
.then(response => {
if (!response.ok) {
throw new Error(`Unexpected response ${response.status}`)
}
this.setStatus('Reihenfolge gespeichert')
})
.catch(error => {
if (error.name === 'AbortError') {
return
}
console.error('Failed to persist ordering', error)
this.setStatus('Speichern fehlgeschlagen')
})
}
setStatus(message) {
this.statusTargets.forEach(status => {
status.innerText = message
})
}
}
@@ -0,0 +1,44 @@
import {Controller} from '@hotwired/stimulus'
export default class extends Controller {
static targets = ['field', 'display', 'buttonInc', 'buttonDec']
static values = {
current: Number,
min: Number,
max: Number
}
connect() {
this.currentValue = parseInt(this.fieldTarget.value) || 0
this.updateForm()
}
increase() {
if (null !== this.maxValue && this.currentValue >= this.maxValue) {
return
}
this.currentValue = this.currentValue + 1
this.updateForm()
}
decrease() {
if (null !== this.minValue && this.currentValue <= this.minValue) {
return
}
this.currentValue = this.currentValue - 1
this.updateForm()
}
updateForm() {
this.displayTarget.innerText = this.currentValue
this.fieldTarget.value = this.currentValue
this.buttonIncTarget.disabled = null !== this.maxValue && this.currentValue >= this.maxValue
this.buttonDecTarget.disabled = null !== this.minValue && this.currentValue <= this.minValue
// Trigger change event to fire HTMX request
this.fieldTarget.dispatchEvent(new Event('change', {bubbles: true}))
}
}
+60
View File
@@ -0,0 +1,60 @@
import { Controller } from '@hotwired/stimulus'
import Toastify from 'toastify-js'
export default class extends Controller {
static values = { text: String, class: String }
connect() {
// Show toast from Stimulus values (existing functionality)
if (this.hasTextValue) {
this.showToast(this.textValue, this.classValue)
}
// Bind handler for proper cleanup
this.boundHandleNotifications = this.handleNotifications.bind(this)
// Listen for custom HTMX notification events on document.body
// Events from HX-Trigger response headers bubble up to document.body
document.body.addEventListener('showNotifications', this.boundHandleNotifications)
}
disconnect() {
document.body.removeEventListener('showNotifications', this.boundHandleNotifications)
}
handleNotifications(event) {
// HTMX wraps the trigger value in an object with 'value' and 'elt' properties
// event.detail.value contains the actual array from the HX-Trigger header
const notifications = event.detail?.value || event.detail || []
if (Array.isArray(notifications)) {
notifications.forEach((notification, index) => {
const className = this.getClassForType(notification.type)
this.showToast(notification.message, className)
})
}
}
showToast(text, className = '') {
Toastify({
duration: 5000,
text: text,
gravity: 'top',
position: 'right',
className: className,
close: true,
}).showToast()
}
getClassForType(type) {
const typeMap = {
'success': 'toastify--success',
'warning': 'toastify--warning',
'error': 'toastify--error',
'info': 'toastify--info',
}
return typeMap[type] || 'toastify--info'
}
}
+47 -8
View File
@@ -1,18 +1,26 @@
import { Controller } from '@hotwired/stimulus'
import {Controller} from '@hotwired/stimulus'
export default class extends Controller {
static classes = [ 'closed' ]
static targets = [ 'toggle', 'icon' ]
static classes = ['closed', 'open', 'iconOpen']
static targets = ['content', 'icon', 'container', 'trigger']
static values = {
open: {
type: Boolean,
default: true,
},
storageKey: {
type: String,
default: ''
}
}
initialize() {
this.target = this.hasToggleTarget ? this.toggleTarget : this.element
this.target = this.hasContentTarget ? this.contentTarget : this.element
// Restore state from storage if storageKey is provided
if (this.hasStorageKey()) {
this.restoreState()
}
}
toggle() {
@@ -30,10 +38,41 @@ export default class extends Controller {
openValueChanged(open) {
this.target.classList.toggle(this.closedClass, false === open)
if (false === this.hasIconTarget) {
return
if (this.hasIconTarget) {
let iconClass = this.hasIconOpenClass ? this.iconOpenClass : 'rotate-90'
this.iconTarget.classList.toggle(iconClass, true === open)
}
this.iconTarget.classList.toggle('rotate-90', true === open)
if (this.hasTriggerTarget) {
this.triggerTarget.setAttribute('aria-expanded', String(open))
}
// Toggle class on container element (or controller element) if specified
if (this.hasOpenClass) {
const container = this.hasContainerTarget ? this.containerTarget : this.element
this.openClasses.forEach(cls => {
container.classList.toggle(cls, true === open)
})
}
// Save state to storage if storageKey is provided
if (this.hasStorageKey()) {
this.saveState()
}
}
hasStorageKey() {
return this.storageKeyValue && this.storageKeyValue.trim() !== ''
}
saveState() {
sessionStorage.setItem(`toggle_${this.storageKeyValue}`, this.openValue.toString())
}
restoreState() {
const savedState = sessionStorage.getItem(`toggle_${this.storageKeyValue}`)
if (savedState !== null) {
this.openValue = savedState === 'true'
}
}
}
+5 -1
View File
@@ -1,5 +1,5 @@
import { Controller } from '@hotwired/stimulus'
import tippy from 'tippy.js'
import tippy, { hideAll } from 'tippy.js'
export default class extends Controller {
static targets = ['trigger', 'template']
@@ -16,14 +16,18 @@ export default class extends Controller {
trigger: 'click',
allowHTML: true,
interactive: true,
appendTo: document.body,
}
} else {
options = {
content: this.contentValue,
placement,
touch: false,
trigger: 'mouseenter focus',
allowHTML: true,
interactive: true,
appendTo: document.body,
onShow(instance) { hideAll({ exclude: instance }) },
}
}
if (this.hasTriggerTarget) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg viewBox="0 0 130 130" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(3, 28)">
<path d="M107,0.3c-36.4,5.5 -81.6,19.1 -81.6,38.2c0,17.7 41.8,13.2 41.8,13.2c0,0 -67,22.3 -67,-7c0,-33.2 84.5,-44.4 106.8,-44.4Z" fill="#0084d4"/>
<path d="M17,73.5c36.4,-5.4 81.6,-19.1 81.6,-38.2c0,-17.7 -41.8,-13.2 -41.8,-13.2c0,0 67,-22.3 67,7c0,33.3 -84.5,44.4 -106.8,44.4Z" fill="#f8c62f"/>
<path d="M60.7,34.3l-12.8,4l12.2,0.8l-0.4,-2.4l1,-2.4Z" fill="#0084d4"/>
<path d="M75.9,35.2l-9.2,2.9l-3.5,9.7l-1.7,-11.3l4,-10.7l1.7,7.9l8.7,1.5Z" fill="#f8c62f"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 480 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 KiB

+88 -229
View File
@@ -1,236 +1,95 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="icon-dots" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 6.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 12.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 18.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Z" />
</symbol>
<symbol id="icon-feedback" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 01.865-.501 48.172 48.172 0 003.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z" />
</symbol>
<symbol id="icon-login" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9" />
</symbol>
<symbol id="icon-logout" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75" />
</symbol>
<symbol id="icon-alert" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" />
</symbol>
<symbol id="icon-close" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
</symbol>
<symbol id="icon-back" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M9 15L3 9m0 0l6-6M3 9h12a6 6 0 010 12h-3" />
</symbol>
<symbol id="icon-list" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zM3.75 12h.007v.008H3.75V12zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm-.375 5.25h.007v.008H3.75v-.008zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z" />
</symbol>
<symbol id="icon-menu" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" />
</symbol>
<symbol id="icon-edit" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10" />
</symbol>
<symbol id="icon-plus" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15" />
</symbol>
<symbol id="icon-minus" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" />
</symbol>
<symbol id="icon-search" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" />
</symbol>
<symbol id="icon-user" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z" />
</symbol>
<symbol id="icon-users" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" />
</symbol>
<symbol id="icon-delete" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" />
</symbol>
<symbol id="icon-check" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" />
</symbol>
<symbol id="icon-upload" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor">
<path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"/>
</symbol>
<symbol id="icon-download" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3" />
</symbol>
<symbol id="icon-sort" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" />
</symbol>
<symbol id="icon-arrow-left" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15m0 0l6.75 6.75M4.5 12l6.75-6.75" />
</symbol>
<symbol id="icon-arrow-right" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12h15m0 0l-6.75-6.75M19.5 12l-6.75 6.75" />
</symbol>
<symbol id="icon-document" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
</symbol>
<symbol id="icon-filter" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z" />
</symbol>
<symbol id="icon-refresh" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99" />
</symbol>
<symbol id="icon-settings" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</symbol>
<symbol id="icon-at" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" d="M16.5 12a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zm0 0c0 1.657 1.007 3 2.25 3S21 13.657 21 12a9 9 0 10-2.636 6.364M16.5 12V8.25" />
</symbol>
<symbol id="icon-mail" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75" />
</symbol>
<symbol id="icon-house" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 21v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21m0 0h4.5V3.545M12.75 21h7.5V10.75M2.25 21h1.5m18 0h-18M2.25 9l4.5-1.636M18.75 3l-1.5.545m0 6.205l3 1m1.5.5l-1.5-.5M6.75 7.364V3h-3v18m3-13.636l10.5-3.819" />
</symbol>
<symbol id="icon-phone" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 002.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 01-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 00-1.091-.852H4.5A2.25 2.25 0 002.25 4.5v2.25z" />
</symbol>
<symbol id="icon-mobile" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M10.5 1.5H8.25A2.25 2.25 0 0 0 6 3.75v16.5a2.25 2.25 0 0 0 2.25 2.25h7.5A2.25 2.25 0 0 0 18 20.25V3.75a2.25 2.25 0 0 0-2.25-2.25H13.5m-3 0V3h3V1.5m-3 0h3m-3 18.75h3" />
</symbol>
<symbol id="icon-calendar" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z" />
</symbol>
<symbol id="icon-hand" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M10.05 4.575a1.575 1.575 0 10-3.15 0v3m3.15-3v-1.5a1.575 1.575 0 013.15 0v1.5m-3.15 0l.075 5.925m3.075.75V4.575m0 0a1.575 1.575 0 013.15 0V15M6.9 7.575a1.575 1.575 0 10-3.15 0v8.175a6.75 6.75 0 006.75 6.75h2.018a5.25 5.25 0 003.712-1.538l1.732-1.732a5.25 5.25 0 001.538-3.712l.003-2.024a.668.668 0 01.198-.471 1.575 1.575 0 10-2.228-2.228 3.818 3.818 0 00-1.12 2.687M6.9 7.575V12m6.27 4.318A4.49 4.49 0 0116.35 15m.002 0h-.002" />
</symbol>
<symbol id="icon-copy" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6" />
</symbol>
<symbol id="icon-photo" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 001.5-1.5V6a1.5 1.5 0 00-1.5-1.5H3.75A1.5 1.5 0 002.25 6v12a1.5 1.5 0 001.5 1.5zm10.5-11.25h.008v.008h-.008V8.25zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z" />
</symbol>
<symbol id="icon-print" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
<path d="M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z" stroke-linecap="round" stroke-linejoin="round"/>
</symbol>
<symbol id="icon-locked" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
</symbol>
<symbol id="icon-unlocked" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 10.5V6.75a4.5 4.5 0 119 0v3.75M3.75 21.75h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H3.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" />
</symbol>
<symbol id="icon-mask" fill="currentColor" stroke="none" viewBox="0 0 576 512">
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M288 64C39.52 64 0 182.1 0 273.5C0 379.5 78.8 448 176 448c27.33 0 51.21-6.516 66.11-36.79l19.93-40.5C268.3 358.6 278.1 352.4 288 352.1c9.9 .3711 19.7 6.501 25.97 18.63l19.93 40.5C348.8 441.5 372.7 448 400 448c97.2 0 176-68.51 176-174.5C576 182.1 536.5 64 288 64zM400 400c-18.12 0-19.56-2.924-23.04-9.986l-20.35-41.33c-13.87-26.86-38.85-43.53-66.82-44.57L288 304L286.2 304.1c-27.96 1.049-52.94 17.71-67.24 45.41l-19.93 40.49C195.6 397.1 194.1 400 176 400c-75.36 0-128-52.04-128-126.5C48 229.3 48 112 288 112s240 117.3 240 161.5C528 347.1 475.4 400 400 400zM160 192C124.7 192 96 220.7 96 256s28.65 64 64 64c35.35 0 64-28.65 64-64S195.3 192 160 192zM416 192c-35.35 0-64 28.65-64 64s28.65 64 64 64c35.35 0 64-28.65 64-64S451.3 192 416 192z"/>
</symbol>
<symbol id="icon-excel" fill="currentColor" stroke="none" viewBox="0 0 384 512">
<!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448zM229.1 233.3L192 280.9L154.9 233.3C146.8 222.8 131.8 220.9 121.3 229.1C110.8 237.2 108.9 252.3 117.1 262.8L161.6 320l-44.53 57.25c-8.156 10.47-6.25 25.56 4.188 33.69C125.7 414.3 130.8 416 135.1 416c7.156 0 14.25-3.188 18.97-9.25L192 359.1l37.06 47.65C233.8 412.8 240.9 416 248 416c5.125 0 10.31-1.656 14.72-5.062c10.44-8.125 12.34-23.22 4.188-33.69L222.4 320l44.53-57.25c8.156-10.47 6.25-25.56-4.188-33.69C252.2 220.9 237.2 222.8 229.1 233.3z"/>
</symbol>
<symbol id="icon-pdf" fill="currentColor" stroke="none" viewBox="0 0 384 512">
<!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448zM202 286.1c.877-2.688 1.74-5.398 2.582-8.145c1.434-5.762 7.488-31.54 7.488-52.47C212.1 207 197.1 192 178.6 192C160.1 192 145.1 207 145.1 225.5c0 .2969 .1641 28.81 13.85 62.3c-7.035 19.36-15.57 38.8-25.41 57.93c-21.49 10.11-39.24 22.23-52.8 36.07c-6.234 6.438-9.367 14.74-9.367 24.72c0 18.45 15.01 33.46 33.46 33.46c10.8 0 20.98-5.227 27.22-13.98c7.322-10.28 18.38-26.9 30.47-48.95c15.8-6.352 33.88-11.72 53.88-16c13.55 9.578 28.9 17.29 45.71 22.95c4.527 1.551 9.402 2.348 14.43 2.348c20.26 0 36.13-16.19 36.13-36.86c0-20.33-16.54-36.87-36.87-36.87h-3.705c-2.727 .125-20.51 1.141-45.37 5.367C216.9 308.9 208.6 298.3 202 286.1zM110.2 410.4c-3.273 4.688-12.03 2.777-12.03-5.312c0-1.754 .6289-3.43 1.729-4.555c9.02-9.219 19.94-17.05 31.85-23.72C122.3 393.1 114.3 404.7 110.2 410.4zM178.6 218.8c3.693 0 6.703 3.008 6.703 6.703c0 15.21-4.109 34.84-5.746 42.1C172.1 245 171.9 227.2 171.9 225.5C171.9 221.8 174.9 218.8 178.6 218.8zM162.3 348.3c6.611-13.48 13.22-28.46 19.38-44.7c6.389 10.92 14.56 21.86 24.96 31.97C192.6 338.8 177.4 342.9 162.3 348.3zM272.4 339.5h3.352c5.539 0 10.05 4.5 10.05 10.79c0 5.129-4.176 9.32-9.32 9.32c-2.029 0-4.059-.3164-5.852-.9414c-12.33-4.137-23.11-9.32-32.54-15.19C258.3 340.3 272.1 339.5 272.4 339.5z"/>
</symbol>
<symbol id="icon-file" fill="currentColor" stroke="none" viewBox="0 0 384 512">
<!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z"/>
</symbol>
<symbol id="icon-sigma" fill="currentColor" stroke="none" viewBox="0 0 384 512">
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M335.1 136l.0005-56H83.59l165 158.7C253.3 243.2 255.1 249.5 255.1 256s-2.656 12.78-7.375 17.31L83.59 432h252.4l-.0005-56c0-13.25 10.75-24 24-24C373.2 352 384 362.8 384 376v80c0 13.25-10.75 24-24 24H23.99c-9.782 0-18.59-5.938-22.25-15.03s-1.438-19.47 5.625-26.28L197.4 256L7.364 73.31C.3015 66.5-1.917 56.13 1.739 47.03S14.21 32 23.99 32h336C373.2 32 384 42.75 384 56v80C384 149.3 373.2 160 359.1 160C346.7 160 335.1 149.3 335.1 136z"/>
</symbol>
<symbol id="icon-percent" fill="currentColor" stroke="none" viewBox="0 0 384 512">
<!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. -->
<path d="M376.1 71.03c-9.375-9.375-24.56-9.375-33.94 0l-336 336c-9.375 9.375-9.375 24.56 0 33.94C11.72 445.7 17.84 448 24 448s12.28-2.344 16.97-7.031l336-336C386.3 95.59 386.3 80.41 376.1 71.03zM64 176c26.51 0 48-21.49 48-48S90.51 80 64 80C37.49 80 16 101.5 16 128S37.49 176 64 176zM320 336c-26.51 0-48 21.49-48 48s21.49 48 48 48c26.51 0 48-21.49 48-48S346.5 336 320 336z"/>
</symbol>
<symbol id="icon-eye" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</symbol>
<symbol id="icon-profile" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M7.864 4.243A7.5 7.5 0 0119.5 10.5c0 2.92-.556 5.709-1.568 8.268M5.742 6.364A7.465 7.465 0 004.5 10.5a7.464 7.464 0 01-1.15 3.993m1.989 3.559A11.209 11.209 0 008.25 10.5a3.75 3.75 0 117.5 0c0 .527-.021 1.049-.064 1.565M12 10.5a14.94 14.94 0 01-3.6 9.75m6.633-4.596a18.666 18.666 0 01-2.485 5.33" />
</symbol>
<symbol id="icon-chart" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6" />
</symbol>
<symbol id="icon-info" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z" />
</symbol>
<symbol id="icon-star" fill="currentColor" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z" />
</symbol>
<symbol id="icon-cancel" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</symbol>
<symbol id="icon-bell" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" />
</symbol>
<symbol id="icon-folder" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24">
<path d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" stroke-linecap="round" stroke-linejoin="round"/>
</symbol>
<symbol id="icon-power" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M5.636 5.636a9 9 0 1 0 12.728 0M12 3v9" />
</symbol>
<symbol id="icon-no-symbol" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 0 0 5.636 5.636m12.728 12.728A9 9 0 0 1 5.636 5.636m12.728 12.728L5.636 5.636" />
</symbol>
<symbol id="icon-bus" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" viewBox="0 0 24 24" stroke="currentColor" fill="none">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M6 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M18 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
<path d="M4 17h-2v-11a1 1 0 0 1 1 -1h14a5 7 0 0 1 5 7v5h-2m-4 0h-8" />
<path d="M16 5l1.5 7l4.5 0" />
<path d="M2 10l15 0" />
<path d="M7 5l0 5" />
<path d="M12 5l0 5" />
</symbol>
<symbol id="icon-ski" fill="currentColor" stroke="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M380.7 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM2.7 268.9c6.1-11.8 20.6-16.3 32.4-10.2L239.8 365l49.6-74.5-82.7-87.9c-9.5-10.1-14.4-22.4-15.1-34.9l87.7 42 49.4 52.5c12.8 13.6 14.5 34.1 4.2 49.6l-50.2 75.4 135.8 70.5c13.6 7.1 29.8 7.2 43.6 .3l15.2-7.6c11.9-5.9 26.3-1.1 32.2 10.7s1.1 26.3-10.7 32.2l-15.2 7.6c-27.5 13.7-59.9 13.5-87.2-.7L12.9 301.3C1.2 295.2-3.4 280.7 2.7 268.9zM118.9 65.6L137 74.2l8.7-17.4c4-7.9 13.6-11.1 21.5-7.2s11.1 13.6 7.2 21.5l-8.5 16.9 55.5 26.6c1.7-.9 3.5-1.7 5.4-2.5l80.9-32.4c32.4-13 68.6 6.5 75.6 40.7l12.3 59.7 62.9 30.1c12 5.7 17 20 11.3 32s-20 17-32 11.3l-54.2-25.9c-1-.3-1.9-.6-2.8-1l-229.1-110-9.2 18.4c-4 7.9-13.6 11.1-21.5 7.2s-11.1-13.6-7.2-21.5l9-18-17.6-8.4c-8-3.8-11.3-13.4-7.5-21.3s13.4-11.3 21.3-7.5zm217.3 64.7c-1-4.9-6.2-7.7-10.8-5.8l-45.7 18.3 65.5 31.5-9-43.9z"/>
</symbol>
<symbol id="icon-snowboard" fill="currentColor" stroke="nonw" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M204.3 3c11.6-6.4 26.2-2.3 32.6 9.3l31.9 57.4c1.3 2.3 3.6 3.8 6.2 4.1l33.8 3.4c24.1 2.4 46.9 12 65.4 27.6L503.5 213.6c10.1 8.5 11.4 23.7 2.9 33.8s-23.7 11.4-33.8 2.9l-68.2-57.5-82.3 43.9 24.7 18.9c24.9 19 34.6 51.9 24.1 81.4l-28.2 79c-1.4 3.8-3.6 7-6.3 9.6l93.3 35.7c4.6 1.8 9.4 2.6 14.3 2.6H472c13.3 0 24 10.7 24 24s-10.7 24-24 24H443.8c-10.8 0-21.4-2-31.5-5.8L60.1 371.3c-11.5-4.4-22-11.2-30.8-20L7 329c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.4 22.4c4 4 8.7 7.1 14 9.1l19.4 7.4c-2.9-11.4 2.9-23.4 14-28.1L192 272l0-68.2c0-21.2 12-40.6 31-50.1L284.4 123l-14.1-1.4c-18.3-1.8-34.5-12.5-43.4-28.5L195 35.7c-6.4-11.6-2.3-26.2 9.3-32.6zm91.8 407.2c-.3-3.4 .1-6.9 1.3-10.3l28.2-79c3.5-9.8 .3-20.8-8-27.1L240 234.4l0 42.9c0 16.1-9.7 30.7-24.6 36.9L134 348.2l162.1 62.1zM259.6 189l20.5 15.7 84.6-45.1-17.2-14.5L259.6 189zM384 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0z"/>
</symbol>
<symbol id="icon-hourglass" fill="currentColor" stroke="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
<!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M24 0C10.7 0 0 10.7 0 24S10.7 48 24 48h8V67c0 40.3 16 79 44.5 107.5L158.1 256 76.5 337.5C48 366 32 404.7 32 445v19H24c-13.3 0-24 10.7-24 24s10.7 24 24 24H360c13.3 0 24-10.7 24-24s-10.7-24-24-24h-8V445c0-40.3-16-79-44.5-107.5L225.9 256l81.5-81.5C336 146 352 107.3 352 67V48h8c13.3 0 24-10.7 24-24s-10.7-24-24-24H24zM192 289.9l81.5 81.5C293 391 304 417.4 304 445v19H80V445c0-27.6 11-54 30.5-73.5L192 289.9zm0-67.9l-81.5-81.5C91 121 80 94.6 80 67V48H304V67c0 27.6-11 54-30.5 73.5L192 222.1z"/>
</symbol>
<symbol id="icon-table" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M3.375 19.5h17.25m-17.25 0a1.125 1.125 0 0 1-1.125-1.125M3.375 19.5h7.5c.621 0 1.125-.504 1.125-1.125m-9.75 0V5.625m0 12.75v-1.5c0-.621.504-1.125 1.125-1.125m18.375 2.625V5.625m0 12.75c0 .621-.504 1.125-1.125 1.125m1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125m0 3.75h-7.5A1.125 1.125 0 0 1 12 18.375m9.75-12.75c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125m19.5 0v1.5c0 .621-.504 1.125-1.125 1.125M2.25 5.625v1.5c0 .621.504 1.125 1.125 1.125m0 0h17.25m-17.25 0h7.5c.621 0 1.125.504 1.125 1.125M3.375 8.25c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125m17.25-3.75h-7.5c-.621 0-1.125.504-1.125 1.125m8.625-1.125c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125M12 10.875v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 10.875c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125M13.125 12h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125M20.625 12c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5M12 14.625v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 14.625c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125m0 1.5v-1.5m0 0c0-.621.504-1.125 1.125-1.125m0 0h7.5" /></symbol>
<symbol id="icon-dots" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 6.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 12.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 18.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Z" /></symbol>
<symbol id="icon-feedback" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M7.5 8.25h9m-9 3H12m-9.75 1.51c0 1.6 1.123 2.994 2.707 3.227 1.129.166 2.27.293 3.423.379.35.026.67.21.865.501L12 21l2.755-4.133a1.14 1.14 0 01.865-.501 48.172 48.172 0 003.423-.379c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0012 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018z" /></symbol>
<symbol id="icon-login" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15m3 0l3-3m0 0l-3-3m3 3H9" /></symbol>
<symbol id="icon-logout" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 9V5.25A2.25 2.25 0 0013.5 3h-6a2.25 2.25 0 00-2.25 2.25v13.5A2.25 2.25 0 007.5 21h6a2.25 2.25 0 002.25-2.25V15M12 9l-3 3m0 0l3 3m-3-3h12.75" /></symbol>
<symbol id="icon-alert" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z" /></symbol>
<symbol id="icon-close" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /></symbol>
<symbol id="icon-back" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M9 15L3 9m0 0l6-6M3 9h12a6 6 0 010 12h-3" /></symbol>
<symbol id="icon-list" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M8.25 6.75h12M8.25 12h12m-12 5.25h12M3.75 6.75h.007v.008H3.75V6.75zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zM3.75 12h.007v.008H3.75V12zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0zm-.375 5.25h.007v.008H3.75v-.008zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z" /></symbol>
<symbol id="icon-menu" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /></symbol>
<symbol id="icon-edit" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10" /></symbol>
<symbol id="icon-plus" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15" /></symbol>
<symbol id="icon-minus" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" /></symbol>
<symbol id="icon-search" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" /></symbol>
<symbol id="icon-user" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z" /></symbol>
<symbol id="icon-users" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M15 19.128a9.38 9.38 0 002.625.372 9.337 9.337 0 004.121-.952 4.125 4.125 0 00-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 018.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0111.964-3.07M12 6.375a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zm8.25 2.25a2.625 2.625 0 11-5.25 0 2.625 2.625 0 015.25 0z" /></symbol>
<symbol id="icon-delete" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" /></symbol>
<symbol id="icon-check" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5" /></symbol>
<symbol id="icon-upload" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor"><path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"/></symbol>
<symbol id="icon-download" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3" /></symbol>
<symbol id="icon-sort" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" /></symbol>
<symbol id="icon-arrow-left" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15m0 0l6.75 6.75M4.5 12l6.75-6.75" /></symbol>
<symbol id="icon-chevron-down" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="m19.5 8.25-7.5 7.5-7.5-7.5" /></symbol>
<symbol id="icon-arrow-right" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M4.5 12h15m0 0l-6.75-6.75M19.5 12l-6.75 6.75" /></symbol>
<symbol id="icon-document" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" /></symbol>
<symbol id="icon-filter" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z" /></symbol>
<symbol id="icon-refresh" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99" /></symbol>
<symbol id="icon-settings" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 011.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 01-1.449.12l-.738-.527c-.35-.25-.806-.272-1.203-.107-.397.165-.71.505-.781.929l-.149.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 01-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.505-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.107-1.204l-.527-.738a1.125 1.125 0 01.12-1.45l.773-.773a1.125 1.125 0 011.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894z" /><path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" /></symbol>
<symbol id="icon-at" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" d="M16.5 12a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zm0 0c0 1.657 1.007 3 2.25 3S21 13.657 21 12a9 9 0 10-2.636 6.364M16.5 12V8.25" /></symbol>
<symbol id="icon-mail" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75" /></symbol>
<symbol id="icon-house" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M8.25 21v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21m0 0h4.5V3.545M12.75 21h7.5V10.75M2.25 21h1.5m18 0h-18M2.25 9l4.5-1.636M18.75 3l-1.5.545m0 6.205l3 1m1.5.5l-1.5-.5M6.75 7.364V3h-3v18m3-13.636l10.5-3.819" /></symbol>
<symbol id="icon-phone" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M2.25 6.75c0 8.284 6.716 15 15 15h2.25a2.25 2.25 0 002.25-2.25v-1.372c0-.516-.351-.966-.852-1.091l-4.423-1.106c-.44-.11-.902.055-1.173.417l-.97 1.293c-.282.376-.769.542-1.21.38a12.035 12.035 0 01-7.143-7.143c-.162-.441.004-.928.38-1.21l1.293-.97c.363-.271.527-.734.417-1.173L6.963 3.102a1.125 1.125 0 00-1.091-.852H4.5A2.25 2.25 0 002.25 4.5v2.25z" /></symbol>
<symbol id="icon-mobile" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M10.5 1.5H8.25A2.25 2.25 0 0 0 6 3.75v16.5a2.25 2.25 0 0 0 2.25 2.25h7.5A2.25 2.25 0 0 0 18 20.25V3.75a2.25 2.25 0 0 0-2.25-2.25H13.5m-3 0V3h3V1.5m-3 0h3m-3 18.75h3" /></symbol>
<symbol id="icon-calendar" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z" /></symbol>
<symbol id="icon-hand" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M10.05 4.575a1.575 1.575 0 10-3.15 0v3m3.15-3v-1.5a1.575 1.575 0 013.15 0v1.5m-3.15 0l.075 5.925m3.075.75V4.575m0 0a1.575 1.575 0 013.15 0V15M6.9 7.575a1.575 1.575 0 10-3.15 0v8.175a6.75 6.75 0 006.75 6.75h2.018a5.25 5.25 0 003.712-1.538l1.732-1.732a5.25 5.25 0 001.538-3.712l.003-2.024a.668.668 0 01.198-.471 1.575 1.575 0 10-2.228-2.228 3.818 3.818 0 00-1.12 2.687M6.9 7.575V12m6.27 4.318A4.49 4.49 0 0116.35 15m.002 0h-.002" /></symbol>
<symbol id="icon-copy" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6" /></symbol>
<symbol id="icon-photo" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 001.5-1.5V6a1.5 1.5 0 00-1.5-1.5H3.75A1.5 1.5 0 002.25 6v12a1.5 1.5 0 001.5 1.5zm10.5-11.25h.008v.008h-.008V8.25zm.375 0a.375.375 0 11-.75 0 .375.375 0 01.75 0z" /></symbol>
<symbol id="icon-print" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path d="M6.72 13.829c-.24.03-.48.062-.72.096m.72-.096a42.415 42.415 0 0110.56 0m-10.56 0L6.34 18m10.94-4.171c.24.03.48.062.72.096m-.72-.096L17.66 18m0 0l.229 2.523a1.125 1.125 0 01-1.12 1.227H7.231c-.662 0-1.18-.568-1.12-1.227L6.34 18m11.318 0h1.091A2.25 2.25 0 0021 15.75V9.456c0-1.081-.768-2.015-1.837-2.175a48.055 48.055 0 00-1.913-.247M6.34 18H5.25A2.25 2.25 0 013 15.75V9.456c0-1.081.768-2.015 1.837-2.175a48.041 48.041 0 011.913-.247m10.5 0a48.536 48.536 0 00-10.5 0m10.5 0V3.375c0-.621-.504-1.125-1.125-1.125h-8.25c-.621 0-1.125.504-1.125 1.125v3.659M18 10.5h.008v.008H18V10.5zm-3 0h.008v.008H15V10.5z" stroke-linecap="round" stroke-linejoin="round"/></symbol>
<symbol id="icon-locked" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" /></symbol>
<symbol id="icon-unlocked" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M13.5 10.5V6.75a4.5 4.5 0 119 0v3.75M3.75 21.75h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H3.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z" /></symbol>
<symbol id="icon-external-link" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M10 6V8H5V19H16V14H18V20C18 20.5523 17.5523 21 17 21H4C3.44772 21 3 20.5523 3 20V7C3 6.44772 3.44772 6 4 6H10ZM21 3V11H19L18.9999 6.413L11.2071 14.2071L9.79289 12.7929L17.5849 5H13V3H21Z"/></symbol>
<symbol id="icon-cookie" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M21.1634 10.9711C21.5132 10.8204 21.9579 11.0073 21.9811 11.3875C22.1494 14.1467 21.1794 16.9625 19.071 19.0709C15.1657 22.976 8.83405 22.9761 4.92886 19.0709C1.02367 15.1657 1.02377 8.83405 4.92885 4.9288C7.03704 2.82061 9.8525 1.85015 12.6115 2.01806C12.9916 2.04119 13.1787 2.48598 13.028 2.83576C12.4774 4.11367 12.7239 5.65275 13.7677 6.69657C14.3307 7.25963 15.038 7.58971 15.7706 7.68848C16.0483 7.72594 16.2738 7.95144 16.3113 8.2292C16.4101 8.96178 16.7402 9.66905 17.3032 10.2321C18.347 11.2759 19.8857 11.5218 21.1634 10.9711ZM19.7845 13.8397C19.8558 13.5362 19.6123 13.2603 19.3017 13.2337C18.0569 13.1271 16.8417 12.599 15.889 11.6463C15.3166 11.0739 14.8979 10.4061 14.6309 9.69455C14.5744 9.54422 14.4556 9.42534 14.3052 9.36892C13.5936 9.10186 12.9259 8.68322 12.3535 8.11078C11.4005 7.15778 10.8715 5.94208 10.7648 4.69683C10.7381 4.38618 10.4621 4.14264 10.1586 4.2141C8.76039 4.54327 7.43341 5.25267 6.34306 6.34301C3.21903 9.46721 3.21893 14.5326 6.34307 17.6567C9.46721 20.7809 14.5326 20.7808 17.6568 17.6567C18.7474 16.566 19.4557 15.2384 19.7845 13.8397ZM9.8786 14.1212C10.4644 14.707 10.4644 15.6567 9.8786 16.2425C9.29281 16.8283 8.34307 16.8283 7.75728 16.2425C7.17149 15.6567 7.17149 14.707 7.75728 14.1212C8.34306 13.5354 9.29281 13.5354 9.8786 14.1212ZM10.2321 8.11078C10.8179 8.69657 10.8179 9.64631 10.2321 10.2321C9.64636 10.8179 8.69661 10.8179 8.11083 10.2321C7.52504 9.64631 7.52504 8.69656 8.11083 8.11078C8.69661 7.52499 9.64636 7.52499 10.2321 8.11078ZM15.889 13.7676C16.4748 14.3534 16.4748 15.3032 15.889 15.889C15.3032 16.4747 14.3535 16.4747 13.7677 15.889C13.1819 15.3032 13.1819 14.3534 13.7677 13.7676C14.3535 13.1818 15.3032 13.1818 15.889 13.7676Z"/></symbol>
<symbol id="icon-mask" fill="currentColor" stroke="none" viewBox="0 0 576 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M288 64C39.52 64 0 182.1 0 273.5C0 379.5 78.8 448 176 448c27.33 0 51.21-6.516 66.11-36.79l19.93-40.5C268.3 358.6 278.1 352.4 288 352.1c9.9 .3711 19.7 6.501 25.97 18.63l19.93 40.5C348.8 441.5 372.7 448 400 448c97.2 0 176-68.51 176-174.5C576 182.1 536.5 64 288 64zM400 400c-18.12 0-19.56-2.924-23.04-9.986l-20.35-41.33c-13.87-26.86-38.85-43.53-66.82-44.57L288 304L286.2 304.1c-27.96 1.049-52.94 17.71-67.24 45.41l-19.93 40.49C195.6 397.1 194.1 400 176 400c-75.36 0-128-52.04-128-126.5C48 229.3 48 112 288 112s240 117.3 240 161.5C528 347.1 475.4 400 400 400zM160 192C124.7 192 96 220.7 96 256s28.65 64 64 64c35.35 0 64-28.65 64-64S195.3 192 160 192zM416 192c-35.35 0-64 28.65-64 64s28.65 64 64 64c35.35 0 64-28.65 64-64S451.3 192 416 192z"/></symbol>
<symbol id="icon-excel" fill="currentColor" stroke="none" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448zM229.1 233.3L192 280.9L154.9 233.3C146.8 222.8 131.8 220.9 121.3 229.1C110.8 237.2 108.9 252.3 117.1 262.8L161.6 320l-44.53 57.25c-8.156 10.47-6.25 25.56 4.188 33.69C125.7 414.3 130.8 416 135.1 416c7.156 0 14.25-3.188 18.97-9.25L192 359.1l37.06 47.65C233.8 412.8 240.9 416 248 416c5.125 0 10.31-1.656 14.72-5.062c10.44-8.125 12.34-23.22 4.188-33.69L222.4 320l44.53-57.25c8.156-10.47 6.25-25.56-4.188-33.69C252.2 220.9 237.2 222.8 229.1 233.3z"/></symbol>
<symbol id="icon-pdf" fill="currentColor" stroke="none" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448zM202 286.1c.877-2.688 1.74-5.398 2.582-8.145c1.434-5.762 7.488-31.54 7.488-52.47C212.1 207 197.1 192 178.6 192C160.1 192 145.1 207 145.1 225.5c0 .2969 .1641 28.81 13.85 62.3c-7.035 19.36-15.57 38.8-25.41 57.93c-21.49 10.11-39.24 22.23-52.8 36.07c-6.234 6.438-9.367 14.74-9.367 24.72c0 18.45 15.01 33.46 33.46 33.46c10.8 0 20.98-5.227 27.22-13.98c7.322-10.28 18.38-26.9 30.47-48.95c15.8-6.352 33.88-11.72 53.88-16c13.55 9.578 28.9 17.29 45.71 22.95c4.527 1.551 9.402 2.348 14.43 2.348c20.26 0 36.13-16.19 36.13-36.86c0-20.33-16.54-36.87-36.87-36.87h-3.705c-2.727 .125-20.51 1.141-45.37 5.367C216.9 308.9 208.6 298.3 202 286.1zM110.2 410.4c-3.273 4.688-12.03 2.777-12.03-5.312c0-1.754 .6289-3.43 1.729-4.555c9.02-9.219 19.94-17.05 31.85-23.72C122.3 393.1 114.3 404.7 110.2 410.4zM178.6 218.8c3.693 0 6.703 3.008 6.703 6.703c0 15.21-4.109 34.84-5.746 42.1C172.1 245 171.9 227.2 171.9 225.5C171.9 221.8 174.9 218.8 178.6 218.8zM162.3 348.3c6.611-13.48 13.22-28.46 19.38-44.7c6.389 10.92 14.56 21.86 24.96 31.97C192.6 338.8 177.4 342.9 162.3 348.3zM272.4 339.5h3.352c5.539 0 10.05 4.5 10.05 10.79c0 5.129-4.176 9.32-9.32 9.32c-2.029 0-4.059-.3164-5.852-.9414c-12.33-4.137-23.11-9.32-32.54-15.19C258.3 340.3 272.1 339.5 272.4 339.5z"/></symbol>
<symbol id="icon-file" fill="currentColor" stroke="none" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M365.3 93.38l-74.63-74.64C278.6 6.743 262.3 0 245.4 0L64-.0001c-35.35 0-64 28.65-64 64l.0065 384c0 35.35 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM320 464H64.02c-8.836 0-15.1-7.163-16-15.1L48 64.13c-.0004-8.837 7.163-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1v288C336 456.8 328.8 464 320 464z"/></symbol>
<symbol id="icon-sigma" fill="currentColor" stroke="none" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M335.1 136l.0005-56H83.59l165 158.7C253.3 243.2 255.1 249.5 255.1 256s-2.656 12.78-7.375 17.31L83.59 432h252.4l-.0005-56c0-13.25 10.75-24 24-24C373.2 352 384 362.8 384 376v80c0 13.25-10.75 24-24 24H23.99c-9.782 0-18.59-5.938-22.25-15.03s-1.438-19.47 5.625-26.28L197.4 256L7.364 73.31C.3015 66.5-1.917 56.13 1.739 47.03S14.21 32 23.99 32h336C373.2 32 384 42.75 384 56v80C384 149.3 373.2 160 359.1 160C346.7 160 335.1 149.3 335.1 136z"/></symbol>
<symbol id="icon-percent" fill="currentColor" stroke="none" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M376.1 71.03c-9.375-9.375-24.56-9.375-33.94 0l-336 336c-9.375 9.375-9.375 24.56 0 33.94C11.72 445.7 17.84 448 24 448s12.28-2.344 16.97-7.031l336-336C386.3 95.59 386.3 80.41 376.1 71.03zM64 176c26.51 0 48-21.49 48-48S90.51 80 64 80C37.49 80 16 101.5 16 128S37.49 176 64 176zM320 336c-26.51 0-48 21.49-48 48s21.49 48 48 48c26.51 0 48-21.49 48-48S346.5 336 320 336z"/></symbol>
<symbol id="icon-chair" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M288 16c26.5 0 48 21.5 48 48V256h16V64c0-35.3-28.7-64-64-64H160C124.7 0 96 28.7 96 64V256h16V64c0-26.5 21.5-48 48-48H288zM48 168c0-4.4-3.6-8-8-8s-8 3.6-8 8v80c0 4.4 3.6 8 8 8s8-3.6 8-8V168zm368 0c0-4.4-3.6-8-8-8s-8 3.6-8 8v80c0 4.4 3.6 8 8 8s8-3.6 8-8V168zM80 304H368c6.1 0 11.6 3.4 14.3 8.8l16 32c2.5 5 2.2 10.9-.7 15.6s-8.1 7.6-13.6 7.6H224 64c-5.5 0-10.7-2.9-13.6-7.6s-3.2-10.6-.7-15.6l16-32c2.7-5.4 8.3-8.8 14.3-8.8zm152 80H384c11.1 0 21.4-5.7 27.2-15.2s6.4-21.2 1.4-31.1l-16-32C391.2 294.8 380.1 288 368 288H80c-12.1 0-23.2 6.8-28.6 17.7l-16 32c-5 9.9-4.4 21.7 1.4 31.1S52.9 384 64 384H216v64H184c-30.9 0-56 25.1-56 56c0 4.4 3.6 8 8 8s8-3.6 8-8c0-22.1 17.9-40 40-40h32v40c0 4.4 3.6 8 8 8s8-3.6 8-8V464h32c22.1 0 40 17.9 40 40c0 4.4 3.6 8 8 8s8-3.6 8-8c0-30.9-25.1-56-56-56H232V384z"/></symbol>
<symbol id="icon-eye" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z" /><path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" /></symbol>
<symbol id="icon-profile" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M7.864 4.243A7.5 7.5 0 0119.5 10.5c0 2.92-.556 5.709-1.568 8.268M5.742 6.364A7.465 7.465 0 004.5 10.5a7.464 7.464 0 01-1.15 3.993m1.989 3.559A11.209 11.209 0 008.25 10.5a3.75 3.75 0 117.5 0c0 .527-.021 1.049-.064 1.565M12 10.5a14.94 14.94 0 01-3.6 9.75m6.633-4.596a18.666 18.666 0 01-2.485 5.33" /></symbol>
<symbol id="icon-chart" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M3.75 3v11.25A2.25 2.25 0 006 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0118 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5M9 11.25v1.5M12 9v3.75m3-6v6" /></symbol>
<symbol id="icon-info" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z" /></symbol>
<symbol id="icon-star" fill="currentColor" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" d="M11.48 3.499a.562.562 0 011.04 0l2.125 5.111a.563.563 0 00.475.345l5.518.442c.499.04.701.663.321.988l-4.204 3.602a.563.563 0 00-.182.557l1.285 5.385a.562.562 0 01-.84.61l-4.725-2.885a.563.563 0 00-.586 0L6.982 20.54a.562.562 0 01-.84-.61l1.285-5.386a.562.562 0 00-.182-.557l-4.204-3.602a.563.563 0 01.321-.988l5.518-.442a.563.563 0 00.475-.345L11.48 3.5z" /></symbol>
<symbol id="icon-cancel" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z" /></symbol>
<symbol id="icon-bell" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" /></symbol>
<symbol id="icon-folder" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" stroke-linecap="round" stroke-linejoin="round"/></symbol>
<symbol id="icon-power" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M5.636 5.636a9 9 0 1 0 12.728 0M12 3v9" /></symbol>
<symbol id="icon-no-symbol" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="M18.364 18.364A9 9 0 0 0 5.636 5.636m12.728 12.728A9 9 0 0 1 5.636 5.636m12.728 12.728L5.636 5.636" /></symbol>
<symbol id="icon-draggable" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M8.5 7C9.32843 7 10 6.32843 10 5.5C10 4.67157 9.32843 4 8.5 4C7.67157 4 7 4.67157 7 5.5C7 6.32843 7.67157 7 8.5 7ZM8.5 13.5C9.32843 13.5 10 12.8284 10 12C10 11.1716 9.32843 10.5 8.5 10.5C7.67157 10.5 7 11.1716 7 12C7 12.8284 7.67157 13.5 8.5 13.5ZM10 18.5C10 19.3284 9.32843 20 8.5 20C7.67157 20 7 19.3284 7 18.5C7 17.6716 7.67157 17 8.5 17C9.32843 17 10 17.6716 10 18.5ZM15.5 7C16.3284 7 17 6.32843 17 5.5C17 4.67157 16.3284 4 15.5 4C14.6716 4 14 4.67157 14 5.5C14 6.32843 14.6716 7 15.5 7ZM17 12C17 12.8284 16.3284 13.5 15.5 13.5C14.6716 13.5 14 12.8284 14 12C14 11.1716 14.6716 10.5 15.5 10.5C16.3284 10.5 17 11.1716 17 12ZM15.5 20C16.3284 20 17 19.3284 17 18.5C17 17.6716 16.3284 17 15.5 17C14.6716 17 14 17.6716 14 18.5C14 19.3284 14.6716 20 15.5 20Z"/></symbol>
<symbol id="icon-discount" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M10.0544 2.0941C11.1756 1.13856 12.8248 1.13855 13.9461 2.09411L15.2941 3.24286C15.4542 3.37935 15.6533 3.46182 15.8631 3.47856L17.6286 3.61945C19.0971 3.73663 20.2633 4.9028 20.3805 6.37131L20.5214 8.13679C20.5381 8.34654 20.6205 8.54568 20.757 8.70585L21.9058 10.0539C22.8614 11.1751 22.8614 12.8243 21.9058 13.9456L20.757 15.2935C20.6206 15.4537 20.538 15.6529 20.5213 15.8627L20.3805 17.6281C20.2633 19.0967 19.0971 20.2628 17.6286 20.3799L15.8631 20.5208C15.6533 20.5376 15.4542 20.6201 15.2941 20.7566L13.9461 21.9053C12.8248 22.8609 11.1756 22.8608 10.0543 21.9053L8.70631 20.7566C8.54615 20.6201 8.34705 20.5376 8.1373 20.5209L6.37184 20.3799C4.9033 20.2627 3.73716 19.0966 3.61997 17.6281L3.47906 15.8627C3.46232 15.6529 3.37983 15.4538 3.24336 15.2936L2.0946 13.9455C1.13905 12.8243 1.13904 11.1752 2.09458 10.0539L3.24334 8.70589C3.37983 8.54573 3.46234 8.34654 3.47907 8.13678L3.61996 6.3713C3.73714 4.90278 4.90327 3.73665 6.3718 3.61946L8.13729 3.47857C8.34705 3.46183 8.54619 3.37935 8.70636 3.24286L10.0544 2.0941ZM12.6488 3.61632C12.2751 3.29782 11.7253 3.29781 11.3516 3.61632L10.0036 4.76509C9.5231 5.17456 8.92568 5.42201 8.29637 5.47223L6.5309 5.61312C6.04139 5.65219 5.65268 6.04089 5.61362 6.53041L5.47272 8.29593C5.4225 8.92521 5.17505 9.52259 4.76559 10.0031L3.61683 11.3511C3.29832 11.7248 3.29831 12.2746 3.61683 12.6483L4.76559 13.9963C5.17506 14.4768 5.4225 15.0743 5.47275 15.7035L5.61363 17.469C5.65268 17.9585 6.04139 18.3473 6.53092 18.3863L8.29636 18.5272C8.92563 18.5774 9.5231 18.8249 10.0036 19.2344L11.3516 20.3831C11.7254 20.7016 12.2751 20.7016 12.6488 20.3831L13.9969 19.2343C14.4773 18.8249 15.0747 18.5774 15.704 18.5272L17.4695 18.3863C17.959 18.3472 18.3478 17.9585 18.3868 17.469L18.5277 15.7035C18.5779 15.0742 18.8253 14.4768 19.2349 13.9964L20.3836 12.6483C20.7022 12.2746 20.7021 11.7249 20.3836 11.3511L19.2348 10.0031C18.8253 9.52259 18.5779 8.92519 18.5277 8.2959L18.3868 6.53041C18.3478 6.0409 17.959 5.65219 17.4695 5.61312L15.704 5.47224C15.0748 5.42203 14.4773 5.17455 13.9968 4.76508L12.6488 3.61632ZM14.8284 7.75718L16.2426 9.1714L9.17154 16.2425L7.75733 14.8282L14.8284 7.75718ZM10.2322 10.232C9.64641 10.8178 8.69667 10.8178 8.11088 10.232C7.52509 9.6463 7.52509 8.69652 8.11088 8.11073C8.69667 7.52494 9.64641 7.52494 10.2322 8.11073C10.818 8.69652 10.818 9.6463 10.2322 10.232ZM13.7677 15.8889C14.3535 16.4747 15.3032 16.4747 15.889 15.8889C16.4748 15.3031 16.4748 14.3534 15.889 13.7676C15.3032 13.1818 14.3535 13.1818 13.7677 13.7676C13.1819 14.3534 13.1819 15.3031 13.7677 15.8889Z"/></symbol>
<symbol id="icon-stack" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M20.0833 15.1999L21.2854 15.9212C21.5221 16.0633 21.5989 16.3704 21.4569 16.6072C21.4146 16.6776 21.3557 16.7365 21.2854 16.7787L12.5144 22.0412C12.1977 22.2313 11.8021 22.2313 11.4854 22.0412L2.71451 16.7787C2.47772 16.6366 2.40093 16.3295 2.54301 16.0927C2.58523 16.0223 2.64413 15.9634 2.71451 15.9212L3.9166 15.1999L11.9999 20.0499L20.0833 15.1999ZM20.0833 10.4999L21.2854 11.2212C21.5221 11.3633 21.5989 11.6704 21.4569 11.9072C21.4146 11.9776 21.3557 12.0365 21.2854 12.0787L11.9999 17.6499L2.71451 12.0787C2.47772 11.9366 2.40093 11.6295 2.54301 11.3927C2.58523 11.3223 2.64413 11.2634 2.71451 11.2212L3.9166 10.4999L11.9999 15.3499L20.0833 10.4999ZM12.5144 1.30864L21.2854 6.5712C21.5221 6.71327 21.5989 7.0204 21.4569 7.25719C21.4146 7.32757 21.3557 7.38647 21.2854 7.42869L11.9999 12.9999L2.71451 7.42869C2.47772 7.28662 2.40093 6.97949 2.54301 6.7427C2.58523 6.67232 2.64413 6.61343 2.71451 6.5712L11.4854 1.30864C11.8021 1.11864 12.1977 1.11864 12.5144 1.30864ZM11.9999 3.33233L5.88723 6.99995L11.9999 10.6676L18.1126 6.99995L11.9999 3.33233Z"/></symbol>
<symbol id="icon-bus" xmlns="http://www.w3.org/2000/svg" stroke-width="1.5" viewBox="0 0 24 24" stroke="currentColor" fill="none"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M6 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /><path d="M18 17m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" /><path d="M4 17h-2v-11a1 1 0 0 1 1 -1h14a5 7 0 0 1 5 7v5h-2m-4 0h-8" /><path d="M16 5l1.5 7l4.5 0" /><path d="M2 10l15 0" /><path d="M7 5l0 5" /><path d="M12 5l0 5" /></symbol>
<symbol id="icon-ski" fill="currentColor" stroke="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M380.7 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zM2.7 268.9c6.1-11.8 20.6-16.3 32.4-10.2L239.8 365l49.6-74.5-82.7-87.9c-9.5-10.1-14.4-22.4-15.1-34.9l87.7 42 49.4 52.5c12.8 13.6 14.5 34.1 4.2 49.6l-50.2 75.4 135.8 70.5c13.6 7.1 29.8 7.2 43.6 .3l15.2-7.6c11.9-5.9 26.3-1.1 32.2 10.7s1.1 26.3-10.7 32.2l-15.2 7.6c-27.5 13.7-59.9 13.5-87.2-.7L12.9 301.3C1.2 295.2-3.4 280.7 2.7 268.9zM118.9 65.6L137 74.2l8.7-17.4c4-7.9 13.6-11.1 21.5-7.2s11.1 13.6 7.2 21.5l-8.5 16.9 55.5 26.6c1.7-.9 3.5-1.7 5.4-2.5l80.9-32.4c32.4-13 68.6 6.5 75.6 40.7l12.3 59.7 62.9 30.1c12 5.7 17 20 11.3 32s-20 17-32 11.3l-54.2-25.9c-1-.3-1.9-.6-2.8-1l-229.1-110-9.2 18.4c-4 7.9-13.6 11.1-21.5 7.2s-11.1-13.6-7.2-21.5l9-18-17.6-8.4c-8-3.8-11.3-13.4-7.5-21.3s13.4-11.3 21.3-7.5zm217.3 64.7c-1-4.9-6.2-7.7-10.8-5.8l-45.7 18.3 65.5 31.5-9-43.9z"/></symbol>
<symbol id="icon-snowboard" fill="currentColor" stroke="nonw" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M204.3 3c11.6-6.4 26.2-2.3 32.6 9.3l31.9 57.4c1.3 2.3 3.6 3.8 6.2 4.1l33.8 3.4c24.1 2.4 46.9 12 65.4 27.6L503.5 213.6c10.1 8.5 11.4 23.7 2.9 33.8s-23.7 11.4-33.8 2.9l-68.2-57.5-82.3 43.9 24.7 18.9c24.9 19 34.6 51.9 24.1 81.4l-28.2 79c-1.4 3.8-3.6 7-6.3 9.6l93.3 35.7c4.6 1.8 9.4 2.6 14.3 2.6H472c13.3 0 24 10.7 24 24s-10.7 24-24 24H443.8c-10.8 0-21.4-2-31.5-5.8L60.1 371.3c-11.5-4.4-22-11.2-30.8-20L7 329c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l22.4 22.4c4 4 8.7 7.1 14 9.1l19.4 7.4c-2.9-11.4 2.9-23.4 14-28.1L192 272l0-68.2c0-21.2 12-40.6 31-50.1L284.4 123l-14.1-1.4c-18.3-1.8-34.5-12.5-43.4-28.5L195 35.7c-6.4-11.6-2.3-26.2 9.3-32.6zm91.8 407.2c-.3-3.4 .1-6.9 1.3-10.3l28.2-79c3.5-9.8 .3-20.8-8-27.1L240 234.4l0 42.9c0 16.1-9.7 30.7-24.6 36.9L134 348.2l162.1 62.1zM259.6 189l20.5 15.7 84.6-45.1-17.2-14.5L259.6 189zM384 48a48 48 0 1 1 96 0 48 48 0 1 1 -96 0z"/></symbol>
<symbol id="icon-hourglass" fill="currentColor" stroke="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --><path d="M24 0C10.7 0 0 10.7 0 24S10.7 48 24 48h8V67c0 40.3 16 79 44.5 107.5L158.1 256 76.5 337.5C48 366 32 404.7 32 445v19H24c-13.3 0-24 10.7-24 24s10.7 24 24 24H360c13.3 0 24-10.7 24-24s-10.7-24-24-24h-8V445c0-40.3-16-79-44.5-107.5L225.9 256l81.5-81.5C336 146 352 107.3 352 67V48h8c13.3 0 24-10.7 24-24s-10.7-24-24-24H24zM192 289.9l81.5 81.5C293 391 304 417.4 304 445v19H80V445c0-27.6 11-54 30.5-73.5L192 289.9zm0-67.9l-81.5-81.5C91 121 80 94.6 80 67V48H304V67c0 27.6-11 54-30.5 73.5L192 222.1z"/></symbol>
<symbol id="icon-car" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><circle cx="64" cy="176" r="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><circle cx="192" cy="176" r="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="88" y1="176" x2="168" y2="176" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M216,176h24a8,8,0,0,0,8-8V128a8,8,0,0,0-8-8H208L162.34,74.34A8,8,0,0,0,156.69,72H44.28a8,8,0,0,0-6.65,3.56L8,120v48a8,8,0,0,0,8,8H40" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="208" y1="120" x2="8" y2="120" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-flag-a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480"><g fill-rule="evenodd"><path fill="#fff" d="M640 480H0V0h640z"/><path fill="#ed2939" d="M640 480H0V320h640zm0-319.9H0V.1h640z"/></g></symbol>
<symbol id="icon-flag-ch" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480"><g fill-rule="evenodd" stroke-width="1pt"><path fill="#d52b1e" d="M0 0h640v480H0z"/><g fill="#fff"><path d="M170 195h300v90H170z"/><path d="M275 90h90v300h-90z"/></g></g></symbol>
<symbol id="icon-flag-d" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480"><path fill="#ffce00" d="M0 320h640v160H0z"/><path d="M0 0h640v160H0z"/><path fill="#d00" d="M0 160h640v160H0z"/></symbol>
<symbol id="icon-flag-f" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480"><g fill-rule="evenodd" stroke-width="1pt"><path fill="#fff" d="M0 0h640v480H0z"/><path fill="#00267f" d="M0 0h213.3v480H0z"/><path fill="#f31830" d="M426.7 0H640v480H426.7z"/></g></symbol>
<symbol id="icon-flag-i" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480"><g fill-rule="evenodd" stroke-width="1pt"><path fill="#fff" d="M0 0h640v480H0z"/><path fill="#009246" d="M0 0h213.3v480H0z"/><path fill="#ce2b37" d="M426.7 0H640v480H426.7z"/></g></symbol>
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
<symbol id="icon-spinner" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="currentColor">
<g fill="none" fill-rule="evenodd" stroke-width="2">
<circle cx="22" cy="22" r="1">
<animate attributeName="r"
begin="0s" dur="1.8s"
values="1; 20"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.165, 0.84, 0.44, 1"
repeatCount="indefinite" />
<animate attributeName="stroke-opacity"
begin="0s" dur="1.8s"
values="1; 0"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.3, 0.61, 0.355, 1"
repeatCount="indefinite" />
</circle>
<circle cx="22" cy="22" r="1">
<animate attributeName="r"
begin="-0.9s" dur="1.8s"
values="1; 20"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.165, 0.84, 0.44, 1"
repeatCount="indefinite" />
<animate attributeName="stroke-opacity"
begin="-0.9s" dur="1.8s"
values="1; 0"
calcMode="spline"
keyTimes="0; 1"
keySplines="0.3, 0.61, 0.355, 1"
repeatCount="indefinite" />
</circle>
</g>
</symbol>
<symbol id="icon-flag-nl" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 480"><g fill-rule="evenodd"><path fill="#21468b" d="M0 320h640v160H0z"/><path fill="#fff" d="M0 160h640v160H0z"/><path fill="#ae1c28" d="M0 0h640v160H0z"/></g></symbol>
<symbol id="icon-backpack" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M96,48h64a48,48,0,0,1,48,48V216a8,8,0,0,1-8,8H56a8,8,0,0,1-8-8V96A48,48,0,0,1,96,48Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M80,224V152a16,16,0,0,1,16-16h64a16,16,0,0,1,16,16v72" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M96,48V32a16,16,0,0,1,16-16h32a16,16,0,0,1,16,16V48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="112" y1="88" x2="144" y2="88" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="80" y1="168" x2="176" y2="168" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="144" y1="168" x2="144" y2="184" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-barricade" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><rect x="24" y="72" width="208" height="88" rx="8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="84" y1="72" x2="172" y2="160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="156" y1="72" x2="232" y2="148" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="24" y1="84" x2="100" y2="160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="192" y1="160" x2="192" y2="200" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="64" y1="160" x2="64" y2="200" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-bed" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M112,168V80H216a32,32,0,0,1,32,32v56" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="24" y1="208" x2="24" y2="48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><polyline points="24 168 248 168 248 208" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="112" y1="80" x2="24" y2="80" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-boot" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="152" y1="120" x2="112" y2="120" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="152" y1="88" x2="112" y2="88" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M240,168v32a8,8,0,0,1-8,8H205.89a8.08,8.08,0,0,1-3.58-.84l-12.62-6.32a8.08,8.08,0,0,0-3.58-.84H169.89a8.08,8.08,0,0,0-3.58.84l-12.62,6.32a8.08,8.08,0,0,1-3.58.84H121.89a8.08,8.08,0,0,1-3.58-.84l-12.62-6.32a8.08,8.08,0,0,0-3.58-.84H85.89a8.08,8.08,0,0,0-3.58.84l-12.62,6.32a8.08,8.08,0,0,1-3.58.84H40a8,8,0,0,1-8-8V168c9.22-32.06,12-88.65,0-120H144a8,8,0,0,1,8,8v64h40A48,48,0,0,1,240,168Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="32" y1="168" x2="240" y2="168" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-lift" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="16" y1="72" x2="240" y2="32" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><rect x="40" y="104" width="176" height="112" rx="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="40" y1="168" x2="216" y2="168" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="128" y1="52" x2="128" y2="104" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="160" y1="104" x2="160" y2="168" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="96" y1="104" x2="96" y2="168" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-chat" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M71.58,144,32,176V48a8,8,0,0,1,8-8H168a8,8,0,0,1,8,8v88a8,8,0,0,1-8,8Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M80,144v40a8,8,0,0,0,8,8h96.42L224,224V96a8,8,0,0,0-8-8H176" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-weather" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="87.66" y1="56.73" x2="83.5" y2="33.09" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="56.69" y1="76.46" x2="37.03" y2="62.69" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="48.73" y1="112.31" x2="25.09" y2="116.48" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="123.52" y1="64.69" x2="137.28" y2="45.03" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M96,144a68.06,68.06,0,1,1,68,72H84a44,44,0,1,1,14.2-85.66" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M59.65,135.35a48,48,0,1,1,80.19-50.94" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-party" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M40.49,205.52,93,61.14a7.79,7.79,0,0,1,12.84-2.85l91.88,91.88A7.79,7.79,0,0,1,194.86,163L50.48,215.51A7.79,7.79,0,0,1,40.49,205.52Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M168,72s0-24,24-24,24-24,24-24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="144" y1="16" x2="144" y2="40" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="216" y1="112" x2="232" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="216" y1="80" x2="240" y2="72" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="78.09" y1="102.09" x2="153.91" y2="177.91" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="101.11" y1="197.11" x2="58.89" y2="154.89" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-dice" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><rect width="256" height="256" fill="none"/><rect x="40" y="40" width="176" height="176" rx="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><circle cx="92" cy="84" r="12"/><circle cx="164" cy="84" r="12"/><circle cx="92" cy="128" r="12"/><circle cx="164" cy="128" r="12"/><circle cx="92" cy="172" r="12"/><circle cx="164" cy="172" r="12"/></symbol>
<symbol id="icon-flag" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="48" y1="224" x2="48" y2="56" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M48,176c64-55.43,112,55.43,176,0V56C160,111.43,112,.57,48,56" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-burger" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M48.07,96a8,8,0,0,1-7.89-9.72C46.68,55.55,83.52,32,128,32s81.32,23.55,87.82,54.28A8,8,0,0,1,207.93,96Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><polyline points="24 176 68 160 108 176 148 160 188 176 232 160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="24" y1="128" x2="232" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M208,168.73V184a32,32,0,0,1-32,32H80a32,32,0,0,1-32-32V167.27" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-handshake" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><polyline points="200 152 160 192 96 176 40 136" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><polyline points="72.68 70.63 128 56 183.32 70.63" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M34.37,60.42,8.85,111.48a8,8,0,0,0,3.57,10.73L40,136,72.68,70.63,45.11,56.85A8,8,0,0,0,34.37,60.42Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M216,136l27.58-13.79a8,8,0,0,0,3.57-10.73L221.63,60.42a8,8,0,0,0-10.74-3.57L183.32,70.63Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M184,72H144L98.34,116.29a8,8,0,0,0,1.38,12.42C117.23,139.9,141,139.13,160,120l40,32,16-16" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><polyline points="124.06 216 82.34 205.57 56 186.75" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-badge" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="152" y1="112" x2="192" y2="112" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="152" y1="144" x2="192" y2="144" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><rect x="32" y="48" width="192" height="160" rx="8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><circle cx="96" cy="120" r="24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M64,168c3.55-13.8,17.09-24,32-24s28.46,10.19,32,24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-parking" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M104,144h32a28,28,0,0,0,0-56H104v80" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-drinks" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M56,32H200L176.85,225A8,8,0,0,1,168.9,232H87.1A8,8,0,0,1,79.15,225Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="60.8" y1="72" x2="195.2" y2="72" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-sauna" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M153.599 76.8c-35.285 0-64 28.706-64 64s28.715 64 64 64 64-28.715 64-64-28.706-64-64-64Zm0 102.4c-21.205 0-38.4-17.195-38.4-38.4s17.195-38.4 38.4-38.4 38.4 17.195 38.4 38.4-17.194 38.4-38.4 38.4Zm152.824 315.623-51.2-140.8c-1.835-5.06-6.639-8.422-12.023-8.422h-89.6V230.4c0-7.074-5.726-12.8-12.8-12.8S128 223.326 128 230.4v128c0 7.074 5.726 12.8 12.8 12.8h93.44l48.137 132.378C284.263 508.775 289.178 512 294.4 512c1.451 0 2.927-.247 4.378-.776 6.638-2.415 10.077-9.754 7.645-16.401ZM209.919 396.8h-107.52c-7.074 0-12.8 5.726-12.8 12.8s5.726 12.8 12.8 12.8h107.52c7.074 0 12.8-5.726 12.8-12.8s-5.726-12.8-12.8-12.8ZM340.36 7.074c-3.157-6.323-10.863-8.875-17.169-5.726-6.323 3.166-8.892 10.846-5.726 17.178 22.886 45.79 12.228 85.726-.111 131.959-7.603 28.424-15.454 57.839-15.991 90.914-.111 7.074 5.521 12.902 12.587 13.013h.213c6.972 0 12.689-5.598 12.8-12.587.486-29.935 7.927-57.796 15.113-84.736 12.552-46.975 25.514-95.547-1.716-150.015Zm65.98 0c-3.174-6.323-10.837-8.875-17.178-5.726-6.323 3.166-8.892 10.846-5.726 17.178 22.903 45.79 12.237 85.726-.111 131.977-13.141 49.203-28.041 104.977-.324 174.251 1.997 5.009 6.81 8.047 11.887 8.047 1.587 0 3.2-.29 4.753-.913 6.562-2.628 9.762-10.078 7.134-16.64-24.559-61.389-11.426-110.575 1.271-158.148C420.599 110.123 433.578 61.551 406.34 7.074Z"/></symbol>
<symbol id="icon-shower" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><path d="M64,236a12,12,0,1,1-12-12A12,12,0,0,1,64,236Zm20-44a12,12,0,1,0,12,12A12,12,0,0,0,84,192Zm-64,0a12,12,0,1,0,12,12A12,12,0,0,0,20,192Zm32-32a12,12,0,1,0,12,12A12,12,0,0,0,52,160ZM256,40a8,8,0,0,1-8,8H219.31L191.46,75.86,169.8,202.65a16,16,0,0,1-27.09,8.66l-98-98a16,16,0,0,1,8.69-27.1L180.14,64.54l30.2-30.2A8,8,0,0,1,216,32h32A8,8,0,0,1,256,40ZM174.21,81.79,56,102l98,98Z"/></symbol>
<symbol id="icon-wifi" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><rect width="256" height="256" fill="none"/><circle cx="128" cy="204" r="12"/><path d="M232,93.19a164,164,0,0,0-208,0" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M200,129a116,116,0,0,0-144,0" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M168,165a68,68,0,0,0-80,0" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-mountain" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><circle cx="164" cy="52" r="20" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M8,200,81.1,75.94a8,8,0,0,1,13.8,0L168,200Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="50.35" y1="128" x2="125.65" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M146.61,163.71l33.06-55.79a8,8,0,0,1,13.76,0L248,200H168" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></symbol>
<symbol id="icon-spinner" viewBox="0 0 44 44" xmlns="http://www.w3.org/2000/svg" stroke="currentColor"><!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL --><g fill="none" fill-rule="evenodd" stroke-width="2"><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="0s" dur="1.8s" values="1; 20" calcMode="spline" keyTimes="0; 1" keySplines="0.165, 0.84, 0.44, 1" repeatCount="indefinite" /><animate attributeName="stroke-opacity" begin="0s" dur="1.8s" values="1; 0" calcMode="spline" keyTimes="0; 1" keySplines="0.3, 0.61, 0.355, 1" repeatCount="indefinite" /></circle><circle cx="22" cy="22" r="1"><animate attributeName="r" begin="-0.9s" dur="1.8s" values="1; 20" calcMode="spline" keyTimes="0; 1" keySplines="0.165, 0.84, 0.44, 1" repeatCount="indefinite" /><animate attributeName="stroke-opacity" begin="-0.9s" dur="1.8s" values="1; 0" calcMode="spline" keyTimes="0; 1" keySplines="0.3, 0.61, 0.355, 1" repeatCount="indefinite" /></circle></g></symbol>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.2 KiB

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

+673
View File
@@ -0,0 +1,673 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 502.8 337.7" style="enable-background:new 0 0 502.8 337.7;" xml:space="preserve">
<style type="text/css">
.st0{clip-path:url(#SVGID_2_);fill:url(#SVGID_3_);}
.st1{fill:url(#SVGID_4_);}
.st2{clip-path:url(#SVGID_6_);fill:url(#SVGID_7_);}
.st3{fill:url(#SVGID_8_);}
.st4{fill:url(#SVGID_9_);}
.st5{fill:url(#SVGID_10_);}
.st6{fill:#F3A21A;}
.st7{fill:url(#SVGID_11_);}
.st8{fill:url(#SVGID_12_);}
.st9{fill:url(#SVGID_13_);}
.st10{fill:#EB9D18;}
.st11{fill:url(#SVGID_14_);}
.st12{fill:url(#SVGID_15_);}
.st13{fill:#FFFFFF;}
.st14{fill:#ADACB0;}
.st15{fill:#494948;}
.st16{fill:#C10A27;}
</style>
<g id="Blason">
<g>
<g>
<defs>
<path id="SVGID_1_" d="M186.7,1.6c-7.7,3.8-8.3,11.4-6.8,19c1.4,6.9,4.8,14.1,8,20.4c26.6,48.7,52.7,97.6,78,147
c7.3,14.2,14.5,28.4,21.6,42.6c6.8-4.7,13.7-9.5,20.5-14.3c-7.2-14.5-14.4-29.1-21.4-43.6C262.8,124,240,75,217.3,25.7
c-3.4-7-7.5-14.4-13.1-20c-2.6-2.6-5.4-4.5-8.5-5.3C192.9-0.3,189.9,0,186.7,1.6"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_1_" style="overflow:visible;"/>
</clipPath>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="185.9588" y1="703.2838" x2="298.626" y2="480.6175" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="1.840490e-02" style="stop-color:#2E2E2D"/>
<stop offset="6.957448e-02" style="stop-color:#414140"/>
<stop offset="0.1472" style="stop-color:#5F5E5E"/>
<stop offset="0.2218" style="stop-color:#494948"/>
<stop offset="0.3098" style="stop-color:#373636"/>
<stop offset="0.4193" style="stop-color:#1E1D1D"/>
<stop offset="0.5731" style="stop-color:#070707"/>
<stop offset="1" style="stop-color:#000000"/>
</linearGradient>
<polygon class="st0" points="181.3,-3.2 352.9,40.6 303.4,234.6 131.7,190.8 "/>
</g>
</g>
<g>
<g>
<path d="M283.2,191.8c-2.4-7.3-4.6-14.7-7-21.8c-8.5-25.5-15.8-51.1-24.2-76.3c-3.6-10.6-6.6-21.3-10.1-31.7
c-1.1-3.4-2.1-6.7-3.1-9.8c-0.7-2.1-0.8-4.4-1.9-6c0.1-0.9,0.4-1,0.5-1.9h0.5c0.5,2.2,1.6,3.7,2.6,5.3c1.4,0.3,2.1,0.3,3.8,0.2
c0.4-0.4,0.9-0.4,1.4-0.7c1.9-1.3,3.7-4.7,4.3-7.2c0.5-2-0.2-6.2,0.7-7.7c-0.2-0.9-0.3-1-1-1.4c0-0.9,0.1-1.4,0.5-1.9
c-0.4-0.7-1.1-0.6-1.4-1.2c-0.1-0.6-0.2-1.1-0.2-1.7c-1-2.5-2-6.2-3.6-8.4c-0.7-1-2.3-1.6-3.4-2.4c-1.7-1.3-2.8-3.6-4.1-5.3
c-0.7-0.9-2-1.4-2.9-2.2c-3.2,0.1-4.3,1.8-6.7,2.2c0-0.6,0-0.9-0.2-1.2v-0.5c-5.9-0.2-6.9,1.9-10.6,4.3c0.6,2.3,3.8,2.1,4.6,4.6
c0.7,1,0.4,2.3-0.2,2.9c0.3,1,2.1,1.9,2.9,2.4c0.3,1.9,0.5,3.2-0.2,4.8c1.3,0.7,2.7,1.6,3.1,3.1c0.4,1.4-0.7,3.4-0.5,4.1
c0.3,0.2,0.6,0.5,1,0.7c0.8,1.2,2.1,4.5,1.2,5.8c0.3,2.1,1,0.7,2.2,1.7c0.5,0.4,0.6,1.4,1,1.9c0.2,0.3,1,0.4,1.2,0.7
c0.6,2.2,1.3,4.5,1.9,6.7c1.9,4.8,3.6,10.4,5.3,15.4c10.1,30.2,18.9,60.3,29,90.5c3.4,10.2,6.6,20.7,10.1,31.2
c1.3,3.9,4.1,9.8,4.6,13.9l0.2,0.2h3.1C286.5,200.5,284.6,196.1,283.2,191.8z M233.5,27.4c-2.1-2.7-2-8.2-4.3-10.8
c0.2-1.2,0.8-1.2,1.4-1.9h1.2c1,2,1.9,4.5,2.4,7C232.7,23.1,233.4,24.7,233.5,27.4z M234.7,14.9c-0.8-0.5-1.6-1-2.4-1.4h-0.2
c0.3-1,0.8-1.3,1.4-1.9h1.7c2.2,2.3,4.4,4.7,6.7,7c0.9,0.9,2.2,1.6,2.9,2.6c3.8,6.1,1.7,20.5-1.7,26.4c-0.7,0-1.1,0-1.4-0.2
c-1.7-2.2-1.4-8.1-2.2-11.3c-1.3-5.7-2-12-3.6-17C235.5,17.6,235.5,16.1,234.7,14.9z"/>
</g>
</g>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="134.3743" y1="628.9778" x2="244.3741" y2="544.978" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="1.840490e-02" style="stop-color:#2E2E2D"/>
<stop offset="9.394112e-02" style="stop-color:#414140"/>
<stop offset="0.2086" style="stop-color:#5F5E5E"/>
<stop offset="0.2778" style="stop-color:#494948"/>
<stop offset="0.3594" style="stop-color:#373636"/>
<stop offset="0.4611" style="stop-color:#1E1D1D"/>
<stop offset="0.6038" style="stop-color:#070707"/>
<stop offset="1" style="stop-color:#000000"/>
</linearGradient>
<path class="st1" d="M254.8,140.4c0,0-48.7-35.8-63.8-52.3c-15.1-16.6-31.7-21.6-40.6-20.6s-14.6,7.1-14.6,7.1s-7,7.2-7.7,13.3
c-0.7,5.8-1.1,7.6,0.1,12c1.2,4.4,2.2,14.9,27.2,28.7c35.9,19.7,83.3,56.8,83.3,56.8L254.8,140.4z"/>
<g>
<g>
<defs>
<path id="SVGID_5_" d="M369.8,1.6c7.7,3.8,8.3,11.4,6.8,19c-1.4,6.9-4.8,14.1-8,20.4c-26.6,48.7-52.7,97.6-78,147
c-7.3,14.2-14.5,28.4-21.6,42.6c-6.8-4.7-13.7-9.5-20.5-14.3c7.2-14.5,14.4-29.1,21.4-43.6c23.8-48.7,46.6-97.7,69.3-147
c3.4-7,7.5-14.4,13-20c2.6-2.6,5.4-4.5,8.5-5.3C363.6-0.3,366.6,0,369.8,1.6"/>
</defs>
<clipPath id="SVGID_6_">
<use xlink:href="#SVGID_5_" style="overflow:visible;"/>
</clipPath>
<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-15.0273" y1="703.2908" x2="97.6398" y2="480.6245" gradientTransform="matrix(-1 0 0 -1 355.5174 707.5911)">
<stop offset="1.840490e-02" style="stop-color:#2E2E2D"/>
<stop offset="6.957448e-02" style="stop-color:#414140"/>
<stop offset="0.1472" style="stop-color:#5F5E5E"/>
<stop offset="0.2218" style="stop-color:#494948"/>
<stop offset="0.3098" style="stop-color:#373636"/>
<stop offset="0.4193" style="stop-color:#1E1D1D"/>
<stop offset="0.5731" style="stop-color:#070707"/>
<stop offset="1" style="stop-color:#000000"/>
</linearGradient>
<polygon class="st2" points="375.2,-3.2 203.6,40.6 253.1,234.6 424.8,190.8 "/>
</g>
</g>
<g>
<g>
<path d="M269,205h3.1l0.2-0.2c0.4-4.2,3.3-10,4.6-13.9c3.5-10.5,6.7-21,10.1-31.2c10.1-30.2,19-60.3,29-90.5
c1.7-5,3.3-10.5,5.3-15.4c0.6-2.2,1.3-4.5,1.9-6.7c0.2-0.3,1-0.4,1.2-0.7c0.4-0.5,0.5-1.5,1-1.9c1.1-1,1.9,0.4,2.2-1.7
c-0.9-1.3,0.4-4.5,1.2-5.8c0.3-0.2,0.6-0.5,1-0.7c0.2-0.7-0.9-2.7-0.5-4.1c0.5-1.5,1.8-2.4,3.1-3.1c-0.8-1.6-0.5-2.9-0.2-4.8
c0.8-0.5,2.6-1.4,2.9-2.4c-0.6-0.6-0.9-1.9-0.2-2.9c0.7-2.5,4-2.2,4.6-4.6c-3.6-2.4-4.6-4.5-10.6-4.3v0.5
c-0.2,0.3-0.2,0.6-0.2,1.2c-2.4-0.4-3.5-2-6.7-2.2c-0.9,0.8-2.2,1.2-2.9,2.2c-1.3,1.7-2.4,4-4.1,5.3c-1,0.8-2.6,1.4-3.4,2.4
c-1.6,2.2-2.6,5.9-3.6,8.4c-0.1,0.6-0.2,1.1-0.2,1.7c-0.3,0.6-1.1,0.5-1.4,1.2c0.4,0.5,0.5,1,0.5,1.9c-0.6,0.4-0.8,0.5-1,1.4
c0.9,1.5,0.2,5.7,0.7,7.7c0.7,2.5,2.4,5.9,4.3,7.2c0.5,0.4,1,0.3,1.4,0.7c1.7,0.1,2.4,0.1,3.8-0.2c1-1.6,2.1-3,2.6-5.3h0.5
c0.1,0.9,0.3,1,0.5,1.9c-1.2,1.6-1.2,3.9-1.9,6c-1.1,3.2-2,6.5-3.1,9.8c-3.5,10.4-6.5,21.1-10.1,31.7
c-8.4,25.2-15.7,50.9-24.2,76.3c-2.4,7.1-4.5,14.5-7,21.8C271.9,196.1,270.1,200.5,269,205z M322.3,21.7c0.5-2.4,1.4-4.9,2.4-7
h1.2c0.7,0.7,1.2,0.7,1.4,1.9c-2.4,2.6-2.2,8.1-4.3,10.8C323.1,24.7,323.8,23.1,322.3,21.7z M320.6,19c-1.6,5-2.3,11.3-3.6,17
c-0.8,3.2-0.5,9.1-2.2,11.3c-0.3,0.2-0.8,0.2-1.4,0.2c-3.4-5.9-5.5-20.3-1.7-26.4c0.7-1.1,2-1.8,2.9-2.6c2.3-2.3,4.5-4.7,6.7-7
h1.7c0.6,0.6,1.1,0.9,1.4,1.9h-0.2c-0.8,0.5-1.6,1-2.4,1.4C321,16.1,321.1,17.6,320.6,19z"/>
</g>
</g>
<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-66.6074" y1="629.002" x2="43.393" y2="545.0015" gradientTransform="matrix(-1 0 0 -1 355.5174 707.5911)">
<stop offset="1.840490e-02" style="stop-color:#2E2E2D"/>
<stop offset="9.394112e-02" style="stop-color:#414140"/>
<stop offset="0.2086" style="stop-color:#5F5E5E"/>
<stop offset="0.2778" style="stop-color:#494948"/>
<stop offset="0.3594" style="stop-color:#373636"/>
<stop offset="0.4611" style="stop-color:#1E1D1D"/>
<stop offset="0.6038" style="stop-color:#070707"/>
<stop offset="1" style="stop-color:#000000"/>
</linearGradient>
<path class="st3" d="M317.8,185.3c0,0,47.4-37.1,83.3-56.8c25.1-13.7,26-24.2,27.2-28.7c1.2-4.4,0.8-6.2,0.1-12
c-0.7-6.1-7.7-13.3-7.7-13.3s-5.8-6.1-14.6-7.1c-8.9-1-25.4,4.1-40.6,20.6c-15.1,16.6-63.8,52.3-63.8,52.3L317.8,185.3z"/>
<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="278.3112" y1="431.7694" x2="278.3112" y2="615.46" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="0" style="stop-color:#DA9B24"/>
<stop offset="1" style="stop-color:#FDC762"/>
</linearGradient>
<path class="st4" d="M277.9,92.2c4.7,0.1,28.4-1.5,66.9,14.2c3,1.2,3.4,1.7,4.6,4.6c6.2,18.9,8.7,44.3,7.2,60.2
c-1.5,32.2-20.5,68.7-43.8,84.7c-4.2,3.4-23.2,16.3-30.9,19.4c-2.9,1.5-4.3,1.8-8.6-0.4c-4.3-2.2-17.5-8.1-29.1-18.3
c-11.3-8.9-41.2-33.7-44.6-85.9c-0.1-41.9,5.4-52.6,7.1-59.2c1.9-3.3,1.4-4.5,5.7-5.8C216.7,104.3,247.7,91.8,277.9,92.2z"/>
<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="278.349" y1="605.4353" x2="278.349" y2="441.3781" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="0" style="stop-color:#F2BF4B"/>
<stop offset="1" style="stop-color:#EBAE24"/>
</linearGradient>
<path class="st5" d="M278,99.6c4.3,0.1,26.2-1.4,61.6,13c2.8,1.1,3.1,1.6,4.2,4.3c5.7,17.4,8,40.7,6.6,55.4
c-1.4,29.7-18.9,63.2-40.3,78c-3.8,3.1-21.4,15-28.4,17.8c-2.7,1.3-3.9,1.6-7.9-0.4c-3.9-2-16.1-7.5-26.8-16.8
c-10.4-8.2-37.9-31-41.1-79.1c-0.1-38.5,5-48.4,6.5-54.5c1.7-3,1.3-4.1,5.2-5.4C221.6,110.7,250.1,99.2,278,99.6z"/>
<path class="st6" d="M278.5,245.6c-0.9,0.1-1.9-0.2-3.4-1c-2.8-1.5-11.6-5.4-19.4-12.1c-7.5-5.9-27.3-22.4-29.7-57.1
c0-27.8,3.6-34.9,4.7-39.3c0.6-1.1,0.8-1.8,1.3-2.4l46.5,44.9V245.6z"/>
<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="304.4899" y1="551.4356" x2="304.4899" y2="478.9356" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="0" style="stop-color:#F8B640"/>
<stop offset="1" style="stop-color:#F9C660"/>
</linearGradient>
<path class="st7" d="M278.5,245.6c0.7,0,1.4-0.3,2.2-0.8c5.1-2,17.7-10.6,20.5-12.9c15.5-10.7,28.1-34.9,29.1-56.3
c1-10.6-0.7-27.4-4.8-40c-0.4-1.1-0.7-1.6-1.2-2.1l-45.9,44.9L278.5,245.6L278.5,245.6z"/>
<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="232" y1="556.7395" x2="324.4" y2="556.7395" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="0" style="stop-color:#F8B640"/>
<stop offset="1" style="stop-color:#F9C660"/>
</linearGradient>
<path class="st8" d="M324.4,133.6c-0.4-0.4-0.9-0.6-1.8-1c-25.6-10.4-41.4-9.3-44.5-9.4c-20.1-0.3-40.7,8.1-43.6,9
c-1.4,0.5-2.1,0.9-2.5,1.5l46.5,44.9L324.4,133.6z"/>
<radialGradient id="SVGID_13_" cx="278.2325" cy="523.2651" r="49.5127" gradientTransform="matrix(1 0 0 -1 0 707.5911)" gradientUnits="userSpaceOnUse">
<stop offset="0" style="stop-color:#C2172D"/>
<stop offset="1" style="stop-color:#951922"/>
</radialGradient>
<path class="st9" d="M278.1,131.2c2.7,0.1,16.4-0.9,38.6,8.2c1.7,0.7,1.9,1,2.6,2.7c3.6,10.9,5,25.6,4.1,34.7
c-0.9,18.6-11.8,39.6-25.3,48.9c-2.4,2-13.4,9.4-17.8,11.2c-1.7,0.8-2.5,1-4.9-0.2c-2.5-1.3-10.1-4.7-16.8-10.5
c-6.5-5.1-23.8-19.4-25.8-49.6c0-24.2,3.1-30.3,4.1-34.2c1.1-1.9,0.8-2.6,3.3-3.4C242.7,138.2,260.6,130.9,278.1,131.2z"/>
<path class="st10" d="M281.3,219.5l-4-0.2c0,0-9.2,0.2-14-12.6l-20-57.6c0,0,17,7.2,21.5,22L281.3,219.5z"/>
<path class="st10" d="M307.2,158.7h-4.1l-6.5,24.8c-3.6,14.4-14.2,17.2-14.2,17.2l11.1-42h-12.9c0,0,1.2-8.8,10.5-8.8h27.2
C318.3,149.9,315,158.7,307.2,158.7z"/>
<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="278.3005" y1="510.4355" x2="278.3005" y2="573.277" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="0.3006" style="stop-color:#FFFFFF;stop-opacity:0.15"/>
<stop offset="1" style="stop-color:#EBAE24;stop-opacity:0"/>
</linearGradient>
<path class="st11" d="M209.6,174.2c0,0,18.2,7.8,24,8.7c5.4,4.7,15.7,10.2,21.8,12.2c10.4,2.9,17.3,3.3,22.6,3.3
c5.3,0,15.7-0.2,24.9-4.2c5.7-2.5,14.9-7.1,20.5-13.3c7-1.6,23.7-9.7,23.7-9.7s0.9-31.3-6.8-49.4c-0.7-1.6-1.7-1.7-1.7-1.7
s-28.1-12.2-59.9-12.2s-60.5,11.9-60.5,11.9s-0.8,0-1.6,1.9C215.8,123.5,208.4,144.6,209.6,174.2z"/>
<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="278.9793" y1="525.4617" x2="205.7293" y2="544.7117" gradientTransform="matrix(1 0 0 -1 0 707.5911)">
<stop offset="0" style="stop-color:#FFFFFF;stop-opacity:8.000000e-02"/>
<stop offset="1" style="stop-color:#EBAE24;stop-opacity:0"/>
</linearGradient>
<path class="st12" d="M281.6,268.1c-2.7,1.3-3.9,1.6-7.9-0.4c-3.9-2-16.1-7.5-26.8-16.8c-10.4-8.2-37.9-31-41.1-79.1
c-0.1-38.5,5-48.4,6.5-54.5c1.7-3,1.3-4.1,5.2-5.4c4-1.3,32.5-12.8,60.3-12.4c4.3,0.1,26.2-1.4,61.6,13c1.4,0.6,1.4,0.6,2.7,1.6
C237.8,167.7,281.6,268.1,281.6,268.1z"/>
<path class="st13" d="M248.8,34c0,0-1.3,8.4-2.7,12.1C244.7,49.9,251.8,41.9,248.8,34z"/>
<path class="st13" d="M307.8,34c0,0,1.3,8.4,2.7,12.1C311.9,49.9,304.7,41.9,307.8,34z"/>
</g>
<g id="Calque_6">
</g>
<g id="Fond_texte">
<g>
<path class="st13" d="M233.4,242.3c-12.2,0-17.7-9.7-17.7-16.5c0-5.7,2.5-10.8,7.1-14.6c-0.9-2.1-1.4-4.2-1.4-6.4
c0-6.8,6.6-14.5,16.2-14.5c3.4,0,6.6,0.7,8.8,1.9c2.9,1.7,2.9,4.3,2.9,5.1c0,1.5-0.2,5.9-0.5,7.2c-0.8,4-3.8,4.4-4.7,4.4
c-0.5,0-4.6-0.1-4.6-5.3c0-0.8-0.2-1.4-0.5-1.8c-0.5-0.5-1.3-1.1-2.5-1.1c-2.8,0-2.8,2.3-2.8,3c0,2.6,2.3,5.5,7.6,11.3
c0.9,1,3.4,3.4,5.8,5.6c0.1-0.5,0.1-0.9,0.2-1.4c-2.5-0.2-4.4-2.2-4.4-4.6c0-2.2,1.8-4.6,5.1-4.6c2.2,0,4.6,0.1,7.1,0.4h0.1
c2.8,0.4,4.7,2.5,4.7,5.3c0,4.3-2,8.9-4,12.3c1.7,1.3,3,2.1,4,2.7c1.6,1,3.6,1.6,4.5,1.6c3.7,0,5,2.8,5,4.6c0,2.6-2.2,4.6-5.2,4.6
h-5.4c-4.5,0-6.9-0.7-11.4-4C243.3,240.7,238.6,242.3,233.4,242.3z M228.9,220.4c-0.3,0.8-0.5,1.7-0.5,2.8c0,4.5,2.9,7.7,6.9,7.7
c1.3,0,2.4-0.2,3.4-0.5c-2.6-2.4-5.1-4.9-6.1-5.9C232.3,224.2,230.7,222.4,228.9,220.4z"/>
<path class="st14" d="M219.9,225.8c0-6.5,4.2-10.8,8.5-13.4c-2.1-2.9-2.7-5.2-2.7-7.7c0-4.4,4.5-10.2,11.9-10.2
c2.8,0,5.2,0.6,6.7,1.4c0.7,0.4,0.7,0.7,0.7,1.4c0,1.7-0.2,5.6-0.4,6.4c-0.2,0.8-0.3,0.9-0.6,0.9c-0.3,0-0.3-0.2-0.3-1.1
c0-1.4-0.3-3.3-1.7-4.7c-1.2-1.3-3.1-2.4-5.6-2.4c-3.3,0-7.1,2.1-7.1,7.3c0,4.3,3,7.9,8.8,14.2c1.9,2.1,8.7,8.4,10.5,9.9
c1.6-2.1,2.8-5.8,2.8-9.2c0-0.8-0.2-1.9-1.1-2.7c-0.7-0.7-1.9-0.9-2.7-0.9c-0.3,0-0.7-0.1-0.7-0.4s0.4-0.4,0.9-0.4
c1.3,0,3.6,0.1,6.7,0.4c0.8,0.1,1,0.6,1,1.1c0,4.5-3.1,10.1-5.5,13.1c3.7,3.1,6.1,4.6,7.7,5.5c1.8,1.1,4.6,2.2,6.6,2.2
c0.5,0,0.8,0.1,0.8,0.4c0,0.2-0.4,0.4-0.9,0.4h-5.4c-4.1,0-5.4-0.4-11.5-5.2c-1.3,1.3-5.7,6-13.9,6
C223.6,238,219.9,230.6,219.9,225.8z M245.8,231c-3.1-2.6-8.6-7.8-10.1-9.4c-1.4-1.6-5-5.5-6.6-7.8c-2.9,1.9-5,4.9-5,9.3
c0,6.9,4.9,11.9,11.1,11.9C240.5,235.1,243.9,232.9,245.8,231z"/>
</g>
<g>
<path class="st14" d="M219.9,225.8c0-6.5,4.2-10.8,8.5-13.4c-2.1-2.9-2.7-5.2-2.7-7.7c0-4.4,4.5-10.2,11.9-10.2
c2.8,0,5.2,0.6,6.7,1.4c0.7,0.4,0.7,0.7,0.7,1.4c0,1.7-0.2,5.6-0.4,6.4c-0.2,0.8-0.3,0.9-0.6,0.9c-0.3,0-0.3-0.2-0.3-1.1
c0-1.4-0.3-3.3-1.7-4.7c-1.2-1.3-3.1-2.4-5.6-2.4c-3.3,0-7.1,2.1-7.1,7.3c0,4.3,3,7.9,8.8,14.2c1.9,2.1,8.7,8.4,10.5,9.9
c1.6-2.1,2.8-5.8,2.8-9.2c0-0.8-0.2-1.9-1.1-2.7c-0.7-0.7-1.9-0.9-2.7-0.9c-0.3,0-0.7-0.1-0.7-0.4s0.4-0.4,0.9-0.4
c1.3,0,3.6,0.1,6.7,0.4c0.8,0.1,1,0.6,1,1.1c0,4.5-3.1,10.1-5.5,13.1c3.7,3.1,6.1,4.6,7.7,5.5c1.8,1.1,4.6,2.2,6.6,2.2
c0.5,0,0.8,0.1,0.8,0.4c0,0.2-0.4,0.4-0.9,0.4h-5.4c-4.1,0-5.4-0.4-11.5-5.2c-1.3,1.3-5.7,6-13.9,6
C223.6,238,219.9,230.6,219.9,225.8z M245.8,231c-3.1-2.6-8.6-7.8-10.1-9.4c-1.4-1.6-5-5.5-6.6-7.8c-2.9,1.9-5,4.9-5,9.3
c0,6.9,4.9,11.9,11.1,11.9C240.5,235.1,243.9,232.9,245.8,231z"/>
</g>
<path class="st14" d="M110.2,249.4v-26.6c-0.9-1.3-1.7-2.7-2.3-4.2c-1.2-2.8-1.8-5.8-1.8-8.9s0.6-6.1,1.8-8.9
c1.2-2.7,2.8-5.1,4.8-7.2c2-2,4.5-3.7,7.2-4.8c2.8-1.2,5.8-1.8,8.9-1.8h35.6v26.6c0.9,1.3,1.7,2.7,2.3,4.2c1.2,2.8,1.8,5.8,1.8,8.9
s-0.6,6.1-1.8,8.9c-1.2,2.7-2.8,5.2-4.9,7.2c-2.1,2.1-4.5,3.7-7.2,4.9c-2.8,1.2-5.8,1.8-8.9,1.8L110.2,249.4L110.2,249.4z"/>
<path class="st13" d="M114.8,244.9v-19.7h4.4c-1.2-0.7-2.3-1.6-3.2-2.6c-1.6-1.6-2.9-3.6-3.8-5.8c-1-2.2-1.4-4.6-1.4-7.2
c0-2.5,0.5-4.9,1.4-7.2c0.9-2.2,2.2-4.1,3.9-5.8c1.6-1.6,3.6-2.9,5.8-3.9s4.6-1.4,7.2-1.4h31.1V211h-4.5c1.1,0.7,2.2,1.5,3.2,2.5
c1.7,1.6,3,3.6,4,5.8c1,2.2,1.4,4.6,1.4,7.2c0,2.5-0.5,4.9-1.4,7.2c-0.9,2.2-2.3,4.1-3.9,5.8c-1.7,1.7-3.6,3-5.8,3.9
c-2.2,1-4.6,1.4-7.2,1.4h-31.2V244.9z"/>
<path d="M154.3,197v8.4h-25.4c-1.2,0-2.2,0.4-3,1.2c-0.8,0.8-1.2,1.8-1.2,3s0.4,2.2,1.2,3.1c0.8,0.8,1.8,1.3,3,1.3h16.9
c1.8,0,3.4,0.3,4.9,1s2.9,1.5,4,2.7c1.2,1.1,2.1,2.5,2.7,4c0.7,1.5,1,3.2,1,4.9c0,1.8-0.3,3.4-1,4.9s-1.6,2.9-2.7,4
c-1.2,1.2-2.5,2.1-4,2.7c-1.5,0.7-3.2,1-4.9,1h-25.3v-8.4h25.3c1.3,0,2.3-0.4,3.1-1.2c0.8-0.8,1.2-1.8,1.2-3.1c0-1.2-0.4-2.2-1.2-3
s-1.8-1.2-3.1-1.2h-16.9c-1.8,0-3.4-0.3-4.9-1s-2.9-1.6-4-2.7c-1.1-1.2-2-2.5-2.7-4s-1-3.2-1-4.9c0-1.8,0.3-3.4,1-4.9
s1.5-2.9,2.7-4c1.1-1.1,2.5-2,4-2.7s3.2-1,4.9-1L154.3,197L154.3,197z"/>
<polygon class="st14" points="195.8,241 195.8,186.8 224.6,186.8 224.6,244.2 "/>
<polygon class="st13" points="200.4,236.9 200.4,191.4 220,191.4 220,239.1 "/>
<path d="M206,231.9v-34.8h8.4v35.7"/>
<path class="st14" d="M193.4,294.4c-4.3,0-8.4-0.8-12.2-2.5c-3.8-1.6-7.1-3.9-10-6.7c-2.9-2.9-5.1-6.2-6.7-10
c-1.6-3.8-2.5-7.9-2.5-12.2c0-4.3,0.8-8.5,2.5-12.3c1.6-3.7,3.9-7.1,6.8-9.9c2.8-2.8,6.2-5,9.9-6.6c3.8-1.6,7.9-2.5,12.2-2.5h2.5
v-16.9h28.7v48.1c0,4.2-0.8,8.3-2.5,12.2c-1.6,3.7-3.8,7.1-6.6,9.9c-2.8,2.9-6.2,5.2-10,6.8C201.7,293.6,197.6,294.4,193.4,294.4z
M193.4,260.6c-0.4,0-0.7,0.1-1,0.2s-0.6,0.3-0.8,0.5s-0.4,0.5-0.6,0.8c-0.1,0.2-0.2,0.4-0.2,0.9c0,0.4,0.1,0.7,0.2,1
c0.1,0.3,0.3,0.6,0.5,0.8c0.2,0.2,0.5,0.4,0.8,0.5s0.6,0.2,1,0.2c0.5,0,0.7-0.1,0.9-0.2c0.3-0.1,0.6-0.3,0.8-0.6
c0.2-0.2,0.4-0.5,0.5-0.8s0.2-0.6,0.2-1v-2.5h-2.3V260.6z"/>
<path class="st13" d="M193.4,289.9c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7c3.3-1.4,6.8-2.1,10.4-2.1h7
v-16.9h19.7V263c0,3.6-0.7,7.1-2.1,10.4c-1.4,3.2-3.3,6.1-5.7,8.5c-2.4,2.5-5.3,4.4-8.5,5.8C200.5,289.1,197,289.9,193.4,289.9z
M193.4,256.1c-1,0-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7s0.2,1.9,0.5,2.8
c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5c0.9,0.4,1.8,0.5,2.8,0.5s1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5
c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8v-7H193.4z"/>
<path d="M214.4,225.1V263c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.5,6.8c-1.9,1.9-4.1,3.5-6.7,4.6c-2.6,1.1-5.3,1.6-8.2,1.6
s-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2c0-2.9,0.5-5.7,1.6-8.2
c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5s5.3-1.6,8.2-1.6h12.7v-16.9 M193.4,275.8c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-12.7h-12.7c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7C189.9,275.5,191.6,275.8,193.4,275.8z"/>
<path class="st14" d="M31.4,294.6c-4.3,0-8.3-0.8-12.2-2.5c-3.8-1.6-7.1-3.9-10-6.7c-2.9-2.8-5.1-6.2-6.7-10
c-1.6-3.8-2.5-7.9-2.5-12.2v-48.1h28.8V232h2.6c4.3,0,8.4,0.8,12.3,2.5c3.7,1.6,7,3.8,9.8,6.7c2.8,2.8,5.1,6.1,6.7,9.8
c1.6,3.8,2.5,7.9,2.5,12.3c0,4.2-0.8,8.3-2.5,12.2c-1.6,3.7-3.8,7.1-6.6,9.9c-2.8,2.9-6.2,5.1-9.9,6.8
C39.8,293.7,35.7,294.6,31.4,294.6z M28.8,263.3c0,0.4,0.1,0.7,0.2,1c0.1,0.4,0.3,0.6,0.5,0.8c0.2,0.2,0.5,0.4,0.8,0.5
s0.6,0.2,1,0.2c0.5,0,0.7-0.1,0.9-0.2c0.3-0.1,0.6-0.3,0.8-0.6c0.2-0.2,0.4-0.5,0.5-0.8s0.2-0.6,0.2-1c0-0.5-0.1-0.7-0.2-0.9
c-0.1-0.3-0.3-0.6-0.6-0.8c-0.2-0.2-0.5-0.4-0.8-0.6c-0.2-0.1-0.4-0.2-0.9-0.2h-2.6v2.6H28.8z"/>
<path class="st13" d="M31.4,290c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4v-43.6h19.7v16.9h7.1c3.7,0,7.2,0.7,10.5,2.1c3.2,1.4,6,3.3,8.4,5.7c2.4,2.4,4.3,5.2,5.7,8.4
c1.4,3.2,2.1,6.8,2.1,10.5c0,3.6-0.7,7.1-2.1,10.4c-1.4,3.2-3.3,6.1-5.7,8.5c-2.4,2.5-5.3,4.4-8.5,5.8
C38.6,289.3,35.1,290,31.4,290z M24.3,263.3c0,1,0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5s1.8,0.5,2.8,0.5
s1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8s-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3
c-0.6-0.6-1.4-1.1-2.3-1.5c-0.8-0.4-1.7-0.5-2.7-0.5h-7.1C24.3,256.3,24.3,263.3,24.3,263.3z"/>
<path d="M39.6,243.9c2.5,1.1,4.8,2.6,6.7,4.5c1.9,1.9,3.4,4.1,4.5,6.7c1.1,2.5,1.6,5.3,1.6,8.2c0,2.9-0.5,5.6-1.6,8.2
s-2.6,4.8-4.5,6.8c-1.9,1.9-4.1,3.5-6.7,4.6c-2.5,1.1-5.3,1.6-8.2,1.6c-2.9,0-5.6-0.5-8.2-1.6s-4.8-2.6-6.8-4.6
c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2v-37.9h8.4v16.8h12.8C34.3,242.2,37,242.8,39.6,243.9z M31.4,276
c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5s-0.3-3.4-1-4.9s-1.6-2.9-2.7-4
c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1H18.6v12.7c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7
C27.9,275.7,29.6,276,31.4,276z"/>
<path class="st14" d="M75.9,294.6c-4.3,0-8.3-0.8-12.2-2.5c-3.8-1.6-7.1-3.9-10-6.8c-2.8-2.8-5-6.2-6.6-9.9
c-1.6-3.8-2.5-7.9-2.5-12.2c0-4.3,0.8-8.5,2.5-12.3c1.6-3.7,3.8-7,6.7-9.8c2.8-2.8,6.2-5.1,9.9-6.7c3.8-1.6,7.9-2.5,12.2-2.5
c4.3,0,8.4,0.8,12.3,2.5c3.7,1.6,7,3.8,9.8,6.6c2.9,2.8,5.2,6.2,6.8,9.9c1.6,3.8,2.5,7.9,2.5,12.3c0,4.2-0.8,8.3-2.5,12.2
c-1.6,3.8-3.9,7.1-6.7,10c-2.8,2.8-6.2,5.1-9.9,6.7C84.4,293.7,80.3,294.6,75.9,294.6z M75.9,260.8c-0.4,0-0.7,0.1-1,0.2
s-0.6,0.3-0.8,0.5c-0.2,0.2-0.4,0.5-0.6,0.8c-0.1,0.2-0.2,0.4-0.2,0.9c0,0.4,0.1,0.7,0.2,1c0.1,0.3,0.3,0.6,0.5,0.8
c0.2,0.2,0.5,0.4,0.8,0.5s0.6,0.2,1,0.2c0.4,0,0.7-0.1,1-0.2s0.6-0.3,0.8-0.5c0.2-0.2,0.4-0.5,0.5-0.8c0.1-0.3,0.2-0.6,0.2-1
c0-0.5-0.1-0.7-0.2-0.9c-0.1-0.3-0.3-0.6-0.6-0.8c-0.2-0.2-0.5-0.4-0.8-0.5C76.6,260.8,76.3,260.8,75.9,260.8z"/>
<path class="st13" d="M75.9,290c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.3-5.3-5.7-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.7-8.4c2.4-2.4,5.3-4.3,8.5-5.7c3.3-1.4,6.8-2.1,10.4-2.1
c3.7,0,7.2,0.7,10.5,2.1c3.2,1.4,6,3.3,8.4,5.7c2.5,2.4,4.4,5.3,5.8,8.5c1.4,3.2,2.1,6.8,2.1,10.5c0,3.6-0.7,7.1-2.1,10.4
c-1.4,3.2-3.3,6.1-5.8,8.5c-2.4,2.4-5.3,4.4-8.5,5.7C83.2,289.3,79.6,290,75.9,290z M75.9,256.3c-1,0-1.9,0.2-2.8,0.5
c-0.9,0.4-1.6,0.9-2.3,1.5c-0.6,0.6-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7s0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3
c0.6,0.6,1.4,1.1,2.3,1.5c0.9,0.4,1.8,0.5,2.8,0.5s1.9-0.2,2.8-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3
s0.5-1.8,0.5-2.8s-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3c-0.6-0.6-1.4-1.1-2.3-1.5S76.9,256.3,75.9,256.3z"/>
<path d="M54.9,263.3c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.5-6.7c1.9-1.9,4.1-3.4,6.7-4.5c2.6-1.1,5.3-1.6,8.2-1.6
s5.7,0.5,8.2,1.6s4.8,2.6,6.7,4.5s3.5,4.1,4.6,6.7c1.1,2.5,1.6,5.3,1.6,8.2c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.6,6.8
c-1.9,1.9-4.2,3.5-6.7,4.6s-5.3,1.6-8.2,1.6s-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.7-4.6c-1.9-1.9-3.4-4.2-4.5-6.8
C55.5,268.9,54.9,266.1,54.9,263.3z M63.2,263.3c0,1.8,0.3,3.4,1,5c0.7,1.6,1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7
c1.6,0.7,3.2,1,5,1s3.4-0.3,5-1c1.6-0.7,2.9-1.6,4.1-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5s-0.3-3.4-1-4.9s-1.6-2.9-2.7-4
c-1.2-1.2-2.5-2.1-4.1-2.7c-1.6-0.7-3.2-1-5-1s-3.4,0.3-5,1c-1.6,0.7-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
C63.5,259.9,63.2,261.5,63.2,263.3z"/>
<path class="st14" d="M120.9,294.4c-4.3,0-8.3-0.8-12.2-2.5c-3.8-1.6-7.1-3.9-10-6.7c-2.9-2.8-5.1-6.2-6.7-10
c-1.6-3.8-2.5-7.9-2.5-12.2c0-4.3,0.8-8.5,2.5-12.3c1.6-3.7,3.9-7.1,6.8-9.9c2.8-2.8,6.2-5,9.9-6.6c3.8-1.6,7.9-2.5,12.2-2.5
s8.5,0.8,12.3,2.5c3.7,1.6,7,3.8,9.8,6.7c2.8,2.8,5.1,6.1,6.7,9.8c1.6,3.8,2.5,7.9,2.5,12.3v31.3h-31.3V294.4z M120.9,260.6
c-0.4,0-0.7,0.1-1,0.2s-0.6,0.3-0.8,0.5s-0.4,0.5-0.6,0.8c-0.1,0.2-0.2,0.4-0.2,0.9c0,0.4,0.1,0.7,0.2,1c0.1,0.3,0.3,0.6,0.5,0.8
c0.2,0.2,0.5,0.4,0.8,0.5s0.6,0.2,1,0.2h2.5v-2.6c0-0.5-0.1-0.7-0.2-0.9c-0.1-0.3-0.3-0.6-0.6-0.8c-0.2-0.2-0.5-0.4-0.8-0.6
C121.6,260.7,121.4,260.6,120.9,260.6z"/>
<path class="st13" d="M120.9,289.9c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7c3.3-1.4,6.8-2.1,10.4-2.1
c3.7,0,7.2,0.7,10.5,2.1c3.2,1.4,6,3.3,8.4,5.7c2.4,2.4,4.3,5.2,5.7,8.4c1.4,3.2,2.1,6.8,2.1,10.5v26.8h-26.7V289.9z M120.9,256.1
c-1,0-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7s0.2,1.9,0.5,2.8
c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5c0.9,0.4,1.8,0.5,2.8,0.5h7v-7.1c0-1-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3
c-0.6-0.6-1.4-1.1-2.3-1.5C122.8,256.2,121.9,256.1,120.9,256.1z"/>
<path d="M120.9,242c2.9,0,5.7,0.5,8.2,1.6s4.8,2.6,6.7,4.5s3.4,4.1,4.5,6.7c1.1,2.5,1.6,5.3,1.6,8.2v21.2h-21
c-2.9,0-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2c0-2.9,0.5-5.7,1.6-8.2
c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5C115.3,242.6,118,242,120.9,242z M133.6,275.8V263c0-1.8-0.3-3.4-1-4.9
s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7c1.6,0.7,3.2,1,5,1L133.6,275.8L133.6,275.8z"/>
<g>
<path class="st14" d="M150.9,169.9h28.7v33.9c0.8-0.1,1.7-0.1,2.6-0.1c0.5,0,0.7-0.1,0.9-0.2c0.3-0.1,0.6-0.3,0.8-0.6
c0.2-0.2,0.4-0.5,0.5-0.8s0.2-0.6,0.2-1v-14.3h28.8v14.4c0,5.2-1.2,10-3.5,14.4c-0.5,0.9-1,1.7-1.5,2.5c0.5,0.8,1,1.7,1.5,2.6
c2.3,4.4,3.5,9.2,3.5,14.3v14.4h-28.8V235c0-0.5-0.1-0.7-0.2-0.9c-0.1-0.3-0.3-0.6-0.6-0.8c-0.2-0.2-0.5-0.4-0.8-0.6
c-0.2-0.1-0.4-0.2-0.9-0.2l0,0c-0.4,0-0.7,0.1-1,0.2s-0.6,0.3-0.8,0.5s-0.4,0.5-0.6,0.8c-0.1,0.2-0.2,0.4-0.2,0.9v16.7l-28.8,1.6
v-83.3H150.9z"/>
<path class="st13" d="M155.4,174.5h19.7v34.7c2.3-0.6,4.7-1,7.1-1c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5
c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8v-9.8h19.7v9.8c0,4.4-1,8.5-3,12.3c-0.9,1.7-1.9,3.2-3.1,4.6c1.2,1.4,2.2,3,3.1,4.7
c2,3.8,2.9,7.9,2.9,12.2v9.9h-19.7v-9.9c0-1-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3c-0.6-0.6-1.4-1.1-2.3-1.5
c-0.8-0.4-1.7-0.5-2.7-0.5s-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.6,0.6-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7v12.4
l-19.7,1.1v-73.9H155.4z"/>
<path d="M161.1,242.5V235v-54.8h8.4v38.1c1.8-1.4,3.8-2.4,6-3.2c2.2-0.8,4.4-1.1,6.8-1.1c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-4.1h8.4v4.1c0,3.5-0.8,6.7-2.3,9.6s-3.6,5.3-6.2,7.3c2.6,1.9,4.7,4.4,6.2,7.3
s2.3,6.1,2.3,9.6v4.2h-8.4V235c0-1.8-0.3-3.4-1-4.9s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1
c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v7.1"/>
<path class="st14" d="M134.2,294.4v-31.3c0-4.3,0.8-8.5,2.5-12.3c1.6-3.7,3.9-7.1,6.8-9.9c2.8-2.8,6.2-5,9.9-6.6
c1.8-0.8,3.7-1.4,5.6-1.8l0.8-0.2l19.9-1.1v29.3h-14.2c-0.5,0-0.7,0.1-0.9,0.2c-0.3,0.1-0.6,0.3-0.8,0.6c-0.2,0.2-0.4,0.5-0.6,0.8
c-0.1,0.2-0.2,0.4-0.2,0.9v31.3h-28.8V294.4z"/>
<path class="st13" d="M138.7,289.9v-26.8c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7
c1.5-0.7,3.2-1.2,4.8-1.5l0.4-0.1l14.8-0.8v20h-9.6c-1,0-1.9,0.2-2.7,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.2,1.4-1.5,2.3
c-0.4,0.8-0.5,1.7-0.5,2.7v26.8h-19.8V289.9z"/>
<path d="M169.4,242v8.4h-3.9c-1.8,0-3.4,0.3-4.9,1s-2.9,1.6-4,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v21.2h-8.4v-21.1
c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5c1.2-0.5,2.5-0.9,3.8-1.2"/>
</g>
<path class="st14" d="M238.4,294.6c-4.2,0-8.2-0.8-12-2.4s-7.2-3.9-10.2-6.8c-3.1-3.1-5.4-6.6-6.9-10.5c-1.4-3.8-2.2-7.7-2.2-11.6
c0-4,0.7-7.9,2.2-11.6c1.5-3.9,3.8-7.4,6.9-10.4c3-3,6.6-5.4,10.4-6.9s7.7-2.3,11.7-2.3s7.9,0.8,11.7,2.3c3.9,1.5,7.4,3.9,10.4,6.9
l10.1,10.1l-12,12l12,12l-10.1,10.1c-2.9,2.9-6.4,5.2-10.2,6.8C246.6,293.8,242.6,294.6,238.4,294.6z"/>
<path class="st13" d="M238.4,290c-3.6,0-7-0.7-10.2-2s-6.2-3.3-8.7-5.8c-2.6-2.6-4.6-5.6-5.9-9c-1.2-3.2-1.9-6.6-1.9-10
s0.6-6.7,1.9-9.9c1.3-3.3,3.3-6.3,5.9-8.9s5.6-4.6,8.9-5.9s6.6-1.9,10-1.9s6.8,0.7,10,1.9c3.3,1.3,6.3,3.3,8.9,5.9l6.9,6.9l-12,12
l12,12l-6.9,6.9c-2.5,2.5-5.4,4.5-8.7,5.8C245.4,289.4,242,290,238.4,290z"/>
<path d="M250.3,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6c-2.8,0-5.5-0.5-8.1-1.6s-4.9-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9l-23.4,23.4c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L250.3,269.4z M229.4,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C233.7,251.1,231.4,252.2,229.4,254.2z"/>
<path class="st14" d="M248.8,294.4v-31.3c0-4.3,0.8-8.5,2.5-12.3c1.6-3.7,3.9-7.1,6.8-9.9c2.8-2.8,6.2-5,9.9-6.6
c3.8-1.6,7.9-2.5,12.2-2.5h14.4v28.8h-14.4c-0.5,0-0.7,0.1-0.9,0.2c-0.3,0.1-0.6,0.3-0.8,0.6c-0.2,0.2-0.4,0.5-0.6,0.8
c-0.1,0.2-0.2,0.4-0.2,0.9v31.3H248.8z"/>
<path class="st13" d="M253.4,289.9v-26.8c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7
c3.3-1.4,6.8-2.1,10.4-2.1h9.9V256h-9.9c-1,0-1.9,0.2-2.7,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.6,0.6-1.1,1.4-1.5,2.3
c-0.4,0.8-0.5,1.7-0.5,2.7v26.8h-19.8V289.9z"/>
<path d="M284.4,242v8.4h-4.2c-1.8,0-3.4,0.3-4.9,1s-2.9,1.6-4,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v21.2h-8.4v-21.1
c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5c2.6-1.1,5.3-1.6,8.2-1.6L284.4,242L284.4,242z"/>
<path class="st14" d="M341.7,294.5c-5.1,0-9.9-1.2-14.3-3.5c-0.9-0.5-1.8-1-2.6-1.5c-0.8,0.5-1.7,1-2.5,1.5
c-4.4,2.3-9.2,3.5-14.4,3.5c-4.3,0-8.3-0.8-12.2-2.5c-3.8-1.6-7.1-3.9-10-6.7c-2.9-2.9-5.1-6.2-6.7-10s-2.5-7.9-2.5-12.2v-31.2
h28.9v31.3c0,0.4,0.1,0.7,0.2,1s0.3,0.6,0.5,0.8c0.2,0.2,0.5,0.4,0.8,0.6c0.2,0.1,0.4,0.2,0.9,0.2c0.4,0,0.7-0.1,1-0.2
c0.4-0.1,0.6-0.3,0.8-0.5c0.2-0.2,0.4-0.5,0.5-0.8s0.2-0.6,0.2-1v-31.2h28.8v31.1c0,0.4,0.1,0.7,0.2,1c0.1,0.4,0.3,0.6,0.5,0.8
c0.2,0.2,0.5,0.4,0.8,0.6c0.2,0.1,0.4,0.2,0.9,0.2c0.4,0,0.7-0.1,1-0.2s0.6-0.3,0.8-0.5c0.2-0.2,0.4-0.5,0.5-0.8s0.2-0.6,0.2-1
v-31.2h28.8v31.1c0,4.2-0.8,8.3-2.5,12.2c-1.6,3.8-3.9,7.1-6.7,10c-2.8,2.8-6.2,5.1-9.9,6.7C350.2,293.6,346.1,294.5,341.7,294.5z"
/>
<path class="st13" d="M341.7,289.9c-4.3,0-8.5-1-12.2-2.9c-1.7-0.9-3.3-1.9-4.7-3.1c-1.4,1.2-3,2.2-4.6,3.1c-3.7,2-7.8,3-12.3,3
c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5c-1.4-3.3-2.1-6.8-2.1-10.4v-26.7h19.8v26.7
c0,1,0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5c0.8,0.4,1.7,0.5,2.7,0.5s1.9-0.2,2.8-0.5
c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8v-26.7h19.7v26.7c0,1,0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3
c0.6,0.6,1.4,1.1,2.3,1.5c0.8,0.4,1.7,0.5,2.7,0.5s1.9-0.2,2.8-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3
s0.5-1.8,0.5-2.8v-26.7h19.7v26.7c0,3.6-0.7,7.1-2.1,10.4c-1.4,3.2-3.3,6.1-5.8,8.5c-2.4,2.4-5.3,4.4-8.5,5.7
C349,289.2,345.4,289.9,341.7,289.9z"/>
<path d="M362.9,242.1v21c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.6,6.8c-1.9,1.9-4.2,3.5-6.7,4.6s-5.3,1.6-8.2,1.6
c-3.4,0-6.6-0.8-9.6-2.3c-2.9-1.5-5.4-3.6-7.3-6.2c-1.9,2.6-4.4,4.7-7.3,6.2s-6.1,2.3-9.6,2.3c-2.9,0-5.6-0.5-8.2-1.6
s-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2v-21h8.4v21c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1s2.5,2.1,4,2.7
c1.5,0.7,3.2,1,4.9,1c1.8,0,3.4-0.3,5-1s2.9-1.6,4.1-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-21h8.4v21c0,1.8,0.3,3.4,1,5
s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4,2.7c1.5,0.7,3.2,1,4.9,1c1.8,0,3.4-0.3,5-1s2.9-1.6,4.1-2.7s2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5
v-21H362.9z"/>
<path class="st14" d="M387,294.6c-4.2,0-8.2-0.8-12-2.4s-7.2-3.9-10.2-6.8c-3.1-3.1-5.4-6.6-6.9-10.5c-1.4-3.8-2.2-7.7-2.2-11.6
c0-4,0.7-7.9,2.2-11.6c1.5-3.9,3.8-7.4,6.9-10.4c3-3,6.6-5.4,10.4-6.9s7.7-2.3,11.7-2.3s7.9,0.8,11.7,2.3c3.9,1.5,7.4,3.9,10.4,6.9
l10.1,10.1l-12,12l12,12L409,285.5c-2.9,2.9-6.4,5.2-10.2,6.8C395.2,293.8,391.1,294.6,387,294.6z"/>
<path class="st13" d="M387,290c-3.6,0-7-0.7-10.2-2s-6.2-3.3-8.7-5.8c-2.6-2.6-4.6-5.6-5.9-9c-1.2-3.2-1.9-6.6-1.9-10
s0.6-6.7,1.9-9.9c1.3-3.3,3.3-6.3,5.9-8.9s5.6-4.6,8.9-5.9s6.6-1.9,10-1.9s6.8,0.7,10,1.9c3.3,1.3,6.3,3.3,8.9,5.9l6.9,6.9l-12,12
l12,12l-6.9,6.9c-2.5,2.5-5.4,4.5-8.7,5.8C394,289.4,390.5,290,387,290z"/>
<path d="M398.9,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6s-5.5-0.5-8.1-1.6s-4.8-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9l-23.4,23.4c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L398.9,269.4z M378,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C382.3,251.1,380,252.2,378,254.2z"/>
<path class="st14" d="M428.8,294.6c-4.2,0-8.2-0.8-12-2.4s-7.2-3.9-10.2-6.8c-3.1-3.1-5.4-6.6-6.9-10.5c-1.4-3.8-2.2-7.7-2.2-11.6
c0-4,0.7-7.9,2.2-11.6c1.5-3.9,3.8-7.4,6.9-10.4c3-3,6.6-5.4,10.4-6.9s7.7-2.3,11.7-2.3s7.9,0.8,11.7,2.3c3.9,1.5,7.4,3.9,10.4,6.9
l10.1,10.1l-12,12l12,12l-10.1,10.1c-2.9,2.9-6.4,5.2-10.2,6.8C436.9,293.8,432.9,294.6,428.8,294.6z"/>
<path class="st13" d="M428.8,290c-3.6,0-7-0.7-10.2-2s-6.2-3.3-8.7-5.8c-2.6-2.6-4.6-5.6-5.9-9c-1.2-3.2-1.9-6.6-1.9-10
s0.6-6.7,1.9-9.9c1.3-3.3,3.3-6.3,5.9-8.9s5.6-4.6,8.9-5.9s6.6-1.9,10-1.9s6.8,0.7,10,1.9c3.3,1.3,6.3,3.3,8.9,5.9l6.9,6.9l-12,12
l12,12l-6.9,6.9c-2.5,2.5-5.4,4.5-8.7,5.8C435.7,289.4,432.3,290,428.8,290z"/>
<path d="M440.7,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6c-2.8,0-5.5-0.5-8.1-1.6s-4.8-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9L423,274.8c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L440.7,269.4z M419.7,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C424.1,251.1,421.7,252.2,419.7,254.2z"/>
<path class="st14" d="M473,294.4V280c0-0.5-0.1-0.7-0.2-0.9c-0.1-0.3-0.3-0.6-0.6-0.8c-0.2-0.2-0.5-0.4-0.8-0.6
c-0.2-0.1-0.4-0.2-0.9-0.2c-0.4,0-0.7,0.1-1,0.2s-0.6,0.3-0.8,0.5s-0.4,0.5-0.6,0.8c-0.1,0.2-0.2,0.4-0.2,0.9v14.4h-28.8v-79.4
h28.8v33.9c0.8-0.1,1.7-0.1,2.6-0.1c0.5,0,0.7-0.1,0.9-0.2c0.3-0.1,0.6-0.3,0.8-0.6c0.2-0.2,0.4-0.5,0.5-0.8s0.2-0.6,0.2-1v-14.3
h28.8v14.4c0,5.2-1.2,10-3.5,14.4c-0.5,0.9-1,1.7-1.5,2.5c0.5,0.8,1,1.7,1.5,2.6c2.3,4.4,3.5,9.2,3.5,14.3v14.4L473,294.4
L473,294.4z"/>
<path class="st13" d="M477.5,289.9V280c0-1-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3c-0.6-0.6-1.4-1.1-2.3-1.5
c-0.8-0.4-1.7-0.5-2.7-0.5s-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7v9.9
h-19.7v-70.4h19.7v34.7c2.3-0.6,4.7-1,7.1-1c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8
v-9.8h19.7v9.8c0,4.4-1,8.5-3,12.3c-0.9,1.7-1.9,3.2-3.1,4.6c1.2,1.4,2.2,3,3.1,4.7c2,3.7,2.9,7.9,2.9,12.2v9.9L477.5,289.9
L477.5,289.9z"/>
<path d="M489.2,255.8c-1.5,2.9-3.6,5.3-6.2,7.3c2.6,1.9,4.7,4.4,6.2,7.3s2.3,6.1,2.3,9.6v4.2h-8.4V280c0-1.8-0.3-3.4-1-4.9
s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1c-1.8,0-3.4,0.3-5,1c-1.6,0.7-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9v4.2h-8.4V280v-54.8h8.4v38.1c1.8-1.4,3.8-2.4,6-3.2s4.4-1.1,6.8-1.1c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-4.1h8.4v4.1C491.5,249.7,490.8,252.9,489.2,255.8z"/>
</g>
<g id="Fond_texte_1_">
<path class="st13" d="M114.8,244.9v-19.7h4.4c-1.2-0.7-2.3-1.6-3.2-2.6c-1.6-1.6-2.9-3.6-3.8-5.8c-1-2.2-1.4-4.6-1.4-7.2
c0-2.5,0.5-4.9,1.4-7.2c0.9-2.2,2.2-4.1,3.9-5.8c1.6-1.6,3.6-2.9,5.8-3.9s4.6-1.4,7.2-1.4h31.1V211h-4.5c1.1,0.7,2.2,1.5,3.2,2.5
c1.7,1.6,3,3.6,4,5.8c1,2.2,1.4,4.6,1.4,7.2c0,2.5-0.5,4.9-1.4,7.2c-0.9,2.2-2.3,4.1-3.9,5.8c-1.7,1.7-3.6,3-5.8,3.9
c-2.2,1-4.6,1.4-7.2,1.4h-31.2V244.9z"/>
<path d="M154.3,197v8.4h-25.4c-1.2,0-2.2,0.4-3,1.2c-0.8,0.8-1.2,1.8-1.2,3s0.4,2.2,1.2,3.1c0.8,0.8,1.8,1.3,3,1.3h16.9
c1.8,0,3.4,0.3,4.9,1s2.9,1.5,4,2.7c1.2,1.1,2.1,2.5,2.7,4c0.7,1.5,1,3.2,1,4.9c0,1.8-0.3,3.4-1,4.9s-1.6,2.9-2.7,4
c-1.2,1.2-2.5,2.1-4,2.7c-1.5,0.7-3.2,1-4.9,1h-25.3v-8.4h25.3c1.3,0,2.3-0.4,3.1-1.2c0.8-0.8,1.2-1.8,1.2-3.1c0-1.2-0.4-2.2-1.2-3
s-1.8-1.2-3.1-1.2h-16.9c-1.8,0-3.4-0.3-4.9-1s-2.9-1.6-4-2.7c-1.1-1.2-2-2.5-2.7-4s-1-3.2-1-4.9c0-1.8,0.3-3.4,1-4.9
s1.5-2.9,2.7-4c1.1-1.1,2.5-2,4-2.7s3.2-1,4.9-1L154.3,197L154.3,197z"/>
<polygon class="st13" points="200.4,236.9 200.4,191.4 220,191.4 220,239.1 "/>
<path d="M206,231.9v-34.8h8.4v35.7"/>
<path class="st13" d="M193.4,289.9c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7c3.3-1.4,6.8-2.1,10.4-2.1h7
v-16.9h19.7V263c0,3.6-0.7,7.1-2.1,10.4c-1.4,3.2-3.3,6.1-5.7,8.5c-2.4,2.5-5.3,4.4-8.5,5.8C200.5,289.1,197,289.9,193.4,289.9z
M193.4,256.1c-1,0-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7s0.2,1.9,0.5,2.8
c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5c0.9,0.4,1.8,0.5,2.8,0.5s1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5
c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8v-7H193.4z"/>
<path d="M214.4,225.1V263c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.5,6.8c-1.9,1.9-4.1,3.5-6.7,4.6c-2.6,1.1-5.3,1.6-8.2,1.6
s-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2c0-2.9,0.5-5.7,1.6-8.2
c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5s5.3-1.6,8.2-1.6h12.7v-16.9 M193.4,275.8c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-12.7h-12.7c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7C189.9,275.5,191.6,275.8,193.4,275.8z"/>
<path class="st13" d="M31.4,290c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4v-43.6h19.7v16.9h7.1c3.7,0,7.2,0.7,10.5,2.1c3.2,1.4,6,3.3,8.4,5.7c2.4,2.4,4.3,5.2,5.7,8.4
c1.4,3.2,2.1,6.8,2.1,10.5c0,3.6-0.7,7.1-2.1,10.4c-1.4,3.2-3.3,6.1-5.7,8.5c-2.4,2.5-5.3,4.4-8.5,5.8
C38.6,289.3,35.1,290,31.4,290z M24.3,263.3c0,1,0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5s1.8,0.5,2.8,0.5
s1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8s-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3
c-0.6-0.6-1.4-1.1-2.3-1.5c-0.8-0.4-1.7-0.5-2.7-0.5h-7.1C24.3,256.3,24.3,263.3,24.3,263.3z"/>
<path d="M39.6,243.9c2.5,1.1,4.8,2.6,6.7,4.5c1.9,1.9,3.4,4.1,4.5,6.7c1.1,2.5,1.6,5.3,1.6,8.2c0,2.9-0.5,5.6-1.6,8.2
s-2.6,4.8-4.5,6.8c-1.9,1.9-4.1,3.5-6.7,4.6c-2.5,1.1-5.3,1.6-8.2,1.6c-2.9,0-5.6-0.5-8.2-1.6s-4.8-2.6-6.8-4.6
c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2v-37.9h8.4v16.8h12.8C34.3,242.2,37,242.8,39.6,243.9z M31.4,276
c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5s-0.3-3.4-1-4.9s-1.6-2.9-2.7-4
c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1H18.6v12.7c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7
C27.9,275.7,29.6,276,31.4,276z"/>
<path class="st13" d="M75.9,290c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.3-5.3-5.7-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.7-8.4c2.4-2.4,5.3-4.3,8.5-5.7c3.3-1.4,6.8-2.1,10.4-2.1
c3.7,0,7.2,0.7,10.5,2.1c3.2,1.4,6,3.3,8.4,5.7c2.5,2.4,4.4,5.3,5.8,8.5c1.4,3.2,2.1,6.8,2.1,10.5c0,3.6-0.7,7.1-2.1,10.4
c-1.4,3.2-3.3,6.1-5.8,8.5c-2.4,2.4-5.3,4.4-8.5,5.7C83.2,289.3,79.6,290,75.9,290z M75.9,256.3c-1,0-1.9,0.2-2.8,0.5
c-0.9,0.4-1.6,0.9-2.3,1.5c-0.6,0.6-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7s0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3
c0.6,0.6,1.4,1.1,2.3,1.5c0.9,0.4,1.8,0.5,2.8,0.5s1.9-0.2,2.8-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3
s0.5-1.8,0.5-2.8s-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3c-0.6-0.6-1.4-1.1-2.3-1.5S76.9,256.3,75.9,256.3z"/>
<path d="M54.9,263.3c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.5-6.7c1.9-1.9,4.1-3.4,6.7-4.5c2.6-1.1,5.3-1.6,8.2-1.6
s5.7,0.5,8.2,1.6s4.8,2.6,6.7,4.5s3.5,4.1,4.6,6.7c1.1,2.5,1.6,5.3,1.6,8.2c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.6,6.8
c-1.9,1.9-4.2,3.5-6.7,4.6s-5.3,1.6-8.2,1.6s-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.7-4.6c-1.9-1.9-3.4-4.2-4.5-6.8
C55.5,268.9,54.9,266.1,54.9,263.3z M63.2,263.3c0,1.8,0.3,3.4,1,5c0.7,1.6,1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7
c1.6,0.7,3.2,1,5,1s3.4-0.3,5-1c1.6-0.7,2.9-1.6,4.1-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5s-0.3-3.4-1-4.9s-1.6-2.9-2.7-4
c-1.2-1.2-2.5-2.1-4.1-2.7c-1.6-0.7-3.2-1-5-1s-3.4,0.3-5,1c-1.6,0.7-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
C63.5,259.9,63.2,261.5,63.2,263.3z"/>
<path class="st13" d="M120.9,289.9c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5
c-1.4-3.3-2.1-6.8-2.1-10.4c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7c3.3-1.4,6.8-2.1,10.4-2.1
c3.7,0,7.2,0.7,10.5,2.1c3.2,1.4,6,3.3,8.4,5.7c2.4,2.4,4.3,5.2,5.7,8.4c1.4,3.2,2.1,6.8,2.1,10.5v26.8h-26.7V289.9z M120.9,256.1
c-1,0-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7s0.2,1.9,0.5,2.8
c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5c0.9,0.4,1.8,0.5,2.8,0.5h7v-7.1c0-1-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3
c-0.6-0.6-1.4-1.1-2.3-1.5C122.8,256.2,121.9,256.1,120.9,256.1z"/>
<path d="M120.9,242c2.9,0,5.7,0.5,8.2,1.6s4.8,2.6,6.7,4.5s3.4,4.1,4.5,6.7c1.1,2.5,1.6,5.3,1.6,8.2v21.2h-21
c-2.9,0-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2c0-2.9,0.5-5.7,1.6-8.2
c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5C115.3,242.6,118,242,120.9,242z M133.6,275.8V263c0-1.8-0.3-3.4-1-4.9
s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7c1.6,0.7,3.2,1,5,1L133.6,275.8L133.6,275.8z"/>
<g>
<path class="st13" d="M155.4,174.5h19.7v34.7c2.3-0.6,4.7-1,7.1-1c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5
c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8v-9.8h19.7v9.8c0,4.4-1,8.5-3,12.3c-0.9,1.7-1.9,3.2-3.1,4.6c1.2,1.4,2.2,3,3.1,4.7
c2,3.8,2.9,7.9,2.9,12.2v9.9h-19.7v-9.9c0-1-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3c-0.6-0.6-1.4-1.1-2.3-1.5
c-0.8-0.4-1.7-0.5-2.7-0.5s-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.6,0.6-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7v12.4
l-19.7,1.1v-73.9H155.4z"/>
<path d="M161.1,242.5V235v-54.8h8.4v38.1c1.8-1.4,3.8-2.4,6-3.2c2.2-0.8,4.4-1.1,6.8-1.1c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-4.1h8.4v4.1c0,3.5-0.8,6.7-2.3,9.6s-3.6,5.3-6.2,7.3c2.6,1.9,4.7,4.4,6.2,7.3
s2.3,6.1,2.3,9.6v4.2h-8.4V235c0-1.8-0.3-3.4-1-4.9s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1
c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v7.1"/>
<path class="st13" d="M138.7,289.9v-26.8c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7
c1.5-0.7,3.2-1.2,4.8-1.5l0.4-0.1l14.8-0.8v20h-9.6c-1,0-1.9,0.2-2.7,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.2,1.4-1.5,2.3
c-0.4,0.8-0.5,1.7-0.5,2.7v26.8h-19.8V289.9z"/>
<path d="M169.4,242v8.4h-3.9c-1.8,0-3.4,0.3-4.9,1s-2.9,1.6-4,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v21.2h-8.4v-21.1
c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5c1.2-0.5,2.5-0.9,3.8-1.2"/>
</g>
<path class="st13" d="M238.4,290c-3.6,0-7-0.7-10.2-2s-6.2-3.3-8.7-5.8c-2.6-2.6-4.6-5.6-5.9-9c-1.2-3.2-1.9-6.6-1.9-10
s0.6-6.7,1.9-9.9c1.3-3.3,3.3-6.3,5.9-8.9s5.6-4.6,8.9-5.9s6.6-1.9,10-1.9s6.8,0.7,10,1.9c3.3,1.3,6.3,3.3,8.9,5.9l6.9,6.9l-12,12
l12,12l-6.9,6.9c-2.5,2.5-5.4,4.5-8.7,5.8C245.4,289.4,242,290,238.4,290z"/>
<path d="M250.3,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6c-2.8,0-5.5-0.5-8.1-1.6s-4.9-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9l-23.4,23.4c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L250.3,269.4z M229.4,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C233.7,251.1,231.4,252.2,229.4,254.2z"/>
<path class="st13" d="M253.4,289.9v-26.8c0-3.7,0.7-7.2,2.1-10.5c1.4-3.2,3.3-6,5.8-8.5c2.4-2.4,5.3-4.3,8.5-5.7
c3.3-1.4,6.8-2.1,10.4-2.1h9.9V256h-9.9c-1,0-1.9,0.2-2.7,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.6,0.6-1.1,1.4-1.5,2.3
c-0.4,0.8-0.5,1.7-0.5,2.7v26.8h-19.8V289.9z"/>
<path d="M284.4,242v8.4h-4.2c-1.8,0-3.4,0.3-4.9,1s-2.9,1.6-4,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v21.2h-8.4v-21.1
c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5c2.6-1.1,5.3-1.6,8.2-1.6L284.4,242L284.4,242z"/>
<path class="st13" d="M341.7,289.9c-4.3,0-8.5-1-12.2-2.9c-1.7-0.9-3.3-1.9-4.7-3.1c-1.4,1.2-3,2.2-4.6,3.1c-3.7,2-7.8,3-12.3,3
c-3.6,0-7.1-0.7-10.4-2.1c-3.2-1.4-6.1-3.3-8.5-5.8c-2.4-2.4-4.4-5.3-5.8-8.5c-1.4-3.3-2.1-6.8-2.1-10.4v-26.7h19.8v26.7
c0,1,0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3c0.6,0.6,1.4,1.1,2.3,1.5c0.8,0.4,1.7,0.5,2.7,0.5s1.9-0.2,2.8-0.5
c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8v-26.7h19.7v26.7c0,1,0.2,1.9,0.5,2.8c0.4,0.9,0.9,1.6,1.5,2.3
c0.6,0.6,1.4,1.1,2.3,1.5c0.8,0.4,1.7,0.5,2.7,0.5s1.9-0.2,2.8-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3
s0.5-1.8,0.5-2.8v-26.7h19.7v26.7c0,3.6-0.7,7.1-2.1,10.4c-1.4,3.2-3.3,6.1-5.8,8.5c-2.4,2.4-5.3,4.4-8.5,5.7
C349,289.2,345.4,289.9,341.7,289.9z"/>
<path d="M362.9,242.1v21c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.6,6.8c-1.9,1.9-4.2,3.5-6.7,4.6s-5.3,1.6-8.2,1.6
c-3.4,0-6.6-0.8-9.6-2.3c-2.9-1.5-5.4-3.6-7.3-6.2c-1.9,2.6-4.4,4.7-7.3,6.2s-6.1,2.3-9.6,2.3c-2.9,0-5.6-0.5-8.2-1.6
s-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2v-21h8.4v21c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1s2.5,2.1,4,2.7
c1.5,0.7,3.2,1,4.9,1c1.8,0,3.4-0.3,5-1s2.9-1.6,4.1-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-21h8.4v21c0,1.8,0.3,3.4,1,5
s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4,2.7c1.5,0.7,3.2,1,4.9,1c1.8,0,3.4-0.3,5-1s2.9-1.6,4.1-2.7s2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5
v-21H362.9z"/>
<path class="st13" d="M387,290c-3.6,0-7-0.7-10.2-2s-6.2-3.3-8.7-5.8c-2.6-2.6-4.6-5.6-5.9-9c-1.2-3.2-1.9-6.6-1.9-10
s0.6-6.7,1.9-9.9c1.3-3.3,3.3-6.3,5.9-8.9s5.6-4.6,8.9-5.9s6.6-1.9,10-1.9s6.8,0.7,10,1.9c3.3,1.3,6.3,3.3,8.9,5.9l6.9,6.9l-12,12
l12,12l-6.9,6.9c-2.5,2.5-5.4,4.5-8.7,5.8C394,289.4,390.5,290,387,290z"/>
<path d="M398.9,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6s-5.5-0.5-8.1-1.6s-4.8-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9l-23.4,23.4c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L398.9,269.4z M378,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C382.3,251.1,380,252.2,378,254.2z"/>
<path class="st13" d="M428.8,290c-3.6,0-7-0.7-10.2-2s-6.2-3.3-8.7-5.8c-2.6-2.6-4.6-5.6-5.9-9c-1.2-3.2-1.9-6.6-1.9-10
s0.6-6.7,1.9-9.9c1.3-3.3,3.3-6.3,5.9-8.9s5.6-4.6,8.9-5.9s6.6-1.9,10-1.9s6.8,0.7,10,1.9c3.3,1.3,6.3,3.3,8.9,5.9l6.9,6.9l-12,12
l12,12l-6.9,6.9c-2.5,2.5-5.4,4.5-8.7,5.8C435.7,289.4,432.3,290,428.8,290z"/>
<path d="M440.7,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6c-2.8,0-5.5-0.5-8.1-1.6s-4.8-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9L423,274.8c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L440.7,269.4z M419.7,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C424.1,251.1,421.7,252.2,419.7,254.2z"/>
<path class="st13" d="M477.5,289.9V280c0-1-0.2-1.9-0.5-2.7c-0.4-0.9-0.9-1.6-1.5-2.3c-0.6-0.6-1.4-1.1-2.3-1.5
c-0.8-0.4-1.7-0.5-2.7-0.5s-1.9,0.2-2.8,0.5c-0.9,0.4-1.6,0.9-2.3,1.5c-0.7,0.7-1.1,1.4-1.5,2.3c-0.4,0.8-0.5,1.7-0.5,2.7v9.9
h-19.7v-70.4h19.7v34.7c2.3-0.6,4.7-1,7.1-1c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.5c0.6-0.6,1.1-1.4,1.5-2.3s0.5-1.8,0.5-2.8
v-9.8h19.7v9.8c0,4.4-1,8.5-3,12.3c-0.9,1.7-1.9,3.2-3.1,4.6c1.2,1.4,2.2,3,3.1,4.7c2,3.7,2.9,7.9,2.9,12.2v9.9L477.5,289.9
L477.5,289.9z"/>
<path d="M489.2,255.8c-1.5,2.9-3.6,5.3-6.2,7.3c2.6,1.9,4.7,4.4,6.2,7.3s2.3,6.1,2.3,9.6v4.2h-8.4V280c0-1.8-0.3-3.4-1-4.9
s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1c-1.8,0-3.4,0.3-5,1c-1.6,0.7-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9v4.2h-8.4V280v-54.8h8.4v38.1c1.8-1.4,3.8-2.4,6-3.2s4.4-1.1,6.8-1.1c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-4.1h8.4v4.1C491.5,249.7,490.8,252.9,489.2,255.8z"/>
</g>
<g id="Texte">
<path d="M154.3,197v8.4h-25.4c-1.2,0-2.2,0.4-3,1.2c-0.8,0.8-1.2,1.8-1.2,3s0.4,2.2,1.2,3.1c0.8,0.8,1.8,1.3,3,1.3h16.9
c1.8,0,3.4,0.3,4.9,1s2.9,1.5,4,2.7c1.2,1.1,2.1,2.5,2.7,4c0.7,1.5,1,3.2,1,4.9c0,1.8-0.3,3.4-1,4.9s-1.6,2.9-2.7,4
c-1.2,1.2-2.5,2.1-4,2.7c-1.5,0.7-3.2,1-4.9,1h-25.3v-8.4h25.3c1.3,0,2.3-0.4,3.1-1.2c0.8-0.8,1.2-1.8,1.2-3.1c0-1.2-0.4-2.2-1.2-3
s-1.8-1.2-3.1-1.2h-16.9c-1.8,0-3.4-0.3-4.9-1s-2.9-1.6-4-2.7c-1.1-1.2-2-2.5-2.7-4s-1-3.2-1-4.9c0-1.8,0.3-3.4,1-4.9
s1.5-2.9,2.7-4c1.1-1.1,2.5-2,4-2.7s3.2-1,4.9-1L154.3,197L154.3,197z"/>
<path d="M206,231.9v-34.8h8.4v35.7"/>
<path d="M214.4,225.1V263c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.5,6.8c-1.9,1.9-4.1,3.5-6.7,4.6c-2.6,1.1-5.3,1.6-8.2,1.6
s-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2c0-2.9,0.5-5.7,1.6-8.2
c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5s5.3-1.6,8.2-1.6h12.7v-16.9 M193.4,275.8c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-12.7h-12.7c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7C189.9,275.5,191.6,275.8,193.4,275.8z"/>
<path d="M39.6,243.9c2.5,1.1,4.8,2.6,6.7,4.5c1.9,1.9,3.4,4.1,4.5,6.7c1.1,2.5,1.6,5.3,1.6,8.2c0,2.9-0.5,5.6-1.6,8.2
s-2.6,4.8-4.5,6.8c-1.9,1.9-4.1,3.5-6.7,4.6c-2.5,1.1-5.3,1.6-8.2,1.6c-2.9,0-5.6-0.5-8.2-1.6s-4.8-2.6-6.8-4.6
c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2v-37.9h8.4v16.8h12.8C34.3,242.2,37,242.8,39.6,243.9z M31.4,276
c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5s-0.3-3.4-1-4.9s-1.6-2.9-2.7-4
c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1H18.6v12.7c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7
C27.9,275.7,29.6,276,31.4,276z"/>
<path d="M54.9,263.3c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.5-6.7c1.9-1.9,4.1-3.4,6.7-4.5c2.6-1.1,5.3-1.6,8.2-1.6
s5.7,0.5,8.2,1.6s4.8,2.6,6.7,4.5s3.5,4.1,4.6,6.7c1.1,2.5,1.6,5.3,1.6,8.2c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.6,6.8
c-1.9,1.9-4.2,3.5-6.7,4.6s-5.3,1.6-8.2,1.6s-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.7-4.6c-1.9-1.9-3.4-4.2-4.5-6.8
C55.5,268.9,54.9,266.1,54.9,263.3z M63.2,263.3c0,1.8,0.3,3.4,1,5c0.7,1.6,1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7
c1.6,0.7,3.2,1,5,1s3.4-0.3,5-1c1.6-0.7,2.9-1.6,4.1-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5s-0.3-3.4-1-4.9s-1.6-2.9-2.7-4
c-1.2-1.2-2.5-2.1-4.1-2.7c-1.6-0.7-3.2-1-5-1s-3.4,0.3-5,1c-1.6,0.7-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
C63.5,259.9,63.2,261.5,63.2,263.3z"/>
<path d="M120.9,242c2.9,0,5.7,0.5,8.2,1.6s4.8,2.6,6.7,4.5s3.4,4.1,4.5,6.7c1.1,2.5,1.6,5.3,1.6,8.2v21.2h-21
c-2.9,0-5.6-0.5-8.2-1.6c-2.6-1.1-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2c0-2.9,0.5-5.7,1.6-8.2
c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5C115.3,242.6,118,242,120.9,242z M133.6,275.8V263c0-1.8-0.3-3.4-1-4.9
s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4.1,2.7c1.6,0.7,3.2,1,5,1L133.6,275.8L133.6,275.8z"/>
<g>
<path d="M161.1,242.5V235v-54.8h8.4v38.1c1.8-1.4,3.8-2.4,6-3.2c2.2-0.8,4.4-1.1,6.8-1.1c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-4.1h8.4v4.1c0,3.5-0.8,6.7-2.3,9.6s-3.6,5.3-6.2,7.3c2.6,1.9,4.7,4.4,6.2,7.3
s2.3,6.1,2.3,9.6v4.2h-8.4V235c0-1.8-0.3-3.4-1-4.9s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1
c-1.8,0-3.4,0.3-5,1s-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v7.1"/>
<path d="M169.4,242v8.4h-3.9c-1.8,0-3.4,0.3-4.9,1s-2.9,1.6-4,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v21.2h-8.4v-21.1
c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5c1.2-0.5,2.5-0.9,3.8-1.2"/>
</g>
<path d="M250.3,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6c-2.8,0-5.5-0.5-8.1-1.6s-4.9-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9l-23.4,23.4c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L250.3,269.4z M229.4,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C233.7,251.1,231.4,252.2,229.4,254.2z"/>
<path d="M284.4,242v8.4h-4.2c-1.8,0-3.4,0.3-4.9,1s-2.9,1.6-4,2.7c-1.2,1.2-2.1,2.5-2.7,4c-0.7,1.5-1,3.2-1,4.9v21.2h-8.4v-21.1
c0-2.9,0.5-5.7,1.6-8.2c1.1-2.5,2.6-4.8,4.6-6.7c1.9-1.9,4.2-3.4,6.8-4.5c2.6-1.1,5.3-1.6,8.2-1.6L284.4,242L284.4,242z"/>
<path d="M362.9,242.1v21c0,2.9-0.5,5.6-1.6,8.2s-2.6,4.8-4.6,6.8c-1.9,1.9-4.2,3.5-6.7,4.6s-5.3,1.6-8.2,1.6
c-3.4,0-6.6-0.8-9.6-2.3c-2.9-1.5-5.4-3.6-7.3-6.2c-1.9,2.6-4.4,4.7-7.3,6.2s-6.1,2.3-9.6,2.3c-2.9,0-5.6-0.5-8.2-1.6
s-4.8-2.6-6.8-4.6c-1.9-1.9-3.5-4.2-4.6-6.8c-1.1-2.6-1.6-5.3-1.6-8.2v-21h8.4v21c0,1.8,0.3,3.4,1,5s1.6,2.9,2.7,4.1s2.5,2.1,4,2.7
c1.5,0.7,3.2,1,4.9,1c1.8,0,3.4-0.3,5-1s2.9-1.6,4.1-2.7c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-21h8.4v21c0,1.8,0.3,3.4,1,5
s1.6,2.9,2.7,4.1c1.2,1.2,2.5,2.1,4,2.7c1.5,0.7,3.2,1,4.9,1c1.8,0,3.4-0.3,5-1s2.9-1.6,4.1-2.7s2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5
v-21H362.9z"/>
<path d="M398.9,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6s-5.5-0.5-8.1-1.6s-4.8-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9l-23.4,23.4c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L398.9,269.4z M378,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C382.3,251.1,380,252.2,378,254.2z"/>
<path d="M440.7,269.4l5.9,5.9l-2.9,2.9c-2,2-4.3,3.5-6.9,4.6s-5.3,1.6-8.1,1.6c-2.8,0-5.5-0.5-8.1-1.6s-4.8-2.6-6.9-4.6
c-2.1-2.1-3.6-4.4-4.6-7s-1.5-5.2-1.5-7.9c0-2.7,0.5-5.3,1.5-7.9c1-2.6,2.5-4.9,4.6-6.9c2.1-2.1,4.4-3.6,7-4.6s5.2-1.5,7.9-1.5
c2.7,0,5.3,0.5,7.9,1.5s4.9,2.6,7,4.6l2.9,2.9L423,274.8c2.4,1.2,4.9,1.6,7.6,1.2s5-1.6,7-3.6L440.7,269.4z M419.7,254.2
c-2.5,2.5-3.8,5.5-3.8,9c0,1.9,0.4,3.8,1.3,5.5c0.8-0.8,1.9-1.9,3.4-3.4s3.2-3.2,4.9-4.9c1.7-1.7,3.4-3.4,5-4.9
c1.6-1.6,2.8-2.8,3.7-3.7c-2.4-1.2-4.9-1.6-7.6-1.2C424.1,251.1,421.7,252.2,419.7,254.2z"/>
<path d="M489.2,255.8c-1.5,2.9-3.6,5.3-6.2,7.3c2.6,1.9,4.7,4.4,6.2,7.3s2.3,6.1,2.3,9.6v4.2h-8.4V280c0-1.8-0.3-3.4-1-4.9
s-1.6-2.9-2.7-4c-1.2-1.2-2.5-2.1-4-2.7c-1.5-0.7-3.2-1-4.9-1c-1.8,0-3.4,0.3-5,1c-1.6,0.7-2.9,1.6-4.1,2.7c-1.2,1.2-2.1,2.5-2.7,4
c-0.7,1.5-1,3.2-1,4.9v4.2h-8.4V280v-54.8h8.4v38.1c1.8-1.4,3.8-2.4,6-3.2s4.4-1.1,6.8-1.1c1.8,0,3.4-0.3,4.9-1s2.9-1.6,4-2.7
c1.2-1.2,2.1-2.5,2.7-4.1c0.7-1.6,1-3.2,1-5v-4.1h8.4v4.1C491.5,249.7,490.8,252.9,489.2,255.8z"/>
</g>
<g id="Ebene_7">
<g>
<g>
<path class="st15" d="M497.8,327.5c-1.5,0-2.8-0.2-3.7-1.4l1-0.9l0.5-0.5c0,0,0.3-0.2,0.5,0s0.4,0.3,0.6,0.4
c0.5,0.2,1.1,0.3,1.6,0.3c0.8,0,1.7-0.3,1.9-1c0.1-0.5-0.1-0.8-0.8-0.9l-1.5-0.1c-1.7-0.2-2.6-0.9-2.2-2.7c0.4-2,2.1-2.9,4-3
c1.3,0,2.7,0.5,3,1.2c0.5,0.9-1.3,1.5-1.3,1.5c-0.1-0.1-0.2-0.3-0.3-0.4c-0.4-0.3-0.9-0.4-1.5-0.4c-0.9,0-1.4,0.4-1.5,0.9
c-0.1,0.4,0,0.8,0.8,0.8l1.5,0.1c1.8,0.2,2.6,1.2,2.2,2.8C502,326.5,500,327.5,497.8,327.5"/>
<path class="st15" d="M426.3,318.3c-1.3,2.4-5.5,9.3-5.5,9.3h-1.9l-0.8-13.2c0,0,2.7,1.3,2.7,4.1l0.2,4.5l4.9-8.6
C426,314.4,427.6,315.9,426.3,318.3"/>
<path class="st15" d="M431,323.5h-1.9c-0.9,0-1.4,0.4-1.6,1.1s0.1,1.1,1.1,1.1c0.7,0,1.1-0.1,1.6-0.5c0.3-0.2,0.5-0.6,0.7-1.2
L431,323.5 M431.6,327.6c-1,0-1.4-0.8-1.4-0.8c-0.8,0.6-1.5,0.9-2.6,0.9s-1.8-0.3-2.2-0.9c-0.4-0.5-0.4-1.3-0.2-2.2
c0.4-1.5,1.8-2.8,4-2.8h2.2l0.1-0.5c0.3-1.1-0.1-1.5-1.4-1.5c-0.9,0-1.3,0.2-2,0c-0.6-0.2-1.1-0.7-1.1-0.7c1.2-1,2.2-1.3,3.8-1.3
c2.6,0,3.7,1.1,3.1,3.4l-1.7,6.4H431.6z"/>
<path class="st15" d="M449.8,316.7h-1.1l-1.7,6.4c-0.9,3.7-3.7,4.5-3.7,4.5l2.9-10.9h-3.4c0,0,0.3-2.3,2.7-2.3h7.1
C452.7,314.4,451.8,316.7,449.8,316.7"/>
<path class="st15" d="M455.3,327.6l1.6-5.9c0.3-1.3-0.3-1.7-1.1-1.7c-0.7,0-1.6,0.4-2,1.7l-0.7,2.7c-0.8,2.8-3.2,3.2-3.2,3.2
l3.5-13.2h2.3l-1.2,4.4c0.8-0.7,1.7-1,2.5-1c2.1,0,2.8,1.5,2.2,3.5l-0.6,2.1l-1.1,4.2L455.3,327.6"/>
<path class="st15" d="M437.6,324.3c-0.8,2.8-3.2,3.2-3.2,3.2l3.5-13.2h2.3L437.6,324.3"/>
<path class="st15" d="M465.9,320.3c-0.2-0.3-0.5-0.4-1-0.4s-0.9,0.1-1.2,0.4c-0.6,0.5-0.9,1.3-1.2,2.3c-0.3,1-0.4,1.9-0.1,2.4
c0.2,0.3,0.5,0.4,1,0.4s0.9-0.1,1.2-0.4c0.6-0.5,0.9-1.4,1.2-2.4S466.3,320.8,465.9,320.3 M466.2,326.4c-0.7,0.6-1.9,1.2-3.2,1.2
c-1.4,0-2.2-0.6-2.6-1.2c-0.6-0.9-0.5-2-0.1-3.8c0.5-1.7,1-2.8,2.1-3.7c0.7-0.6,1.8-1.2,3.2-1.2s2.2,0.6,2.6,1.2
c0.6,0.9,0.5,2,0.1,3.7C467.7,324.4,467.2,325.4,466.2,326.4"/>
<path class="st15" d="M475.6,320.4c-0.3-0.4-0.5-0.6-1.1-0.6c-0.7,0-1.7,0.6-2,1.8l-0.6,2.3c-0.8,3.2-3.3,3.5-3.3,3.5l2.6-9.7
h2.3l-0.2,0.9c0.6-0.6,1.6-1,2.6-1c0.9,0,1.5,0.2,2,0.9L475.6,320.4"/>
<path class="st15" d="M482.8,320.7c-0.1-0.6-0.5-1-1.3-1s-1.4,0.4-1.8,1c-0.2,0.4-0.4,0.6-0.5,1h3.6
C482.8,321.3,482.8,321,482.8,320.7 M483,323.3h-4.3c-0.3,1.2,0.2,2.2,1.5,2.2c1,0,1.6-0.3,2.4-0.9l1,1.4c-1.2,1-2.3,1.5-4,1.5
c-2.2,0-4.1-1-3-4.9c0.8-3.2,3-4.9,5.4-4.9c2.6,0,3.6,2,2.9,4.6C484.9,322.3,484.6,323.3,483,323.3"/>
<path class="st15" d="M491.3,324.2l0.7-2.6c0.3-1.3-0.3-1.8-1.1-1.8c-0.7,0-1.7,0.4-2,1.8l-1.2,4.3l-0.4,1.5H485l2.6-9.7h2.3
l-0.2,0.9c0.8-0.7,1.8-1,2.6-1c0.9,0,1.6,0.3,2,0.9c0.6,0.8,0.5,1.7,0.2,2.7l-1.6,6.2C492.8,327.4,490.3,327.5,491.3,324.2"/>
</g>
<g>
<path class="st16" d="M392.4,304.3c-7.4,0-13.7,4.8-15.9,11.5c-2.2-6.7-8.4-11.5-15.8-11.5c-9.2,0-16.7,7.5-16.7,16.7
s7.5,16.7,16.7,16.7c7.4,0,13.7-4.8,15.8-11.5c2.2,6.7,8.5,11.5,15.9,11.5c9.2,0,16.7-7.5,16.7-16.7S401.6,304.3,392.4,304.3z
M392.4,336c-8.3,0-15.1-6.7-15.1-15s6.7-15,15.1-15c8.3,0,15.1,6.7,15.1,15C407.5,329.3,400.7,336,392.4,336z"/>
<g>
<rect x="353.5" y="319.6" class="st13" width="14.4" height="0.7"/>
<rect x="357.1" y="327.5" class="st13" width="8.3" height="0.7"/>
<path class="st13" d="M349,325v-3.3h1.8v3.4c0,1.2-0.8,1.8-2.2,1.8c-1.4,0-2.2-0.6-2.2-1.8v-3.4h1.8v3.3c0,0.3,0.1,0.4,0.4,0.4
C348.9,325.4,349,325.3,349,325"/>
<polygon class="st13" points="354.7,326.8 353.7,324.8 353.6,324.8 353.6,326.8 352.1,326.8 352.1,321.7 353.8,321.7
354.8,323.8 354.8,323.8 354.8,321.7 356.4,321.7 356.4,326.8 "/>
<rect x="358" y="321.7" class="st13" width="1.7" height="5.1"/>
<polygon class="st13" points="363.7,323.1 363.7,326.8 362,326.8 362,323.1 360.8,323.1 360.9,321.7 364.9,321.7 364.8,323.1
"/>
<polygon class="st13" points="366,326.8 366,321.7 369.4,321.7 369.3,323 367.8,323 367.8,323.7 369.1,323.7 369.1,324.8
367.8,324.8 367.8,325.6 369.4,325.6 369.3,326.8 "/>
<path class="st13" d="M372.6,323h-0.2v2.5h0.2c0.6,0,0.7-0.5,0.7-1.2C373.3,323.4,373.2,323,372.6,323 M372.6,326.8h-2v-5.1h2
c1.8,0,2.4,1,2.4,2.5C375.1,325.6,374.5,326.8,372.6,326.8"/>
<polygon class="st13" points="353.5,318.9 353.5,313.7 355.2,313.7 355.2,317.5 356.7,317.5 356.5,318.9 "/>
<rect x="357.1" y="313.7" class="st13" width="1.7" height="5.1"/>
<polygon class="st13" points="363.1,318.9 360.5,318.9 359.5,313.7 361.4,313.7 361.8,316.9 361.9,316.9 362.2,313.7 364,313.7
"/>
<polygon class="st13" points="364.6,318.9 364.6,313.7 368,313.7 367.9,315.1 366.4,315.1 366.4,315.7 367.7,315.7 367.7,316.9
366.4,316.9 366.4,317.6 368,317.6 367.9,318.9 "/>
</g>
<path class="st16" d="M393.4,331.8h-1.1c0,0-2.5,0.1-3.8-3.4l-5.5-15.7c0,0,4.7,2,5.9,6L393.4,331.8"/>
<path class="st16" d="M400.5,315.2h-1.1l-1.8,6.8c-1,3.9-3.9,4.7-3.9,4.7l3-11.5h-3.5c0,0,0.3-2.4,2.9-2.4h7.5
C403.5,312.8,402.6,315.2,400.5,315.2"/>
</g>
</g>
</g>
<g id="masque">
<polygon class="st13" points="179.6,226.6 175.1,228.7 172.2,232 172.2,240.4 172.2,244.9 174,245.8 186.7,240.7 191.1,236.5
190.4,231.3 186.4,226.6 "/>
<polygon class="st13" points="140,242 139.3,245.8 141.9,249.4 143.7,251.6 147,246.8 148.2,242.7 143.2,242.2 "/>
<polygon class="st13" points="251.2,260.2 251.2,264.8 253.4,267.3 255.7,264.8 255.7,261 253.6,259.5 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 60 KiB

+58
View File
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 250 35" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-miterlimit:10;">
<g id="Ebene-1" serif:id="Ebene 1">
<g>
<path d="M7.532,12.709L7.532,13.161L5.771,13.161L5.771,12.614C5.771,11.115 5.2,10.234 3.867,10.234C2.535,10.234 1.964,11.115 1.964,12.59C1.964,16.326 7.555,16.683 7.555,21.37C7.555,23.893 6.342,25.534 3.796,25.534C1.25,25.534 0.06,23.893 0.06,21.37L0.06,20.418L1.797,20.418L1.797,21.465C1.797,22.964 2.416,23.845 3.748,23.845C5.081,23.845 5.699,22.964 5.699,21.465C5.699,17.753 0.131,17.396 0.131,12.709C0.131,10.139 1.321,8.545 3.819,8.545C6.342,8.545 7.532,10.187 7.532,12.709" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M16.288,16.088L16.288,17.753L12.219,17.753L12.219,23.678L17.216,23.678L17.216,25.368L10.363,25.368L10.363,8.711L17.216,8.711L17.216,10.401L12.219,10.401L12.219,16.088L16.288,16.088Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M26.258,25.344L24.473,25.344L21.713,12.09L21.713,25.368L20.095,25.368L20.095,8.711L22.689,8.711L25.425,22.013L28.066,8.711L30.66,8.711L30.66,25.368L28.899,25.368L28.899,11.971L26.258,25.344Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M39.678,16.088L39.678,17.753L35.609,17.753L35.609,23.678L40.606,23.678L40.606,25.368L33.753,25.368L33.753,8.711L40.606,8.711L40.606,10.401L35.609,10.401L35.609,16.088L39.678,16.088Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M50.719,12.709L50.719,13.161L48.958,13.161L48.958,12.614C48.958,11.115 48.387,10.234 47.054,10.234C45.722,10.234 45.151,11.115 45.151,12.59C45.151,16.326 50.742,16.683 50.742,21.37C50.742,23.893 49.529,25.534 46.983,25.534C44.437,25.534 43.247,23.893 43.247,21.37L43.247,20.418L44.984,20.418L44.984,21.465C44.984,22.964 45.603,23.845 46.935,23.845C48.268,23.845 48.886,22.964 48.886,21.465C48.886,17.753 43.318,17.396 43.318,12.709C43.318,10.139 44.508,8.545 47.007,8.545C49.529,8.545 50.719,10.187 50.719,12.709" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M55.977,25.368L55.977,10.401L52.908,10.401L52.908,8.711L60.903,8.711L60.903,10.401L57.833,10.401L57.833,25.368L55.977,25.368Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M69.302,16.088L69.302,17.753L65.233,17.753L65.233,23.678L70.23,23.678L70.23,25.368L63.377,25.368L63.377,8.711L70.23,8.711L70.23,10.401L65.233,10.401L65.233,16.088L69.302,16.088Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M76.369,16.564C77.844,16.564 78.725,16.088 78.725,14.279L78.725,12.685C78.725,11.186 78.177,10.401 76.797,10.401L74.989,10.401L74.989,16.564L76.369,16.564ZM76.845,8.711C79.462,8.711 80.557,10.044 80.557,12.519L80.557,13.875C80.557,15.707 79.915,16.849 78.487,17.301C80.01,17.753 80.581,18.991 80.581,20.775L80.581,23.369C80.581,24.107 80.604,24.797 80.914,25.368L79.034,25.368C78.82,24.892 78.725,24.464 78.725,23.345L78.725,20.728C78.725,18.848 77.844,18.253 76.298,18.253L74.989,18.253L74.989,25.368L73.133,25.368L73.133,8.711L76.845,8.711Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M89.623,16.088L89.623,17.753L85.554,17.753L85.554,23.678L90.551,23.678L90.551,25.368L83.698,25.368L83.698,8.711L90.551,8.711L90.551,10.401L85.554,10.401L85.554,16.088L89.623,16.088Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M95.095,25.368L93.43,25.368L93.43,8.711L95.785,8.711L99.64,20.752L99.64,8.711L101.282,8.711L101.282,25.368L99.355,25.368L95.095,11.9L95.095,25.368Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M108.254,23.678C109.586,23.678 110.229,22.845 110.229,21.323L110.229,12.756C110.229,11.234 109.586,10.401 108.23,10.401L106.231,10.401L106.231,23.678L108.254,23.678ZM108.278,8.711C110.871,8.711 112.061,10.282 112.061,12.852L112.061,21.251C112.061,23.797 110.871,25.368 108.278,25.368L104.375,25.368L104.375,8.711L108.278,8.711Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M120.913,16.088L120.913,17.753L116.844,17.753L116.844,23.678L121.841,23.678L121.841,25.368L114.988,25.368L114.988,8.711L121.841,8.711L121.841,10.401L116.844,10.401L116.844,16.088L120.913,16.088Z" style="fill:rgb(90,150,200);fill-rule:nonzero;"/>
<path d="M178.95,12.681L178.95,13.13L177.201,13.13L177.201,12.586C177.201,11.097 176.634,10.223 175.31,10.223C173.986,10.223 173.419,11.097 173.419,12.563C173.419,16.273 178.973,16.627 178.973,21.283C178.973,23.789 177.768,25.419 175.239,25.419C172.71,25.419 171.529,23.789 171.529,21.283L171.529,20.338L173.254,20.338L173.254,21.378C173.254,22.867 173.868,23.741 175.192,23.741C176.515,23.741 177.13,22.867 177.13,21.378C177.13,17.691 171.599,17.336 171.599,12.681C171.599,10.128 172.781,8.545 175.263,8.545C177.768,8.545 178.95,10.176 178.95,12.681" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<path d="M184.574,18.069L183.605,19.7L183.605,25.254L181.762,25.254L181.762,8.71L183.605,8.71L183.605,16.698L188.001,8.71L189.868,8.71L185.685,16.25L190.01,25.254L188.119,25.254L184.574,18.069Z" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<rect x="192.609" y="8.71" width="1.843" height="16.544" style="fill:rgb(233,84,66);"/>
<path d="M200.739,16.509C202.204,16.509 203.078,16.037 203.078,14.241L203.078,12.657C203.078,11.168 202.535,10.388 201.164,10.388L199.368,10.388L199.368,16.509L200.739,16.509ZM201.211,8.71C203.811,8.71 204.898,10.034 204.898,12.492L204.898,13.839C204.898,15.659 204.26,16.793 202.842,17.242C204.355,17.691 204.922,18.92 204.922,20.693L204.922,23.269C204.922,24.001 204.946,24.686 205.253,25.254L203.386,25.254C203.173,24.781 203.078,24.356 203.078,23.245L203.078,20.645C203.078,18.778 202.204,18.187 200.668,18.187L199.368,18.187L199.368,25.254L197.525,25.254L197.525,8.71L201.211,8.71Z" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<path d="M213.902,16.037L213.902,17.691L209.861,17.691L209.861,23.576L214.824,23.576L214.824,25.254L208.018,25.254L208.018,8.71L214.824,8.71L214.824,10.388L209.861,10.388L209.861,16.037L213.902,16.037Z" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<rect x="217.707" y="8.71" width="1.843" height="16.544" style="fill:rgb(233,84,66);"/>
<path d="M229.783,12.681L229.783,13.13L228.034,13.13L228.034,12.586C228.034,11.097 227.467,10.223 226.144,10.223C224.82,10.223 224.253,11.097 224.253,12.563C224.253,16.273 229.807,16.627 229.807,21.283C229.807,23.789 228.602,25.419 226.073,25.419C223.544,25.419 222.362,23.789 222.362,21.283L222.362,20.338L224.088,20.338L224.088,21.378C224.088,22.867 224.702,23.741 226.026,23.741C227.349,23.741 227.964,22.867 227.964,21.378C227.964,17.691 222.433,17.336 222.433,12.681C222.433,10.128 223.615,8.545 226.096,8.545C228.602,8.545 229.783,10.176 229.783,12.681" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<path d="M238.48,16.037L238.48,17.691L234.439,17.691L234.439,23.576L239.402,23.576L239.402,25.254L232.595,25.254L232.595,8.71L239.402,8.71L239.402,10.388L234.439,10.388L234.439,16.037L238.48,16.037Z" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<path d="M243.915,25.254L242.261,25.254L242.261,8.71L244.601,8.71L248.429,20.669L248.429,8.71L250.06,8.71L250.06,25.254L248.146,25.254L243.915,11.877L243.915,25.254Z" style="fill:rgb(233,84,66);fill-rule:nonzero;"/>
<path d="M162.932,17.573C162.932,26.334 155.83,33.436 147.069,33.436C138.308,33.436 131.206,26.334 131.206,17.573C131.206,8.812 138.308,1.71 147.069,1.71C155.83,1.71 162.932,8.812 162.932,17.573" style="fill:rgb(91,150,199);fill-rule:nonzero;"/>
<path d="M162.932,17.573C162.932,8.818 155.824,1.71 147.069,1.71C138.314,1.71 131.206,8.818 131.206,17.573C131.206,26.328 138.314,33.436 147.069,33.436C155.824,33.436 162.932,26.328 162.932,17.573Z" style="fill:none;stroke:rgb(232,82,66);stroke-width:2.09px;"/>
<path d="M146.221,10.769C146.221,10.769 146.157,10.739 146.125,10.721L143.056,8.949C142.695,8.74 142.541,8.332 142.711,8.037L142.819,7.85C142.99,7.555 143.42,7.484 143.781,7.692L146.221,9.105L146.221,10.769Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M147.73,10.769C147.73,10.769 147.794,10.739 147.826,10.721L150.895,8.949C151.256,8.74 151.41,8.332 151.24,8.037L151.132,7.85C150.961,7.555 150.531,7.484 150.17,7.692L147.73,9.105L147.73,10.769Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M146.221,24.277C146.221,24.277 146.157,24.307 146.125,24.325L143.056,26.097C142.695,26.306 142.541,26.714 142.711,27.009L142.819,27.196C142.99,27.491 143.42,27.562 143.781,27.354L146.221,25.941L146.221,24.277Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M147.73,24.277C147.73,24.277 147.794,24.307 147.826,24.325L150.895,26.097C151.256,26.306 151.41,26.714 151.24,27.009L151.132,27.196C150.961,27.491 150.531,27.562 150.17,27.354L147.73,25.941L147.73,24.277Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M140.753,14.727C140.753,14.727 140.695,14.767 140.664,14.785L137.596,16.56C137.235,16.769 136.804,16.699 136.634,16.404L136.526,16.217C136.355,15.922 136.509,15.513 136.869,15.305L139.312,13.896L140.753,14.727Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M141.507,13.419C141.507,13.419 141.513,13.348 141.513,13.312L141.51,9.768C141.509,9.351 141.233,9.014 140.892,9.014L140.676,9.014C140.335,9.015 140.059,9.352 140.059,9.769L140.065,12.589L141.507,13.419Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M152.457,21.471C152.457,21.471 152.451,21.541 152.451,21.578L152.454,25.122C152.455,25.539 152.731,25.876 153.072,25.876L153.288,25.876C153.629,25.875 153.905,25.537 153.905,25.121L153.899,22.301L152.457,21.471Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M153.211,20.163C153.211,20.163 153.269,20.122 153.3,20.104L156.368,18.329C156.729,18.121 157.16,18.191 157.33,18.486L157.438,18.673C157.609,18.968 157.455,19.377 157.095,19.585L154.652,20.994L153.211,20.163Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M152.418,13.383C152.418,13.383 152.411,13.312 152.411,13.276L152.391,9.732C152.389,9.315 152.664,8.976 153.004,8.974L153.22,8.973C153.561,8.971 153.84,9.307 153.842,9.724L153.854,12.544L152.418,13.383Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M153.18,14.686C153.18,14.686 153.238,14.726 153.269,14.744L156.349,16.499C156.71,16.706 157.14,16.633 157.309,16.337L157.416,16.149C157.585,15.853 157.429,15.445 157.067,15.239L154.616,13.846L153.18,14.686Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M140.756,20.201C140.756,20.201 140.698,20.161 140.667,20.143L137.587,18.388C137.226,18.181 136.796,18.254 136.627,18.551L136.52,18.738C136.351,19.034 136.507,19.442 136.869,19.648L139.32,21.042L140.756,20.201Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M141.519,21.505C141.519,21.505 141.525,21.575 141.525,21.611L141.545,25.155C141.547,25.572 141.272,25.911 140.932,25.913L140.716,25.914C140.375,25.916 140.096,25.58 140.094,25.163L140.082,22.344L141.519,21.505Z" style="fill:white;fill-rule:nonzero;"/>
<path d="M146.976,13.856L149.161,12.606C149.522,12.398 149.697,12.027 149.553,11.777L149.462,11.619C149.318,11.37 148.909,11.336 148.548,11.545L146.976,12.423L146.976,13.856Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M146.976,13.856L144.866,12.606C144.505,12.398 144.329,12.027 144.473,11.777L144.565,11.619C144.709,11.37 145.118,11.336 145.479,11.545L146.976,12.423L146.976,13.856Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M146.976,21.174L149.161,22.424C149.522,22.632 149.697,23.003 149.553,23.253L149.462,23.411C149.318,23.661 148.909,23.694 148.548,23.486L146.976,22.607L146.976,21.174Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M146.976,21.174L144.866,22.424C144.505,22.632 144.329,23.003 144.473,23.253L144.565,23.411C144.709,23.661 145.118,23.694 145.479,23.486L146.976,22.607L146.976,21.174Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M150.105,15.659L150.084,13.142C150.082,12.726 150.314,12.387 150.602,12.386L150.785,12.385C151.073,12.384 151.308,12.72 151.31,13.137L151.343,14.938L150.105,15.659Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M150.105,15.659L152.248,16.852C152.609,17.059 153.019,17.024 153.161,16.774L153.252,16.615C153.395,16.365 153.218,15.995 152.856,15.788L151.343,14.938L150.105,15.659Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M143.77,15.594L141.591,16.853C141.229,17.06 140.82,17.026 140.677,16.776L140.586,16.617C140.443,16.367 140.62,15.997 140.982,15.79L142.532,14.873L143.77,15.594Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M143.77,15.594L143.752,13.142C143.753,12.725 143.521,12.387 143.233,12.386L143.05,12.385C142.762,12.384 142.528,12.721 142.526,13.137L142.532,14.873L143.77,15.594Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M143.77,19.358L141.591,18.099C141.229,17.892 140.82,17.927 140.677,18.177L140.586,18.335C140.443,18.585 140.62,18.956 140.982,19.163L142.532,20.079L143.77,19.358Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M143.77,19.358L143.752,21.811C143.753,22.227 143.521,22.566 143.233,22.567L143.05,22.567C142.762,22.568 142.528,22.232 142.526,21.815L142.532,20.079L143.77,19.358Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M150.416,19.505L150.463,22.023C150.473,22.439 150.714,22.771 151.002,22.764L151.185,22.76C151.473,22.754 151.698,22.411 151.689,21.994L151.673,20.193L150.416,19.505Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M150.416,19.505L152.526,18.255C152.881,18.038 153.291,18.062 153.441,18.308L153.536,18.465C153.686,18.711 153.518,19.086 153.162,19.302L151.673,20.193L150.416,19.505Z" style="fill:white;fill-rule:nonzero;stroke:rgb(89,149,199);stroke-width:0.25px;"/>
<path d="M146.976,30.184C146.559,30.184 146.221,29.846 146.221,29.429L146.221,5.485C146.221,5.069 146.559,4.731 146.976,4.731C147.392,4.731 147.73,5.069 147.73,5.485L147.73,29.429C147.73,29.846 147.392,30.184 146.976,30.184" style="fill:white;fill-rule:nonzero;"/>
<path d="M136.006,23.849C135.795,23.49 135.917,23.028 136.276,22.818L156.95,10.729C157.31,10.519 157.772,10.64 157.982,10.999C158.192,11.359 158.071,11.821 157.712,12.031L137.037,24.12C136.678,24.33 136.216,24.209 136.006,23.849" style="fill:white;fill-rule:nonzero;"/>
<path d="M158.042,23.816L158.042,23.816C157.835,24.177 157.373,24.301 157.013,24.093L136.243,12.125C135.882,11.917 135.758,11.456 135.966,11.095C136.174,10.734 136.635,10.61 136.996,10.818L157.766,22.786C158.127,22.994 158.25,23.455 158.042,23.816" style="fill:white;fill-rule:nonzero;"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load Diff
+116
View File
@@ -0,0 +1,116 @@
const INDICATOR_ID = 'loading-indicator'
const HIDDEN_CLASS = 'invisible'
const GRACE_PERIOD_MS = 500
const DEBOUNCE_MS = 200
let debounceTimeout = null
let historyRestoreGracePeriod = false
let savedScrollPosition = null
let activeRequests = 0
function getIndicator() {
return document.getElementById(INDICATOR_ID)
}
function show() {
const indicator = getIndicator()
if (indicator) {
indicator.classList.remove(HIDDEN_CLASS)
}
}
function hide() {
if (debounceTimeout) {
clearTimeout(debounceTimeout)
debounceTimeout = null
}
const indicator = getIndicator()
if (indicator) {
indicator.classList.add(HIDDEN_CLASS)
}
}
function handleBeforeRequest(event) {
// Ignore requests triggered during history restore grace period
if (true === historyRestoreGracePeriod) {
return
}
activeRequests++
// Save scroll position of the target container before HTMX request
const target = event.detail?.target || document.getElementById('main-content')
if (target && typeof target.scrollTop === 'number') {
savedScrollPosition = { element: target, top: target.scrollTop }
}
// Don't start a new debounce if already pending
if (debounceTimeout) {
return
}
// Show indicator after delay
debounceTimeout = setTimeout(() => {
show()
}, DEBOUNCE_MS)
}
function handleRequestEnd() {
// Counter may already be 0 if a force-reset (history save, page show) fired
// before this afterRequest — ignore the stale completion in that case
if (0 === activeRequests) {
return
}
activeRequests--
if (0 === activeRequests) {
hide()
}
}
function handleAfterSwap() {
// Restore scroll position after HTMX swaps content
if (savedScrollPosition !== null && savedScrollPosition.element) {
savedScrollPosition.element.scrollTop = savedScrollPosition.top
savedScrollPosition = null
}
}
function handleHistoryRestore() {
activeRequests = 0
hide()
// Set grace period to ignore change events triggered by history restore
historyRestoreGracePeriod = true
setTimeout(() => {
historyRestoreGracePeriod = false
}, GRACE_PERIOD_MS)
}
function handleTimeout() {
// Don't decrement here — htmx:afterRequest always fires alongside htmx:timeout
// and handles the counter. This handler only shows the alert.
alert('Die Anfrage hat zu lange gedauert. Bitte versuchen Sie es erneut. Falls das Problem weiterhin besteht, kontaktieren Sie bitte unseren Support.')
}
function handleBeforeHistorySave() {
// Hide indicator before HTMX saves the page to history cache
activeRequests = 0
hide()
}
function handlePageShow() {
activeRequests = 0
hide()
}
// Initialize event listeners
document.body.addEventListener('htmx:beforeRequest', handleBeforeRequest)
document.body.addEventListener('htmx:afterRequest', handleRequestEnd)
document.body.addEventListener('htmx:afterSwap', handleAfterSwap)
document.body.addEventListener('htmx:timeout', handleTimeout)
document.body.addEventListener('htmx:historyRestore', handleHistoryRestore)
document.body.addEventListener('htmx:beforeHistorySave', handleBeforeHistorySave)
window.addEventListener('pageshow', handlePageShow)
window.addEventListener('popstate', handleHistoryRestore)
+29
View File
@@ -0,0 +1,29 @@
export const useFetch = controller => {
Object.assign(controller, {
checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response
} else {
const error = new Error(response.statusText)
error.response = response
throw error
}
},
parseJSON(response) {
return response.json()
},
parseHTML(response) {
return response.text()
},
getInitObject(method = 'get', body = null) {
return {
method,
body,
credentials: 'include',
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
}
}
})
}
+28
View File
@@ -40,3 +40,31 @@
.htmx-request.htmx-indicator{
@apply visible;
}
.bg-outer {
@apply bg-blend-multiply bg-right-top bg-cover;
}
.bg-outer--1 {
background-image: url('../images/bg_4.jpg'), linear-gradient(190deg, rgba(24, 82, 123, 1) 0%, rgba(22, 88, 131, 1) 62%, rgba(0, 112, 224, 1) 100%);;
}
.bg-outer--2 {
background-image: url('../images/bg_5.jpg'), linear-gradient(190deg, rgba(24, 82, 123, 1) 0%, rgba(22, 88, 131, 1) 62%, rgba(0, 112, 224, 1) 100%);;
}
.bg-outer--summer {
background-image: url('../images/bg_summer.jpg'), linear-gradient(190deg, rgba(24, 82, 123, 1) 0%, rgba(22, 88, 131, 1) 62%, rgba(0, 112, 224, 1) 100%);;
}
.sbw .bg-outer--2 {
background-image: url('../images/bg_7.jpg'), linear-gradient(190deg, rgba(24, 82, 123, 1) 0%, rgba(22, 88, 131, 1) 62%, rgba(0, 112, 224, 1) 100%);;
}
.snz .bg-outer--2 {
background-image: url('../images/bg_6.jpg'), linear-gradient(190deg, rgba(24, 82, 123, 1) 0%, rgba(22, 88, 131, 1) 62%, rgba(0, 112, 224, 1) 100%);;
}
.bg-inner {
background-image: linear-gradient(190deg, rgba(24, 82, 123, 0.8) 0%, rgba(22, 88, 131, 0.8) 62%, rgba(0, 112, 224, 0.8) 100%);;
}
+7 -4
View File
@@ -1,6 +1,9 @@
@import "components/typography.css";
@import "components/forms.css";
@import "components/button.css";
@import "components/menu.css";
@import "components/forms.css";
@import "components/gallery.css";
@import "components/pagination.css";
@import "components/price_calendar.css";
@import "components/toast.css";
@import "components/tooltip.css";
@import "components/table-responsive.css";
@import "components/typography.css";
@import "components/rte-content.css";
+10
View File
@@ -0,0 +1,10 @@
@import "components/autocomplete.css";
@import "components/badge.css";
@import "components/button.css";
@import "components/datatable.css";
@import "components/datepicker.css";
@import "components/forms.css";
@import "components/pagination.css";
@import "components/toast.css";
@import "components/tooltip.css";
@import "components/typography.css";
+7
View File
@@ -0,0 +1,7 @@
@layer utilities {
/* Reserve the scrollbar gutter so content does not shift width when a
scrollbar appears (e.g. when a collapsible section is opened). */
.scroll-stable {
scrollbar-gutter: stable;
}
}
+7
View File
@@ -0,0 +1,7 @@
@import "tailwindcss/base";
@import "_base.css";
@import "tailwindcss/components";
@import "_components_admin.css";
@import "tailwindcss/utilities";
+1
View File
@@ -5,3 +5,4 @@
@import "_components.css";
@import "tailwindcss/utilities";
@import "_utilities.css";
+33
View File
@@ -0,0 +1,33 @@
.autocomplete {
@apply relative w-full;
}
.autocomplete[data-loading="true"]:after {
@apply block absolute top-0 right-0;
@apply absolute w-4 h-4 rounded-full right-0 mr-4;
content: "";
border: 3px solid rgba(0, 0, 0, 0.12);
border-right: 3px solid rgba(0, 0, 0, 0.48);
top: 50%;
transform: translateY(-50%);
animation: rotate 1s infinite linear;
}
.autocomplete-icon {
@apply absolute top-1/2 right-0 transform -translate-y-1/2 mr-4;
}
.autocomplete[data-loading="true"] .autocomplete-icon {
@apply hidden;
}
.autocomplete-result-list {
@apply bg-white shadow-md max-h-64 overflow-y-auto;
}
.autocomplete-result {
@apply p-2;
}
.autocomplete-result:hover,
.autocomplete-result[aria-selected="true"] {
@apply bg-gray-200;
}
+3
View File
@@ -0,0 +1,3 @@
.badge {
@apply inline-flex items-center rounded-md px-1.5 py-0.5 text-xs font-medium whitespace-nowrap;
}
+51 -25
View File
@@ -1,45 +1,71 @@
.button {
@apply inline-flex items-center justify-center space-x-2 px-4 py-2 md:px-8 cursor-pointer;
@apply uppercase leading-none text-center;
@apply transition-colors outline-none focus:outline-2 focus:outline-offset-2 focus:outline-primary-light;
@apply inline-flex items-center justify-center space-x-2 h-8 leading-8 md:h-10 md:leading-10 px-4 md:px-8 cursor-pointer;
@apply uppercase leading-none text-center text-sm md:text-base;
@apply transition-colors outline-none focus:outline-2 focus:outline-offset-2 focus:outline-primary-dark;
@apply rounded-md;
}
.button--small {
@apply px-2 py-1 md:px-4 text-xs sm:text-sm;
}
.button--full {
@apply block w-full;
.button--primary {
background: linear-gradient(120deg, #960167 0%, #9e036a 40%, #fa1a8c 100%);
@apply text-white;
@apply hover:bg-none hover:bg-pink/80;
}
.bg-button {
@apply bg-none bg-primary-dark text-white;
@apply hover:bg-badge-gradient;
.button[disabled] {
@apply cursor-not-allowed;
}
.bg-button--active,
.bg-button--secondary {
@apply bg-badge-gradient;
@apply hover:bg-none hover:bg-pink;
.button--secondary {
@apply bg-none bg-primary-light text-white;
@apply hover:bg-primary-light/50;
}
.bg-button--muted {
@apply bg-zinc-300 hover:bg-zinc-300;
.button--neutral {
@apply bg-none bg-gray-200;
@apply hover:bg-gray-200/50;
}
.bg-button--dark {
@apply bg-primary-dark;
.button--warning {
@apply bg-none bg-red-500 text-white;
@apply hover:bg-red-500/50;
}
.bg-button--light {
@apply bg-white border-2;
@apply font-bold;
@apply border-primary-light text-primary;
.sbw {
.button--primary {
@apply bg-none bg-sbw-secondary text-white;
@apply hover:bg-none hover:bg-sbw-primary/50;
}
.button--secondary {
@apply bg-none bg-sbw-primary-dark text-white;
@apply hover:bg-none hover:bg-sbw-primary/50;
}
}
.bg-button--light:hover,
.bg-button--light.button--active {
@apply bg-white;
@apply border-secondary text-secondary;
.snz {
.button--primary {
@apply bg-none bg-snz-secondary text-white;
@apply hover:bg-none hover:bg-snz-primary/50;
}
.button--secondary {
@apply bg-none bg-snz-primary-dark text-white;
@apply hover:bg-none hover:bg-snz-primary/50;
}
}
.ser {
.button--primary {
@apply bg-none bg-ser-secondary text-white;
@apply hover:bg-none hover:bg-ser-primary/50;
}
.button--secondary {
@apply bg-none bg-ser-primary text-white;
@apply hover:bg-none hover:bg-ser-primary/50;
}
}
+31
View File
@@ -0,0 +1,31 @@
.data-table-wrapper {
@apply overflow-x-auto lg:overflow-x-visible mb-8;
}
.data-table-wrapper__inner {
@apply align-middle inline-block min-w-full overflow-hidden lg:overflow-visible;
}
.data-table {
@apply min-w-full;
}
.data-table tbody {
@apply bg-white;
}
.data-table tr {
@apply border border-gray-300;
}
.data-table th {
@apply px-4 py-2 bg-gray-200 text-left leading-4 font-bold text-primary align-top;
}
.data-table td {
@apply px-4 py-2 leading-5 align-top;
}
.data-table tbody tr {
@apply hover:bg-gray-100;
}
+7
View File
@@ -0,0 +1,7 @@
@import "vanilla-calendar-pro/styles/index.css";
@import "vanilla-calendar-pro/styles/themes/light.css";
[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn,
[data-vc-theme=light] .vc-date[data-vc-date-selected] .vc-date__btn:hover {
background-color: theme('colors.secondary');
}
+28 -1
View File
@@ -4,7 +4,13 @@ label.required:after {
}
.form-field {
@apply border-zinc-400 focus:border-zinc-800 ring-0 focus:outline-2 focus:outline-offset-2 focus:outline-primary-light mt-1 block w-full;
@apply border-zinc-400 ring-0 mt-1 block w-full rounded-md;
@apply focus:outline-primary-light focus:border-zinc-800 focus:outline-2 focus:outline-offset-2;
}
#participant-form .form-field,
#form-payment .form-field {
@apply bg-primary-bg border-primary-bg;
}
.form-field--has-error {
@@ -27,3 +33,24 @@ select[readonly] {
input[readonly] {
@apply cursor-not-allowed;
}
.sbw {
.form-checkbox,
.form-radio {
@apply text-sbw-secondary;
}
}
.snz {
.form-checkbox,
.form-radio {
@apply text-snz-primary;
}
}
.ser {
.form-checkbox,
.form-radio {
@apply text-ser-secondary;
}
}
+1
View File
@@ -0,0 +1 @@
@import "glightbox/dist/css/glightbox.min.css";
-11
View File
@@ -1,11 +0,0 @@
.menu--main {
@apply flex items-center m-0 divide-x divide-white;
}
.menu--main a {
@apply block py-2 px-4 text-white hover:bg-secondary hover:text-zinc-800 text-sm md:text-base;
}
.menu--main .current a {
@apply bg-secondary text-zinc-800;
}
+90
View File
@@ -0,0 +1,90 @@
:root {
--pagination-skew: 2rem;
--pagination-border-width: 1px;
}
.pagination {
@apply flex h-12 lg:h-16 overflow-hidden bg-primary-bg shadow-md;
}
.pagination-item {
flex: 1 1 0;
margin-right: calc(-1 * var(--pagination-skew));
@apply relative;
}
.pagination-item:last-child {
@apply mr-0;
}
/* Outer clip-path for button shape */
.pagination-item:first-child {
clip-path: polygon(0 0, calc(100% - var(--pagination-skew)) 0, 100% 100%, 0 100%);
}
.pagination-item:not(:first-child):not(:last-child) {
clip-path: polygon(0 0, calc(100% - var(--pagination-skew)) 0, 100% 100%, var(--pagination-skew) 100%);
}
.pagination-item:last-child {
clip-path: polygon(0 0, 100% 0, 100% 100%, var(--pagination-skew) 100%);
}
/* Border and content wrappers */
.pagination-item__border {
@apply w-full h-full flex items-center justify-center bg-primary-dark/10;
}
.pagination-item__inner {
@apply w-full h-full flex items-center justify-center;
@apply lg:text-2xl font-bold;
}
a.pagination-item__border > .pagination-item__inner:hover {
@apply bg-primary-light text-white;
}
/* Inner clip-path for border effect */
.pagination-item:first-child .pagination-item__inner {
clip-path: polygon(0 0, calc(100% - var(--pagination-skew)) 0, 100% 100%, 0 100%);
}
.pagination-item:not(:first-child) .pagination-item__inner {
/* No left/bottom-left border on overlapping edge to prevent double borders */
clip-path: polygon(0 0, calc(100% - var(--pagination-skew) - var(--pagination-border-width)) 0, calc(100% - var(--pagination-border-width)) 100%, var(--pagination-skew) 100%);
}
.pagination-item:last-child .pagination-item__inner {
/* No left/bottom-left border on overlapping edge, no right border */
clip-path: polygon(0 0, 100% 0, 100% 100%, var(--pagination-skew) 100%);
}
.sbw {
.pagination-item__border {
@apply bg-sbw-primary-dark/10;
}
a.pagination-item__border > .pagination-item__inner:hover {
@apply bg-sbw-primary;
}
}
.snz {
.pagination-item__border {
@apply bg-snz-primary-dark/10;
}
a.pagination-item__border > .pagination-item__inner:hover {
@apply bg-snz-primary;
}
}
.ser {
.pagination-item__border {
@apply bg-ser-primary/10;
}
a.pagination-item__border > .pagination-item__inner:hover {
@apply bg-ser-primary;
}
}
@@ -0,0 +1,41 @@
.pc-day {
@apply relative w-full text-center py-1 px-0.5 text-sm leading-tight rounded text-white cursor-pointer;
}
.pc-day--out-of-month {
@apply pointer-events-none opacity-0;
}
.pc-day[data-status="ok"] {
@apply bg-emerald-500;
}
.pc-day[data-status="blocked-to-ok"] {
background: linear-gradient(to bottom right, theme('colors.gray.400') 50%, theme('colors.emerald.500') 50%);
}
.pc-day[data-status="checkout-only"] {
background: linear-gradient(to bottom right, theme('colors.emerald.500') 50%, theme('colors.gray.400') 50%);
}
.pc-day[data-status="past"] {
@apply bg-transparent text-gray-400 cursor-default;
}
.pc-day[data-status="blocked"] {
@apply bg-gray-400 cursor-default;
}
.pc-day[data-status=""], .pc-day:not([data-status]) {
@apply text-gray-400 cursor-default;
}
.pc-day.pc-day--pending-start,
.pc-day.pc-day--selected-start,
.pc-day.pc-day--selected-end {
@apply bg-none outline-none bg-secondary text-gray-700;
}
.pc-day.pc-day--in-range {
@apply bg-none bg-secondary text-gray-700 opacity-55;
}
+13
View File
@@ -0,0 +1,13 @@
.rte-content {
p {
@apply pb-4;
}
ul {
@apply list-disc p-4;
}
ol {
@apply list-decimal p-4;
}
}
@@ -1,20 +0,0 @@
.responsive {
@apply text-sm md:text-base;
}
.responsive thead {
@apply hidden md:table-header-group;
}
.responsive tbody tr {
@apply block mb-2 md:table-row;
}
.responsive td {
@apply grid grid-cols-2 gap-x-2 last:col-span-2 md:table-cell;
}
.responsive td:before {
content: attr(data-label);
@apply block font-bold last:hidden md:hidden;
}
+25
View File
@@ -0,0 +1,25 @@
@import "toastify-js/src/toastify.css";
.toastify {
@apply shadow-lg rounded;
}
.toastify--success {
@apply text-gray-100;
background: theme('colors.emerald.600');
}
.toastify--warning {
@apply text-gray-100;
background: theme('colors.red.600');
}
.toastify--error {
@apply text-gray-100;
background: theme('colors.red.700');
}
.toastify--info {
@apply text-gray-100;
background: theme('colors.primary');
}
+54 -1
View File
@@ -3,7 +3,6 @@
.tippy-box {
background-color: theme('colors.primary');
}
.tippy-box[data-placement^='top'] > .tippy-arrow::before {
border-top-color: theme('colors.primary');
}
@@ -16,3 +15,57 @@
.tippy-box[data-placement^='right'] > .tippy-arrow::before {
border-right-color: theme('colors.primary');
}
.sbw {
.tippy-box {
background-color: theme('colors.sbw.secondary');
}
.tippy-box[data-placement^='top'] > .tippy-arrow::before {
border-top-color: theme('colors.sbw.secondary');
}
.tippy-box[data-placement^='bottom'] > .tippy-arrow::before {
border-bottom-color: theme('colors.sbw.secondary');
}
.tippy-box[data-placement^='left'] > .tippy-arrow::before {
border-left-color: theme('colors.sbw.secondary');
}
.tippy-box[data-placement^='right'] > .tippy-arrow::before {
border-right-color: theme('colors.sbw.secondary');
}
}
.snz {
.tippy-box {
background-color: theme('colors.snz.primary-dark');
}
.tippy-box[data-placement^='top'] > .tippy-arrow::before {
border-top-color: theme('colors.snz.primary-dark');
}
.tippy-box[data-placement^='bottom'] > .tippy-arrow::before {
border-bottom-color: theme('colors.snz.primary-dark');
}
.tippy-box[data-placement^='left'] > .tippy-arrow::before {
border-left-color: theme('colors.snz.primary-dark');
}
.tippy-box[data-placement^='right'] > .tippy-arrow::before {
border-right-color: theme('colors.snz.primary-dark');
}
}
.ser {
.tippy-box {
background-color: theme('colors.ser.secondary');
}
.tippy-box[data-placement^='top'] > .tippy-arrow::before {
border-top-color: theme('colors.ser.secondary');
}
.tippy-box[data-placement^='bottom'] > .tippy-arrow::before {
border-bottom-color: theme('colors.ser.secondary');
}
.tippy-box[data-placement^='left'] > .tippy-arrow::before {
border-left-color: theme('colors.ser.secondary');
}
.tippy-box[data-placement^='right'] > .tippy-arrow::before {
border-right-color: theme('colors.ser.secondary');
}
}
+4
View File
@@ -0,0 +1,4 @@
### list custom fields
GET {{clickup_baseurl}}/list/{{clickup_list_id}}/field?include_applied_objects=true
Authorization: {{clickup_api_token}}
+138 -122
View File
@@ -1,126 +1,142 @@
{
"type": "project",
"license": "proprietary",
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"php": ">=8.1",
"ext-ctype": "*",
"ext-iconv": "*",
"ext-simplexml": "*",
"ext-sockets": "*",
"doctrine/dbal": "^3",
"doctrine/doctrine-bundle": "^2.13",
"doctrine/doctrine-migrations-bundle": "^3.3",
"doctrine/orm": "^3.3",
"knplabs/knp-menu-bundle": "^3.4",
"league/flysystem-bundle": "^3.4",
"league/flysystem-sftp-v3": "^3.29",
"league/oauth2-server-bundle": "^0.11.0",
"nelexa/zip": "^4.0",
"nesbot/carbon": "^3.8",
"phpdocumentor/reflection-docblock": "^5.6",
"phpstan/phpdoc-parser": "^2.0",
"spatie/crypto": "^2.1",
"symfony/apache-pack": "^1.0",
"symfony/asset": "6.4.*",
"symfony/console": "6.4.*",
"symfony/doctrine-messenger": "6.4.*",
"symfony/dom-crawler": "6.4.*",
"symfony/dotenv": "6.4.*",
"symfony/expression-language": "6.4.*",
"symfony/flex": "^2",
"symfony/form": "6.4.*",
"symfony/framework-bundle": "6.4.*",
"symfony/http-client": "6.4.*",
"symfony/intl": "6.4.*",
"symfony/mailer": "6.4.*",
"symfony/mime": "6.4.*",
"symfony/monolog-bundle": "^3.0",
"symfony/notifier": "6.4.*",
"symfony/process": "6.4.*",
"symfony/property-access": "6.4.*",
"symfony/property-info": "6.4.*",
"symfony/runtime": "6.4.*",
"symfony/security-bundle": "6.4.*",
"symfony/serializer": "6.4.*",
"symfony/stimulus-bundle": "^2.21",
"symfony/string": "6.4.*",
"symfony/translation": "6.4.*",
"symfony/twig-bundle": "6.4.*",
"symfony/uid": "6.4.*",
"symfony/validator": "6.4.*",
"symfony/web-link": "6.4.*",
"symfony/webpack-encore-bundle": "^2.2",
"symfony/yaml": "6.4.*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/html-extra": "^3.15",
"twig/intl-extra": "*",
"twig/twig": "^2.12|^3.0",
"voku/anti-xss": "^4.1"
"type": "project",
"license": "proprietary",
"minimum-stability": "stable",
"prefer-stable": true,
"require": {
"php": ">=8.4",
"ext-ctype": "*",
"ext-dom": "*",
"ext-iconv": "*",
"ext-simplexml": "*",
"ext-sockets": "*",
"doctrine/dbal": "^3",
"doctrine/doctrine-bundle": "^2.13",
"doctrine/doctrine-migrations-bundle": "^3.3",
"doctrine/orm": "^3.3",
"dompdf/dompdf": "^3.1",
"fakerphp/faker": "^1.24",
"flagception/flagception-bundle": "^6.1",
"knplabs/knp-menu-bundle": "^3.7",
"knplabs/knp-paginator-bundle": "^6.10",
"league/flysystem-bundle": "^3.4",
"league/flysystem-sftp-v3": "^3.29",
"league/oauth2-server-bundle": "^1.0",
"nelexa/zip": "^4.0",
"nesbot/carbon": "^3.8",
"phpdocumentor/reflection-docblock": "^5.6",
"phpoffice/phpspreadsheet": "^5.4",
"phpstan/phpdoc-parser": "^2.0",
"spatie/crypto": "^2.1",
"symfony/apache-pack": "^1.0",
"symfony/asset": "7.4.*",
"symfony/console": "7.4.*",
"symfony/doctrine-messenger": "7.4.*",
"symfony/dom-crawler": "7.4.*",
"symfony/dotenv": "7.4.*",
"symfony/expression-language": "7.4.*",
"symfony/flex": "^2",
"symfony/form": "7.4.*",
"symfony/framework-bundle": "7.4.*",
"symfony/html-sanitizer": "7.4.*",
"symfony/http-client": "7.4.*",
"symfony/intl": "7.4.*",
"symfony/lock": "7.4.*",
"symfony/mailer": "7.4.*",
"symfony/mime": "7.4.*",
"symfony/monolog-bundle": "^3.0",
"symfony/notifier": "7.4.*",
"symfony/process": "7.4.*",
"symfony/property-access": "7.4.*",
"symfony/property-info": "7.4.*",
"symfony/runtime": "7.4.*",
"symfony/security-bundle": "7.4.*",
"symfony/serializer": "7.4.*",
"symfony/stimulus-bundle": "^2.21",
"symfony/string": "7.4.*",
"symfony/translation": "7.4.*",
"symfony/twig-bundle": "7.4.*",
"symfony/uid": "7.4.*",
"symfony/ux-twig-component": "^2.36",
"symfony/validator": "7.4.*",
"symfony/web-link": "7.4.*",
"symfony/webpack-encore-bundle": "^2.2",
"symfony/yaml": "7.4.*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/html-extra": "^3.15",
"twig/intl-extra": "*",
"twig/string-extra": "^3.24",
"twig/twig": "^2.12|^3.0",
"zenstruck/schedule-bundle": "^1.8"
},
"config": {
"allow-plugins": {
"php-http/discovery": true,
"symfony/flex": true,
"symfony/runtime": true
},
"config": {
"allow-plugins": {
"php-http/discovery": true,
"symfony/flex": true,
"symfony/runtime": true
},
"sort-packages": true,
"platform": {
"php": "8.2.28"
}
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php74": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-php81": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": true,
"require": "6.4.*",
"docker": true
}
},
"require-dev": {
"deployer/deployer": "^7.5",
"friendsofphp/php-cs-fixer": "^3.75",
"phpunit/phpunit": "^9.5",
"symfony/browser-kit": "6.4.*",
"symfony/css-selector": "6.4.*",
"symfony/debug-bundle": "6.4.*",
"symfony/maker-bundle": "^1.0",
"symfony/phpunit-bridge": "^7.1",
"symfony/stopwatch": "6.4.*",
"symfony/web-profiler-bundle": "6.4.*"
"sort-packages": true,
"platform": {
"php": "8.4.24"
}
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php74": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-php81": "*"
},
"scripts": {
"rector": "vendor/bin/rector process",
"rector:dry-run": "vendor/bin/rector process --dry-run",
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": true,
"require": "7.4.*",
"docker": true
}
},
"require-dev": {
"deployer/deployer": "^7.5",
"friendsofphp/php-cs-fixer": "^3.75",
"phpstan/phpstan": "^2.1",
"phpstan/phpstan-doctrine": "^2.0",
"phpstan/phpstan-symfony": "^2.0",
"phpunit/phpunit": "^12",
"rector/rector": "^2.4",
"symfony/browser-kit": "7.4.*",
"symfony/css-selector": "7.4.*",
"symfony/debug-bundle": "7.4.*",
"symfony/maker-bundle": "^1.0",
"symfony/phpunit-bridge": "^7.4",
"symfony/stopwatch": "7.4.*",
"symfony/web-profiler-bundle": "7.4.*"
}
}
Generated
+4650 -2469
View File
File diff suppressed because it is too large Load Diff
+5 -1
View File
@@ -13,7 +13,11 @@ return [
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true],
Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true],
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
League\FlysystemBundle\FlysystemBundle::class => ['all' => true],
League\Bundle\OAuth2ServerBundle\LeagueOAuth2ServerBundle::class => ['all' => true],
Zenstruck\ScheduleBundle\ZenstruckScheduleBundle::class => ['all' => true],
Flagception\Bundle\FlagceptionBundle\FlagceptionBundle::class => ['all' => true],
Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true],
Knp\Bundle\PaginatorBundle\KnpPaginatorBundle::class => ['all' => true],
Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
];
+4 -2
View File
@@ -15,5 +15,7 @@ framework:
#app: cache.adapter.apcu
# Namespaced pools use the above "app" backend by default
#pools:
#my.dedicated.cache: null
pools:
bpn.cache:
adapter: cache.adapter.filesystem
tags: true
+3 -5
View File
@@ -9,12 +9,12 @@ doctrine:
profiling_collect_backtrace: '%kernel.debug%'
use_savepoints: true
orm:
auto_generate_proxy_classes: true
enable_lazy_ghost_objects: true
report_fields_where_declared: true
enable_native_lazy_objects: true
validate_xml_mapping: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
controller_resolver:
auto_mapping: false
mappings:
App:
type: attribute
@@ -32,8 +32,6 @@ when@test:
when@prod:
doctrine:
orm:
auto_generate_proxy_classes: false
proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies'
query_cache_driver:
type: pool
pool: doctrine.system_cache_pool
+2
View File
@@ -0,0 +1,2 @@
flagception:
features: {}
+13 -11
View File
@@ -1,16 +1,18 @@
flysystem:
storages:
xml_export.storage:
adapter: 'local'
options:
directory: '%env(resolve:XML_EXPORT_PATH)%'
local:
directory: '%kernel.project_dir%/var/xmlexport'
xml_source.storage:
sftp:
host: '%env(SFTP_XML_SOURCE_HOST)%'
port: '%env(int:SFTP_XML_SOURCE_PORT)%'
username: '%env(SFTP_XML_SOURCE_USER)%'
password: '%env(SFTP_XML_SOURCE_PASSWORD)%'
root: '%env(SFTP_XML_SOURCE_ROOT)%'
xml_dump.storage:
adapter: 'local'
options:
local:
directory: '%kernel.project_dir%/var/bpn'
# adapter: 'sftp'
# options:
# host: '%env(SFTP_XML_EXPORT_HOST)%'
# port: '%env(int:SFTP_XML_EXPORT_PORT)%'
# username: '%env(SFTP_XML_EXPORT_USER)%'
# password: '%env(SFTP_XML_EXPORT_PASSWORD)%'
json_export.storage:
local:
directory: '%kernel.project_dir%/var/jsonexport'
+9 -4
View File
@@ -1,7 +1,6 @@
# see https://symfony.com/doc/current/reference/configuration/framework.html
framework:
secret: '%env(APP_SECRET)%'
annotations: false
http_method_override: false
handle_all_throwables: true
@@ -9,15 +8,21 @@ framework:
# Remove or comment this section to explicitly disable session support.
session:
handler_id: null
cookie_secure: auto
# cookie_samesite: lax
cookie_samesite: none # this is to make login work in staging environment. to be removed when going live!
cookie_secure: true
cookie_samesite: lax
#esi: true
#fragments: true
php_errors:
log: true
http_client:
scoped_clients:
typo3.client:
base_uri: '%env(resolve:APP_CMS_API_BASE_URL)%'
headers:
accept: 'text/json'
when@test:
framework:
test: true
+3
View File
@@ -0,0 +1,3 @@
knp_menu:
twig:
template: _partials/_menu.html.twig
+11
View File
@@ -0,0 +1,11 @@
knp_paginator:
default_options:
page_name: page
sort_field_name: sort
sort_direction_name: direction
distinct: true
filter_field_name: filterField
filter_value_name: filterValue
template:
pagination: '_partials/_paginator_sliding.html.twig'
sortable: '_partials/_paginator_sortable_link.html.twig'
+6 -2
View File
@@ -3,18 +3,22 @@ league_oauth2_server:
private_key: '%env(resolve:OAUTH_PRIVATE_KEY)%'
private_key_passphrase: null
encryption_key: '%env(resolve:OAUTH_ENCRYPTION_KEY)%'
require_code_challenge_for_public_clients: true
enable_client_credentials_grant: true
enable_auth_code_grant: true
enable_refresh_token_grant: false
enable_refresh_token_grant: true
enable_password_grant: false
enable_implicit_grant: false
access_token_ttl: PT10M
resource_server:
public_key: '%env(resolve:OAUTH_PUBLIC_KEY)%'
scopes:
available: ['email','profile','api']
available: ['email','id','profile','roles','api']
default: ['email']
persistence:
doctrine: null
client:
allow_plaintext_secrets: false
when@test:
league_oauth2_server:
+2
View File
@@ -0,0 +1,2 @@
framework:
lock: '%env(LOCK_DSN)%'
+5 -2
View File
@@ -13,7 +13,7 @@ framework:
max_retries: 3
multiplier: 2
failed: 'doctrine://default?queue_name=failed'
# sync: 'sync://'
sync: 'sync://'
default_bus: messenger.bus.default
@@ -21,9 +21,12 @@ framework:
messenger.bus.default: []
routing:
Symfony\Component\Mailer\Messenger\SendEmailMessage: async
Symfony\Component\Mailer\Messenger\SendEmailMessage: sync
Symfony\Component\Notifier\Message\ChatMessage: async
Symfony\Component\Notifier\Message\SmsMessage: async
App\Message\MailjetNewsletterEventMessage: async
App\Message\CreateClickUpBookingTaskMessage: async
App\Message\RoleNominationMessage: async
# Route your messages to the transports
# 'App\Message\YourMessage': async
+20 -5
View File
@@ -4,6 +4,7 @@ monolog:
- bpn
- core
- auth
- admin
when@dev:
monolog:
@@ -27,11 +28,16 @@ when@dev:
path: "%kernel.logs_dir%/%kernel.environment%.core.log"
level: debug
channels: ["core"]
admin:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.admin.log"
level: debug
channels: ["admin"]
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
channels: ["!event", "!bpn", "!core", "!auth"]
channels: ["!event", "!bpn", "!core", "!auth", "!admin"]
# uncomment to get logging in your browser
# you may have to allow bigger header sizes in your Web server configuration
#firephp:
@@ -59,7 +65,7 @@ when@test:
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
when@prod:
when@prod: &prod_config
monolog:
handlers:
database:
@@ -73,9 +79,10 @@ when@prod:
level: info
channels: ["bpn"]
auth:
type: stream
type: rotating_file
max_files: 7
path: "%kernel.logs_dir%/%kernel.environment%.auth.log"
level: debug
level: info
channels: ["auth"]
core:
type: rotating_file
@@ -83,13 +90,19 @@ when@prod:
path: "%kernel.logs_dir%/%kernel.environment%.core.log"
level: info
channels: ["core"]
admin:
type: rotating_file
max_files: 7
path: "%kernel.logs_dir%/%kernel.environment%.admin.log"
level: info
channels: ["admin"]
main:
type: fingers_crossed
action_level: error
handler: nested
excluded_http_codes: [404, 405]
buffer_size: 50 # How many messages should be saved? Prevent memory leaks
channels: ["!bpn", "!core", "!auth"]
channels: ["!bpn", "!core", "!auth", "!admin"]
nested:
type: rotating_file
path: "%kernel.logs_dir%/%kernel.environment%.framework.log"
@@ -104,3 +117,5 @@ when@prod:
channels: [deprecation]
path: php://stderr
formatter: monolog.formatter.json
when@staging: *prod_config
+3
View File
@@ -0,0 +1,3 @@
framework:
property_info:
with_constructor_extractor: true
+6 -3
View File
@@ -2,9 +2,12 @@ framework:
router:
utf8: true
# Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
#default_uri: http://localhost
# How URLs are generated where there is no request to take the host from: scheduled
# commands and, notably, the Messenger workers that send mail off the request path.
# Without it those links would point at http://localhost. Only ever consulted in a
# non-HTTP context, so web requests keep using their own host — which matters here,
# since one codebase serves four brands.
default_uri: '%env(APP_BASE_URL)%'
when@prod:
framework:
+25 -1
View File
@@ -1,6 +1,7 @@
security:
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\InMemoryUser: 'plaintext'
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
providers:
@@ -8,6 +9,18 @@ security:
entity:
class: App\Entity\User
property: email
mailjet_webhook_provider:
memory:
users:
mailjet:
password: '%env(MAILJET_WEBHOOK_BASIC_PASSWORD)%'
roles: [ ROLE_MAILJET_WEBHOOK ]
role_hierarchy:
ROLE_ADMIN:
- ROLE_GROUPS_ADMIN
ROLE_GROUPS_ADMIN:
- ROLE_GROUPS_MANAGER
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
@@ -19,7 +32,15 @@ security:
pattern: ^/api
security: true
stateless: true
provider: app_user_provider
oauth2: true
mailjet_webhook:
pattern: ^/webhooks/mailjet/newsletter$
security: true
stateless: true
provider: mailjet_webhook_provider
http_basic:
realm: 'Mailjet Webhook'
main:
lazy: true
provider: app_user_provider
@@ -32,7 +53,9 @@ security:
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/authorize, roles: IS_AUTHENTICATED_REMEMBERED }
- { path: ^/webhooks/mailjet/newsletter$, roles: ROLE_MAILJET_WEBHOOK, requires_channel: https }
- { path: ^/authorize, roles: IS_AUTHENTICATED_REMEMBERED, requires_channel: https }
- { path: ^/, roles: PUBLIC_ACCESS, requires_channel: https }
when@test:
security:
@@ -41,6 +64,7 @@ when@test:
# important to generate secure password hashes. In tests however, secure hashes
# are not important, waste resources and increase test times. The following
# reduces the work factor to the lowest possible values.
Symfony\Component\Security\Core\User\InMemoryUser: 'plaintext'
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
algorithm: auto
cost: 4 # Lowest possible value for bcrypt
+10
View File
@@ -1,6 +1,16 @@
twig:
file_name_pattern: '*.twig'
form_themes: ['forms.html.twig']
paths:
'%kernel.project_dir%/assets/images': images
globals:
htmx_change_trigger: 'change delay:100ms'
website_base_url: '%env(APP_WEBSITE_BASE_URL)%'
customer_service_email: '%env(APP_CUSTOMER_SERVICE_EMAIL)%'
legal_notice_url: '%env(APP_LEGAL_NOTICE_URL)%'
terms_and_conditions_url: '%env(APP_TERMS_AND_CONDITIONS_URL)%'
privacy_policy_url: '%env(APP_PRIVACY_POLICY_URL)%'
insurance_revocation_url: '%env(APP_INSURANCE_REVOCATION_URL)%'
when@test:
twig:
+5
View File
@@ -0,0 +1,5 @@
twig_component:
anonymous_template_directory: 'components/'
defaults:
# Namespace & directory for components
App\Twig\Components\: 'components/'
+3 -1
View File
@@ -14,4 +14,6 @@ when@test:
intercept_redirects: false
framework:
profiler: { collect: false }
profiler:
collect: false
collect_serializer_data: true
+69
View File
@@ -0,0 +1,69 @@
zenstruck_schedule:
timezone: Europe/Berlin
mailer:
service: mailer
default_to: [email protected]
default_from: [email protected]
subject_prefix: "[MyE&P]"
schedule_extensions:
email_on_failure:
enabled: true
to: [email protected]
tasks:
- task: app:cleanup:xml-dumps
frequency: "0 1 * * *"
description: "Removes outdated XML dumps of requests/responses to BPN API for debugging"
- task: app:cleanup:log-entries
frequency: "15 1 * * *"
description: "Removes outdated log entries with a retention period of 6 months"
- task: app:draft:cleanup
frequency: "30 1 * * *"
description: "Removes expired drafts"
- task: app:cleanup:newsletter-opt-in-requests
frequency: "45 1 * * *"
description: "Removes expired pending newsletter double opt-in requests"
- task: league:oauth2-server:clear-expired-tokens
frequency: "0 * * * *"
description: "Removes expired oauth2 tokens hourly"
- task: app:bpn:refresh-travel-snapshot --refresh-after 60
frequency: "10 8-19 * * *"
description: "Syncs travel data snapshots with BusPro XML data hourly during peak hours"
- task: app:bpn:refresh-travel-snapshot --refresh-after 180
frequency: "10 20-23,0-7 * * *"
description: "Syncs travel data snapshots with BusPro XML data every 3 hours outside peak hours"
when@staging:
zenstruck_schedule:
mailer:
subject_prefix: "[MyE&P STAGING]"
when@prod:
zenstruck_schedule:
mailer:
subject_prefix: "[MyE&P PROD]"
tasks:
- task: app:bpn:xml-sync
frequency: "*/15 8-19 * * *"
description: "Syncs BusPro XML data every 15 min. during peak hours"
- task: app:bpn:xml-sync
frequency: "0 20-23,0-7 * * *"
description: "Syncs BusPro XML data hourly outside peak hours"
- task: app:bpn:sync-contingents
frequency: "5-59/15 8-19 * * *"
description: "Syncs the full contingent horizon every 15 min. during peak hours"
- task: app:bpn:sync-contingents
frequency: "5 20-23,0-7 * * *"
description: "Syncs the full contingent horizon hourly outside peak hours"
+319 -6
View File
@@ -1,3 +1,4 @@
# yaml-language-server: $schema=../vendor/symfony/dependency-injection/Loader/schema/services.schema.json
# This file is the entry point to configure your own services.
# Files in the packages/ subdirectory configure your dependencies.
@@ -5,7 +6,101 @@
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
parameters:
travel_info_base_url: '%env(APP_TRAVEL_INFO_BASE_URL)%'
terms_and_conditions_url: '%env(APP_TERMS_AND_CONDITIONS_URL)%'
path_to_keys: '%kernel.project_dir%/config/secret'
bpn_debug: '%env(APP_BPN_DEBUG)%'
default_booking_status: '%env(DEFAULT_BOOKING_STATUS)%'
newsletter_confirmation_ttl_hours: '%env(int:APP_NEWSLETTER_CONFIRMATION_TTL_HOURS)%'
travel_snapshot_retention_buffer_days: '%env(int:APP_TRAVEL_SNAPSHOT_RETENTION_BUFFER_DAYS)%'
default_email_from: '%env(APP_DEFAULT_EMAIL_FROM)%'
default_email_to: '%env(APP_DEFAULT_EMAIL_TO)%'
accommodation_inquiry_email: '%env(ACCOMMODATION_INQUIRY_EMAIL)%'
# MailJet list ids and their labels
mailjet_lists:
10321569: 'E&P Newsletter'
10321382: 'Reisen-Alert Ahrntal'
10321383: 'Reisen-Alert Davos'
10321391: 'Reisen-Alert Familienreisen'
10321384: 'Reisen-Alert Arosa-Lenzerheide'
10321385: 'Reisen-Alert Les Deux Alpes'
10321386: 'Reisen-Alert Montafon'
10321387: 'Reisen-Alert Portes du Soleil'
10321388: 'Reisen-Alert Saalbach-Hinterglemm'
10538809: 'Reisen-Alert Scuol'
10321389: 'Reisen-Alert Stubaital'
10554990: 'Reisen-Alert Ski & Boarderweek'
# Email domains whose accounts are members of staff. BusPro has no CRM selection expressing
# "works here", so ROLE_EMPLOYEE is derived from the address instead. Matched exactly on the
# domain part, never as a suffix.
employee_email_domains:
- 'ep-reisen.de'
# BusProNet "Hausleitung {CODE}" CRM selections, by selection id.
# DEPLOYMENT-CRITICAL: roles and hotel codes are synced on every login, so an id missing
# here does not merely fail to nominate a Hausleitung — it revokes the role and the hotel
# code from everyone holding it, one login at a time, with manual re-approval per user.
# Entries for houses that are not in use yet stay commented out.
bpn_crm_house_manager_ids:
1299: 'SSL'
1300: 'SST'
1301: 'MVK'
# 1302: 'ASB'
1303: 'LPJ'
1304: 'DKS'
1305: 'DGS'
1306: 'DPW'
1307: 'DKI'
1308: 'DWW'
1309: 'PMV'
# 1352: 'ASG'
1371: 'ASC'
1373: 'PCJ'
1374: 'SBW'
# 1375: 'UCH'
# 1376: 'SZO'
1377: 'KHH'
1459: 'SVS'
1461: 'SHM'
1462: 'AGR'
# MailJet contact metadata names for name synchronization
mailjet_contact_metadata_fields:
firstName: 'vorname'
lastName: 'nachname'
# Body dimensions ranges for BodyDimensionsType and ParticipantValidator
body_dimension_ranges:
height_min: 145
height_max: 210
weight_min: 40
weight_max: 120
shoe_size_min: 35
shoe_size_max: 50
# Season data
season_winter_from: '%env(APP_SEASON_WINTER_FROM)%'
season_summer_from: '%env(APP_SEASON_SUMMER_FROM)%'
# domain mapping for theme, gtm id and cmp url
domain_config:
ep-reisen.de:
theme: base
gtm_id: GTM-56LWRF
cmp_url: https://consent.cookiefirst.com/sites/my.ep-reisen.de-28eabc35-7085-4d8f-b450-522bd1a5247c/consent.js
ski-boarderweek.de:
theme: sbw
gtm_id: GTM-MS2C8CH
cmp_url: https://consent.cookiefirst.com/sites/my.ski-boarderweek.de-d3641c34-8183-4b8d-b56e-c052e7a9223e/consent.js
semesterende-skireisen.de:
theme: ser
gtm_id: GTM-MNKDKL9
cmp_url: https://consent.cookiefirst.com/sites/my.semesterende-skireisen.de-c9b3422d-eb62-4ce4-b8f7-91e9b509e26f/consent.js
snowzone.net:
theme: snz
gtm_id: GTM-M96CKL
cmp_url: https://consent.cookiefirst.com/sites/my.snowzone.net-8e6aea0c-7d93-42a0-a822-29fff2aa5613/consent.js
services:
# default configuration for services in *this* file
@@ -14,9 +109,13 @@ services:
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
bind:
$xmlExport: '@xml_export.storage'
$xmlSource: '@xml_source.storage'
$xmlDump: '@xml_dump.storage'
$jsonExport: '@json_export.storage'
$travelInfoBaseUrl: '%env(APP_TRAVEL_INFO_BASE_URL)%'
$termsAndConditionsUrl: '%terms_and_conditions_url%'
$logger: '@monolog.logger.core'
$environment: '%kernel.environment%'
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
@@ -25,6 +124,7 @@ services:
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Model'
- '../src/Kernel.php'
App\BusProNet\ApiClient:
@@ -34,31 +134,244 @@ services:
bpn_username: '%env(APP_BPN_USER)%'
bpn_password: '%env(APP_BPN_PASSWORD)%'
bpn_api_ip: '%env(APP_BPN_IP)%'
bpn_api_port: '%env(APP_BPN_PORT)%'
bpn_api_ports: '%env(csv:APP_BPN_PORTS)%'
debug: '%env(bool:APP_BPN_DEBUG)%'
connection_timeout: '%env(int:APP_BPN_CONNECTION_TIMEOUT)%'
stream_timeout: '%env(int:APP_BPN_STREAM_TIMEOUT)%'
total_timeout: '%env(int:APP_BPN_TOTAL_TIMEOUT)%'
App\Twig\AppRuntime:
arguments:
$intlExtension: '@twig.extension.intl'
App\Menu\MenuBuilder:
App\Command\GenerateKeysCommand:
arguments:
$path: '%path_to_keys%'
App\Menu\AdminMenuBuilder:
arguments:
$factory: '@knp_menu.factory'
tags:
- name: knp_menu.menu_builder
method: createMainMenu
alias: main
alias: admin_main
App\Command\GenerateKeysCommand:
App\Menu\GroupsMenuBuilder:
arguments:
$path: '%path_to_keys%'
$factory: '@knp_menu.factory'
tags:
- name: knp_menu.menu_builder
method: createMainMenu
alias: groups_main
App\Service\BpnXmlSyncManager:
arguments:
$xmlSource: '@xml_source.storage'
$xmlExport: '@xml_export.storage'
$bpnCache: '@bpn.cache'
App\Command\BpnXmlCacheInvalidateCommand:
arguments:
$xmlExport: '@xml_export.storage'
$bpnCache: '@bpn.cache'
$cache: '@cache.app'
App\Security\Crypt:
arguments:
$path: '%path_to_keys%'
App\Service\TravelDataService:
App\Service\TravelSnapshotManager:
arguments:
$retentionBufferDays: '%travel_snapshot_retention_buffer_days%'
App\Service\TravelDataProvider:
arguments:
$logger: '@monolog.logger.core'
$preferRemote: '%env(bool:APP_TRAVEL_PREFER_REMOTE)%'
$enableFallback: '%env(bool:APP_TRAVEL_ENABLE_FALLBACK)%'
App\Service\ParticipantFormSupport:
arguments:
$bodyDimensionRanges: '%body_dimension_ranges%'
App\Service\BookingEditDataLoader:
arguments:
$bpnCache: '@bpn.cache'
App\BusProNet\XmlLoader\TravelLoader:
arguments:
$cache: '@bpn.cache'
App\BusProNet\XmlLoader\HotelLoader:
arguments:
$cache: '@bpn.cache'
App\BusProNet\XmlLoader\PickupLoader:
arguments:
$cache: '@bpn.cache'
App\BusProNet\XmlLoader\InsuranceLoader:
arguments:
$cache: '@bpn.cache'
App\Service\VoucherValidator:
arguments:
$cache: '@cache.app'
$logger: '@monolog.logger.bpn'
# Field Handlers with dependencies
App\Form\Service\ParticipantInsuranceFieldHandler: ~
App\Form\Service\ParticipantBulkInsuranceFieldHandler: ~
App\Form\Service\ParticipantTransportationDiscountReplacementFieldHandler: ~
App\Form\Service\ParticipantPurchaseVoucherFieldHandler: ~
App\Form\Service\ParticipantPromoVoucherFieldHandler: ~
# Participant Field Handler Registry - most handlers instantiate dependencies directly, some use services
App\Form\Service\ParticipantFieldHandlerRegistry:
arguments:
$handlers:
# Simple handlers with no external dependencies - instantiated directly
- 'App\Form\Service\ParticipantAssignedRoomFieldHandler'
- 'App\Form\Service\ParticipantRemarksRoomFieldHandler'
- 'App\Form\Service\ParticipantAdditionalServicesFieldHandler'
- 'App\Form\Service\ParticipantCoursesFieldHandler'
- 'App\Form\Service\ParticipantBoardFieldHandler'
- 'App\Form\Service\ParticipantVegFieldHandler'
- 'App\Form\Service\ParticipantRentalsFieldHandler'
- 'App\Form\Service\ParticipantSkiPassFieldHandler'
- 'App\Form\Service\ParticipantTransportationOutboundFieldHandler'
- 'App\Form\Service\ParticipantTransportationInboundFieldHandler'
- 'App\Form\Service\ParticipantPickupFieldHandler'
- 'App\Form\Service\ParticipantDropOffFieldHandler'
- 'App\Form\Service\ParticipantRentalInsuranceFieldHandler'
- 'App\Form\Service\ParticipantLicensePlateFieldHandler'
# Complex handlers with dependencies - use service references
- '@App\Form\Service\ParticipantDateOfBirthFieldHandler'
- '@App\Form\Service\ParticipantTransportationDiscountReplacementFieldHandler'
- '@App\Form\Service\ParticipantBulkInsuranceFieldHandler'
- '@App\Form\Service\ParticipantInsuranceFieldHandler'
- '@App\Form\Service\ParticipantPurchaseVoucherFieldHandler'
- '@App\Form\Service\ParticipantPromoVoucherFieldHandler'
- '@App\Form\Service\ParticipantParkingFieldHandler'
# Booking Status Rules
App\BusProNet\Service\StatusRule\Selection1473StatusRule: ~
App\BusProNet\Service\StatusRule\ChaperonServiceStatusRule: ~
# Booking Status Rule Registry
App\BusProNet\Service\BookingStatusRuleRegistry:
arguments:
$rules:
- '@App\BusProNet\Service\StatusRule\Selection1473StatusRule'
- '@App\BusProNet\Service\StatusRule\ChaperonServiceStatusRule'
# Dashboard Widgets
App\Dashboard\Widget\OpenGroupBookingsWidgetProvider: ~
App\Dashboard\Widget\PendingRoleApprovalsWidgetProvider: ~
App\Dashboard\Widget\RecentLogEntriesWidgetProvider: ~
# Dashboard Widget Registry
App\Dashboard\DashboardWidgetRegistry:
arguments:
$providers:
- '@App\Dashboard\Widget\OpenGroupBookingsWidgetProvider'
- '@App\Dashboard\Widget\PendingRoleApprovalsWidgetProvider'
- '@App\Dashboard\Widget\RecentLogEntriesWidgetProvider'
App\Service\CmsDataProvider:
arguments:
$httpClient: '@typo3.client'
$apiKey: 'AbcAbc123'# dummy key, not yet implemented
App\Logger\RequestIdProcessor:
tags:
- { name: monolog.processor }
App\Service\NewsletterManager:
arguments:
$newsletterConfirmationTtlHours: '%newsletter_confirmation_ttl_hours%'
$mailjetLists: '%mailjet_lists%'
$defaultMailjetListId: '%env(default::MAILJET_DEFAULT_LIST_ID)%'
App\Controller\Api\NewsletterSubscriptionController:
arguments:
$mailjetLists: '%mailjet_lists%'
App\Controller\Webhook\MailjetNewsletterWebhookController:
arguments:
$mailjetLists: '%mailjet_lists%'
App\BusProNet\XmlParser\CrmAttributesResponseParser:
arguments:
$houseManagerIds: '%bpn_crm_house_manager_ids%'
App\Security\EmployeeDomainMatcher:
arguments:
$domains: '%employee_email_domains%'
App\Service\DomainConfigProvider:
arguments:
$domainConfig: '%domain_config%'
App\Email\Mailer:
arguments:
$defaults:
from: '%default_email_from%'
to: '%default_email_to%'
App\Service\AccommodationBookingService:
arguments:
$accommodationEmail: '%accommodation_inquiry_email%'
App\Service\AccommodationTermsUrlProvider:
arguments:
$config:
AT: '%env(ACCOMMODATION_TERMS_AT)%'
CH: '%env(ACCOMMODATION_TERMS_CH)%'
IT: '%env(ACCOMMODATION_TERMS_IT)%'
App\Service\GroupsPriceCalculator:
arguments:
$config:
runningCostsEur: '%env(float:APP_RUNNING_COSTS_FACTOR_EUR)%'
runningCostsChf: '%env(float:APP_RUNNING_COSTS_FACTOR_CHF)%'
undersubscription30Eur: '%env(float:APP_UNDERSUBSCRIPTION_SURCHARGE_30_EUR)%'
undersubscription30Chf: '%env(float:APP_UNDERSUBSCRIPTION_SURCHARGE_30_CHF)%'
undersubscription40Eur: '%env(float:APP_UNDERSUBSCRIPTION_SURCHARGE_40_EUR)%'
undersubscription40Chf: '%env(float:APP_UNDERSUBSCRIPTION_SURCHARGE_40_CHF)%'
App\Validator\Constraints\ParticipantValidator:
arguments:
$bodyDimensionRanges: '%body_dimension_ranges%'
App\BpnConnect\AbstractApiClient:
abstract: true
arguments:
$baseUrl: '%env(default::BPN_CONNECT_BASE_URL)%'
$apiKey: '%env(default::BPN_CONNECT_API_KEY)%'
App\BpnConnect\ContingentsClient:
parent: App\BpnConnect\AbstractApiClient
App\ClickUp\ApiClient:
arguments:
$apiToken: '%env(default::CLICKUP_API_TOKEN)%'
$listId: '%env(default::CLICKUP_LIST_ID)%'
$templateId: '%env(default::CLICKUP_TEMPLATE_ID)%'
$baseUrl: '%env(default::CLICKUP_API_BASE_URL)%'
App\Mailjet\ApiClient:
arguments:
$apiKey: '%env(default::MAILJET_API_KEY)%'
$apiSecret: '%env(default::MAILJET_API_SECRET)%'
$apiBaseUrl: '%env(default::MAILJET_API_BASE_URL)%'
$defaultListId: '%env(default::MAILJET_DEFAULT_LIST_ID)%'
$contactMetadataFields: '%mailjet_contact_metadata_fields%'
App\EventListener\MaintenanceModeListener:
arguments:
$options:
enabled: '%env(bool:MAINTENANCE_MODE_ENABLED)%'
whitelisted_ips: '%env(csv:MAINTENANCE_MODE_IP_WHITELIST)%'
whitelisted_routes: '%env(csv:MAINTENANCE_MODE_ROUTE_WHITELIST)%'
whitelisted_paths: '%env(csv:MAINTENANCE_MODE_PATH_WHITELIST)%'

Some files were not shown because too many files have changed in this diff Show More