Compare commits

..

501 Commits

Author SHA1 Message Date
Rıdvan Akca
ff0dd0b415 feat(monday): add create board action 2024-05-08 12:14:32 +02:00
Rıdvan Akca
f0b5d85a7a feat(monday): add new boards trigger 2024-05-03 14:46:07 +02:00
Rıdvan Akca
2295507a2c feat(monday): add monday integration 2024-05-03 14:04:57 +02:00
Ömer Faruk Aydın
788530be45 Merge pull request #1843 from automatisch/dockerignore
chore: Add .env and yarn error log files to dockerignore
2024-04-26 17:27:55 +02:00
Faruk AYDIN
7ed392e854 chore: Add .env and yarn error log files to dockerignore 2024-04-26 17:19:18 +02:00
Ömer Faruk Aydın
3932e554da Merge pull request #1842 from automatisch/node-gyp
chore: Explicitly install node-gyp
2024-04-26 16:45:30 +02:00
Faruk AYDIN
1a21624618 chore: Explicitly install node-gyp 2024-04-26 16:39:14 +02:00
Ömer Faruk Aydın
9f292ff018 Merge pull request #1840 from automatisch/update-bcrypt
chore: Update bcrypt version to 5.1.0
2024-04-26 15:43:47 +02:00
Faruk AYDIN
dbb24b3a9b chore: Update bcrypt version to 5.1.0 2024-04-26 15:36:36 +02:00
Ali BARIN
35b2639837 Merge pull request #1839 from automatisch/dockerfile-revision
chore: direct builds in docker
2024-04-26 15:02:37 +02:00
Ali BARIN
35951199cd chore: direct builds in docker 2024-04-26 14:42:56 +02:00
Ali BARIN
79af909c51 Merge pull request #1832 from automatisch/align-404-page-center
fix: align 404 page content to the center
2024-04-26 14:22:26 +02:00
Ali BARIN
3482aa7b76 Merge pull request #1837 from automatisch/logout-endpoint-web-implementation
feat: implement revoke access token with RQ
2024-04-26 14:20:49 +02:00
Ali BARIN
5dbc1f59ef Merge pull request #1835 from automatisch/logout-endpoint
feat: add DELETE /access-tokens/:token
2024-04-26 14:18:59 +02:00
Ali BARIN
2166a3220e style: add break line before variable declaration and beforeEach 2024-04-26 12:02:38 +00:00
Ali BARIN
24a7d1ef10 Merge pull request #1833 from automatisch/aut-931
feat: remove static page title
2024-04-26 11:51:03 +02:00
Ali BARIN
18ffbb7317 fix(AccountDropdownMenu): await token revocation request 2024-04-26 09:27:41 +00:00
Rıdvan Akca
363874de6a feat: implement revoke access token with RQ 2024-04-26 09:25:50 +00:00
Ali BARIN
68d1719b11 feat: add new methods to cors options 2024-04-26 09:25:27 +00:00
Ali BARIN
1a75d81268 test: add test for revoking access token 2024-04-26 09:16:53 +00:00
Ali BARIN
2163be4227 feat: add DELETE /access-tokens/:token 2024-04-24 15:31:22 +00:00
Ali BARIN
b54afcd922 Merge pull request #1825 from automatisch/access-tokens
feat: Use persisted access tokens for authentication
2024-04-24 16:39:57 +02:00
Ali BARIN
0a86641a0f feat: remove static page title 2024-04-24 15:27:37 +02:00
kasia.oczkowska
18464c746a fix: align 404 page content to the center 2024-04-24 13:20:07 +01:00
Ömer Faruk Aydın
ba92cddae1 Merge pull request #1828 from automatisch/aut-932
feat: compute DOCS_URL in authDocUrl
2024-04-24 12:09:19 +02:00
Faruk AYDIN
2a4f8ed45f feat: Add indexes to token and userId columns of access tokens 2024-04-24 12:03:45 +02:00
Ali BARIN
135a0028be feat: introduce DOCS_URL in authDocUrl properties 2024-04-23 12:39:38 +00:00
Ali BARIN
4da6e8372f feat: compute DOCS_URL in authDocUrl 2024-04-23 12:21:51 +00:00
Faruk AYDIN
6a7cdf2570 feat: Use persisted access tokens for authentication 2024-04-22 16:57:34 +02:00
Faruk AYDIN
73c929f25e feat: Create access tokens model 2024-04-22 15:19:17 +02:00
Ali BARIN
754c2d41c2 Merge pull request #1814 from automatisch/AUT-892
feat: remove chatwood
2024-04-17 14:40:17 +02:00
Rıdvan Akca
7201e48111 feat: remove chatwood 2024-04-17 14:29:54 +02:00
Ömer Faruk Aydın
e4292815cd Merge pull request #1812 from automatisch/AUT-917
fix: expose missing createdAt and updatedAt fields from flow
2024-04-16 14:10:26 +02:00
Rıdvan Akca
ab37250d5d fix: expose missing createdAt and updatedAt fields from flow 2024-04-15 13:57:38 +02:00
Ömer Faruk Aydın
e5be8d3ba7 Merge pull request #1802 from automatisch/AUT-688
refactor: rewrite get connected apps with RQ
2024-04-15 11:43:35 +02:00
Ali BARIN
96a421fa22 Merge pull request #1811 from automatisch/AUT-920
fix: make inputs look and behave disabled when flow is in published state
2024-04-12 16:19:37 +02:00
kasia.oczkowska
12f72401b1 fix: make inputs look and behave disabled when flow is in published state 2024-04-12 14:58:24 +01:00
Ali BARIN
7391a9eddc Merge pull request #1810 from automatisch/AUT-921
fix: disable add connection button for unauthorized users
2024-04-12 15:15:38 +02:00
Ali BARIN
30dee27f72 Merge pull request #1809 from automatisch/AUT-914
fix: invalidate app connections upon reconnecting a connection
2024-04-12 15:15:11 +02:00
Ali BARIN
51a9939034 Merge pull request #1808 from automatisch/AUT-922
fix: disable create flow button when user doesn't have permissions
2024-04-12 15:14:44 +02:00
Ali BARIN
e03c6e0ca4 Merge pull request #1807 from automatisch/update-query-key
fix: update old query key
2024-04-12 15:14:26 +02:00
Rıdvan Akca
bece5c6488 fix: invalidate app connections upon reconnecting a connection 2024-04-12 14:55:45 +02:00
kasia.oczkowska
d49bb4c52d fix: disable add connection button for unauthorized users 2024-04-12 13:43:26 +01:00
kattoczko
73d0eec30c Merge branch 'main' into update-query-key 2024-04-12 14:10:40 +02:00
kasia.oczkowska
5c756b16ca fix: disable create flow button when user doesn't have permissions 2024-04-12 12:41:50 +01:00
Ali BARIN
f482c2422c Merge pull request #1806 from automatisch/AUT-913
fix: invalidate app connections upon creating a connection
2024-04-12 13:31:03 +02:00
kasia.oczkowska
2e564c863f fix: update old query key 2024-04-12 12:25:02 +01:00
Rıdvan Akca
d9917a81bb fix: invalidate app connections upon creating a connection 2024-04-12 13:10:51 +02:00
Ali BARIN
61dc431f92 Merge pull request #1805 from automatisch/AUT-919
fix: pass current user id to usePlanAndUsage hook
2024-04-12 13:06:57 +02:00
Ali BARIN
7d2fb8d9d7 Merge pull request #1803 from automatisch/AUT-912
fix: invalidate useCurrentUser when updating profile settings
2024-04-12 13:06:24 +02:00
Ali BARIN
608b79b66f Merge pull request #1804 from automatisch/unify-query-keys 2024-04-12 11:57:13 +02:00
kasia.oczkowska
009754c18b fix: pass current user id to usePlanAndUsage hook 2024-04-12 10:43:40 +01:00
Rıdvan Akca
5df07c289e fix: invalidate useCurrentUser when updating profile settings 2024-04-12 11:28:13 +02:00
kasia.oczkowska
a36d10870b feat: unify react-query query keys 2024-04-12 10:07:51 +01:00
kasia.oczkowska
b549ba3e39 refactor: rewrite get connected apps with RQ 2024-04-11 14:00:53 +01:00
Ali BARIN
897c96361f Merge pull request #1801 from automatisch/remove-unused-get-app-auth-client
refactor: remove not used files related to gql get-app-auth-client
2024-04-11 12:18:03 +02:00
kasia.oczkowska
e7693d8aa6 refactor: remove not used files related to gql get-app-auth-client 2024-04-11 11:10:58 +01:00
Ali BARIN
1fe755f836 Merge pull request #1800 from automatisch/AUT-689
refactor: rewrite useDynamicData with RQ
2024-04-10 17:47:22 +02:00
Rıdvan Akca
ea1a63f7dd refactor: rewrite useDynamicData with RQ 2024-04-10 17:25:01 +02:00
Ali BARIN
85134722a5 Merge pull request #1799 from automatisch/AUT-709
refactor: rewrite test connection with RQ
2024-04-10 17:21:37 +02:00
Rıdvan Akca
5c9d3ed134 refactor: rewrite test connection with RQ 2024-04-10 16:39:55 +02:00
Ali BARIN
17fb935ea0 Merge pull request #1798 from automatisch/fix-flow-counts
fix: show flow counts using useConnectionFlows
2024-04-10 16:37:06 +02:00
Ali BARIN
196642a1cf feat(AppConnectionRow): embed skeleton in place of flow count 2024-04-10 14:08:30 +00:00
Rıdvan Akca
009cf63d8c fix: show flow counts using useConnectionFlows 2024-04-10 15:29:21 +02:00
Ali BARIN
da399aacd6 Merge pull request #1766 from automatisch/AUT-705
refactor: rewrite useStepWithTestExecutions with RQ
2024-04-10 13:30:04 +02:00
Rıdvan Akca
3632ee77e5 refactor: rewrite useStepWithTestExecutions with RQ 2024-04-09 16:32:52 +02:00
Ali BARIN
2901f337cc Merge pull request #1797 from automatisch/disable-retry-on-mount
fix: disable retry on mount by default
2024-04-09 14:31:57 +02:00
Ali BARIN
f0bd2f335b fix: disable retry on mount by default 2024-04-08 15:20:10 +00:00
Ali BARIN
acdd026448 Merge pull request #1780 from automatisch/AUT-686
refactor: rewrite useBillingAndUsageData with useSubscription and useUserTrial
2024-04-08 15:22:55 +02:00
Ali BARIN
fb0a328ab0 Merge pull request #1791 from automatisch/AUT-905
refactor: rewrite get app connections with RQ
2024-04-08 15:21:02 +02:00
Rıdvan Akca
d2a7889fc9 refactor: remove useBillingAndUsageData hook 2024-04-08 14:49:37 +02:00
Rıdvan Akca
88c50e014d fix: update SubscriptionCancelledAlert and CheckoutCompletedAlert based on useSubscription and useUserTrial 2024-04-08 14:45:42 +02:00
Rıdvan Akca
f0ef12f904 refactor: rewrite useSubscription with RQ and use it in UsageDataInformation 2024-04-08 14:45:42 +02:00
Rıdvan Akca
1827f5413f refactor(useUserTrial): return hasTrial field from hook 2024-04-08 14:45:42 +02:00
Rıdvan Akca
0609f30e25 feat: introduce usePlanAndUsage with RQ 2024-04-08 14:45:42 +02:00
Rıdvan Akca
d4e4d95b6d refactor: rewrite get app connections with RQ 2024-04-08 14:44:36 +02:00
Ali BARIN
d74af4931e Merge pull request #1793 from automatisch/AUT-682
refactor: rewrite useAuthClients with RQ
2024-04-08 14:40:44 +02:00
Ali BARIN
bee043d10d Merge pull request #1792 from automatisch/fix-deleting-flows
fix: refetch app flows after delete and duplicate
2024-04-08 14:25:52 +02:00
Rıdvan Akca
a65e48b98a fix: refetch app flows after delete and duplicate 2024-04-08 13:52:32 +02:00
Ali BARIN
ee26b54d54 Merge pull request #1761 from automatisch/AUT-859
refactor: rewrite useFlow and useStepConnection with RQ
2024-04-08 13:33:48 +02:00
Ömer Faruk Aydın
855ec53dc2 Merge pull request #1795 from automatisch/rest-get-user-apps
feat: Implement users get apps API endpoint
2024-04-07 03:54:47 +02:00
Faruk AYDIN
3e3e48110d feat: Implement users get apps API endpoint 2024-04-07 03:45:33 +02:00
Rıdvan Akca
fc04a357c8 refactor: rewrite useFlow and useStepConnection with RQ 2024-04-05 17:51:28 +02:00
Ali BARIN
c8147370de Merge pull request #1794 from automatisch/fix-application-page
fix: destructure app config data correctly on Application page
2024-04-05 16:50:57 +02:00
kasia.oczkowska
999426be89 fix: destructure app config data correctly on Application page 2024-04-05 15:36:50 +01:00
kasia.oczkowska
91458f91ef refactor: rewrite useAuthClients with RQ 2024-04-05 15:35:05 +01:00
Ali BARIN
4b9ed29cc0 Merge pull request #1758 from automatisch/dependabot/npm_and_yarn/webpack-dev-middleware-5.3.4
chore(deps): bump webpack-dev-middleware from 5.3.0 to 5.3.4
2024-04-05 16:03:44 +02:00
Ali BARIN
e3bcb673fb Merge pull request #1787 from automatisch/dependabot/npm_and_yarn/vite-3.2.10
chore(deps): bump vite from 3.2.8 to 3.2.10
2024-04-05 16:03:20 +02:00
Ali BARIN
bf4776ca4f Merge pull request #1788 from automatisch/AUT-867
fix: introduce fix for token management
2024-04-05 14:19:05 +02:00
Ali BARIN
9f7f30a92a Merge pull request #1790 from automatisch/AUT-907
fix: set loading false if there is no flowName
2024-04-05 14:18:03 +02:00
Rıdvan Akca
5c29fff55e fix: set loading false if there is no flowName 2024-04-05 14:06:29 +02:00
Ali BARIN
a0160c2573 Merge pull request #1789 from automatisch/fix-use-apps
fix: introduce fix for useApps not using name as param
2024-04-05 12:00:50 +02:00
kasia.oczkowska
87d3ca287d fix: introduce fix for useApps not using name as param 2024-04-05 10:48:49 +01:00
kasia.oczkowska
526e093689 fix: introduce fix for token management 2024-04-04 14:16:25 +01:00
Ömer Faruk Aydın
0930c9d8d6 Merge pull request #1786 from automatisch/flow-error-message
fix: Use soft deleted filter to get soft deleted user
2024-04-04 00:50:50 +02:00
dependabot[bot]
ec680a713d chore(deps): bump vite from 3.2.8 to 3.2.10
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 3.2.8 to 3.2.10.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v3.2.10/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v3.2.10/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-03 18:08:37 +00:00
Faruk AYDIN
583f90d1e9 fix: Use soft deleted filter to get soft deleted user 2024-04-03 19:10:40 +02:00
Ömer Faruk Aydın
8ba95381bc Merge pull request #1784 from automatisch/create-dynamic-data-action
feat: Implement create dynamic data API endpoint
2024-04-03 01:23:14 +02:00
Faruk AYDIN
ec6d634b99 feat: Implement create dynamic data API endpoint 2024-04-03 01:17:06 +02:00
Ali BARIN
bc082acbe7 Merge pull request #1785 from automatisch/make-stages-dynamic-in-pipedrive
feat(pipedrive/create-deal): add dynamic stages
2024-04-03 00:09:46 +02:00
Ali BARIN
e474ba02cb Merge pull request #1645 from automatisch/flex-http-request
feat(http-request/custom-request): utilize accept header for parsing response
2024-04-02 19:54:44 +02:00
Ali BARIN
ea922aaf10 feat(pipedrive/create-deal): add dynamic stages 2024-04-02 15:43:53 +00:00
Ömer Faruk Aydın
766e6e20d8 Merge pull request #1783 from automatisch/rest-test-connection
feat: Implement test connection API endpoint
2024-03-30 00:22:38 +01:00
Faruk AYDIN
8e646c244e feat: Implement test connection API endpoint 2024-03-30 00:12:59 +01:00
Ömer Faruk Aydın
26f31a5899 Merge pull request #1782 from automatisch/rest-get-app-connections
feat: Implement get app connections API endpoint
2024-03-29 00:44:15 +01:00
Faruk AYDIN
5c79e374dd feat: Implement get app connections API endpoint 2024-03-29 00:21:58 +01:00
Ömer Faruk Aydın
7c1473ea95 Merge pull request #1781 from automatisch/fix-app-config-endpoint
fix: Fetch app auth clients for app config endpoint
2024-03-28 22:55:46 +01:00
Faruk AYDIN
1fe4cc3258 fix: Fetch app auth clients for app config endpoint 2024-03-28 22:48:17 +01:00
Ömer Faruk Aydın
042ad4cea1 Merge pull request #1774 from automatisch/rest-admin-get-app-auth-client
feat: Implement new admin get app auth client API endpoint
2024-03-28 20:47:50 +01:00
Ömer Faruk Aydın
e4c998dbce Merge pull request #1773 from automatisch/rest-admin-get-app-auth-clients
feat: Implement new admin get auth clients API endpoint
2024-03-28 20:47:40 +01:00
Ömer Faruk Aydın
83c8cacdac Merge pull request #1771 from automatisch/rest-get-app-auth-clients
feat: Implement new get app auth clients API endpoint
2024-03-28 20:47:12 +01:00
Ömer Faruk Aydın
f75d5d906e Merge pull request #1770 from automatisch/add-app-key-to-auth-clients
feat: Implement new get auth clients api endpoint
2024-03-28 20:44:51 +01:00
Faruk AYDIN
85b3856564 chore: Correct the folder of get auth client mock 2024-03-28 20:41:12 +01:00
Faruk AYDIN
75cb2569b5 chore: Remove old app auth client routers 2024-03-28 20:41:12 +01:00
Faruk AYDIN
0a4ac1cece feat: Implement new admin get app auth client API endpoint 2024-03-28 20:41:12 +01:00
Faruk AYDIN
a873fd14bd chore: Remove old admin app auth clients API endpoint 2024-03-28 20:40:45 +01:00
Faruk AYDIN
85b4cd4998 feat: Implement new admin get auth clients API endpoint 2024-03-28 20:40:45 +01:00
Faruk AYDIN
e9bc9b1aa8 fix: Typo for the get auth clients test file 2024-03-28 20:40:45 +01:00
Faruk AYDIN
e3bf599bf6 feat: Implement new get app auth clients API endpoint 2024-03-28 20:40:14 +01:00
Faruk AYDIN
01ae96840e refactor: Remove redundant appConfigId from get auth clients mock 2024-03-28 20:38:46 +01:00
Faruk AYDIN
186160ebf4 feat: Make appKey column of app auth clients not nullable 2024-03-28 20:38:46 +01:00
Faruk AYDIN
70f5e45c1f chore: Remove old app auth clients API endpoint 2024-03-28 20:38:46 +01:00
Faruk AYDIN
6dc54ecabc feat: Implement new get auth clients api endpoint 2024-03-28 20:38:46 +01:00
Faruk AYDIN
d21888c047 feat: Remove app config relation from app auth clients 2024-03-28 20:38:46 +01:00
Faruk AYDIN
33f7a90042 feat: Remove app auth clients relation from app configs 2024-03-28 20:38:46 +01:00
Faruk AYDIN
a00d3a2c5e feat: Remove app config id from app auth clients 2024-03-28 20:38:46 +01:00
Faruk AYDIN
abc64d769c feat: Migrate app config id to app key 2024-03-28 20:38:46 +01:00
Faruk AYDIN
88754ac569 feat: Add appKey to app auth clients 2024-03-28 20:38:46 +01:00
Ali BARIN
e3ee05d47d Merge pull request #1772 from automatisch/fix-signal
fix(useDynamicFields): pass signal in RQ
2024-03-28 14:22:39 +01:00
Rıdvan Akca
3b004e7483 fix(useDynamicFields): pass signal in RQ 2024-03-27 10:57:17 +03:00
Ali BARIN
9aa48c20e4 Merge pull request #1764 from automatisch/AUT-872
refactor: rewrite useDynamicFields with RQ
2024-03-26 16:58:43 +01:00
Rıdvan Akca
1b5d3beeca refactor: rewrite useDynamicFields with RQ 2024-03-26 18:50:36 +03:00
Ömer Faruk Aydın
00115d313e Merge pull request #1769 from automatisch/rest-logger
refactor: Use additional logger line only for graphQL
2024-03-26 16:25:12 +01:00
Faruk AYDIN
190f1a205f refactor: Use additional logger line only for graphQL 2024-03-26 15:39:02 +01:00
Ali BARIN
8ab6f0c3fe Merge pull request #1767 from automatisch/fix-trial-badge
fix: show trial status badge if user has trial
2024-03-26 13:52:40 +01:00
Rıdvan Akca
13eea263c0 fix: show trial status badge if user has trial 2024-03-26 15:45:26 +03:00
Ömer Faruk Aydın
b52b40962e Merge pull request #1768 from automatisch/rest-create-access-token
feat: Implement create access token API endpoint
2024-03-26 13:31:18 +01:00
Faruk AYDIN
7d1fa2e40c feat: Implement create access token API endpoint 2024-03-26 13:14:33 +01:00
Faruk AYDIN
93b2098829 refactor: Extract token generation logic to User model 2024-03-26 13:14:10 +01:00
Faruk AYDIN
a2acdc6b12 feat: Add draft version of renderError to renderer helper 2024-03-26 13:13:37 +01:00
Ali BARIN
38b2c1e30f Merge pull request #1765 from automatisch/refactor-get-app-config
refactor: Move app config endpoint to apps namespace
2024-03-26 12:38:42 +01:00
Rıdvan Akca
e07f579f3c refactor: update endpoint in useAppConfig 2024-03-25 19:12:45 +03:00
Faruk AYDIN
df3297b6ca refactor: Move app config endpoint to apps namespace 2024-03-25 17:01:16 +01:00
Ömer Faruk Aydın
fc4eeed764 Merge pull request #1760 from automatisch/rest-app-auth-clients
feat: Implement get app auth clients API endpoint
2024-03-22 15:20:00 +01:00
Faruk AYDIN
3596d13be1 feat: Implement get app auth clients API endpoint 2024-03-22 15:05:37 +01:00
Ömer Faruk Aydın
104d49ea1c Merge pull request #1759 from automatisch/rest-admin-app-auth-clients
feat: Implement admin get app auth clients API endpoint
2024-03-22 15:05:30 +01:00
Faruk AYDIN
7057317446 refactor: Use ee extension for admin app auth clients 2024-03-22 14:48:46 +01:00
Faruk AYDIN
280575df88 refactor: Move app auth client mock to correct folder 2024-03-22 14:46:43 +01:00
Faruk AYDIN
d2cb434b7b refactor: Move admin get app auth client mock to correct folder 2024-03-22 14:44:35 +01:00
Faruk AYDIN
2ecb802a2e feat: Implement admin get app auth clients API endpoint 2024-03-22 14:42:48 +01:00
Ali BARIN
46e706c415 Merge pull request #1756 from automatisch/AUT-687
refactor: rewrite useConfig with RQ
2024-03-22 10:24:52 +01:00
kasia.oczkowska
3a57349d8a refactor: rewrite useConfig with RQ 2024-03-22 09:14:29 +00:00
dependabot[bot]
565db852e0 chore(deps): bump webpack-dev-middleware from 5.3.0 to 5.3.4
Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.0 to 5.3.4.
- [Release notes](https://github.com/webpack/webpack-dev-middleware/releases)
- [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.0...v5.3.4)

---
updated-dependencies:
- dependency-name: webpack-dev-middleware
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-22 09:08:14 +00:00
Ali BARIN
754c3269ec Merge pull request #1739 from automatisch/dependabot/npm_and_yarn/follow-redirects-1.15.6
chore(deps): bump follow-redirects from 1.15.3 to 1.15.6
2024-03-22 10:07:35 +01:00
Ömer Faruk Aydın
a079842408 Merge pull request #1757 from automatisch/create-dynamic-fields-endpoint
feat: Implement create dynamic fields API endpoint
2024-03-22 03:05:11 +01:00
Faruk AYDIN
7664b58553 feat: Implement create dynamic fields API endpoint 2024-03-22 02:55:23 +01:00
Ali BARIN
de77488f7e Merge pull request #1754 from automatisch/AUT-697
refactor: rewrite useNotifications with RQ
2024-03-21 15:05:35 +01:00
kasia.oczkowska
d808afd21b refactor: rewrite useNotifications with RQ 2024-03-21 14:56:54 +01:00
Ömer Faruk Aydın
b68aff76a1 Merge pull request #1755 from automatisch/get-previous-steps
feat: Implement get previous steps rest API endpoint
2024-03-21 14:56:16 +01:00
Faruk AYDIN
6da7fe158f feat: Implement get previous steps rest API endpoint 2024-03-21 14:40:18 +01:00
Faruk AYDIN
4dbc7fdc7d feat: Extend step serializers to include execution steps 2024-03-21 14:39:22 +01:00
Ali BARIN
ad1e1f7eca Merge pull request #1750 from automatisch/make-respond-with-flexible
feat(webhooks/respond-with): accept custom headers
2024-03-21 12:03:51 +01:00
Ömer Faruk Aydın
9c3f7a3823 Merge pull request #1753 from automatisch/use-objection-for-factories
refactor: Use objection instead of knex for factories
2024-03-20 17:31:37 +01:00
Faruk AYDIN
86f4cb7701 refactor: Use objection instead of knex for factories 2024-03-20 17:24:44 +01:00
Ali BARIN
359a90245d Merge pull request #1734 from automatisch/AUT-845
refactor: rewrite useUsers with RQ
2024-03-20 16:08:07 +01:00
kasia.oczkowska
d8d7d86359 feat: invalidate queries on user related actions 2024-03-20 15:00:54 +00:00
Ali BARIN
7189b629c0 Merge pull request #1746 from automatisch/AUT-856
refactor: rewrite useFlows as useConnectionFlows and useAppFlows with RQ
2024-03-20 15:13:36 +01:00
kasia.oczkowska
55c9b5566c feat: rename hooks 2024-03-20 14:23:33 +01:00
kasia.oczkowska
ab671ccbf7 refactor: rewrite useUsers with RQ 2024-03-20 13:14:25 +00:00
Rıdvan Akca
316bda8c3f refactor: rewrite useFlows as useConnectionFlows and useAppFlows with RQ 2024-03-20 11:45:26 +03:00
Ömer Faruk Aydın
76f77e8a4c Merge pull request #1752 from automatisch/fix-step-factory
fix: Adjust step factory to use objection instead of knex
2024-03-20 02:15:13 +01:00
Faruk AYDIN
4a99d5eab7 fix: Adjust step factory to use objection instead of knex 2024-03-20 02:03:31 +01:00
Ali BARIN
473d287c6d feat(webhooks/respond-with): accept custom headers 2024-03-19 19:21:20 +00:00
Ömer Faruk Aydın
bddd9896e4 Merge pull request #1749 from automatisch/fix/docs-change
fix: Do not explicitly define github and context for CI actions
2024-03-19 20:08:08 +01:00
Faruk AYDIN
95eb115965 fix: Do not explicitly define github and context for CI actions 2024-03-19 17:49:05 +01:00
Ömer Faruk Aydın
9a63b213b0 Merge pull request #1747 from automatisch/docs-changes
feat: Add docs change CI workflow to detect changes
2024-03-19 17:37:56 +01:00
Faruk AYDIN
90b00d88f1 feat: Add docs change CI workflow to detect changes 2024-03-19 17:32:36 +01:00
Rıdvan Akca
ec87c7f21c feat: introduce useLazyFlows with RQ 2024-03-19 16:56:53 +03:00
Ali BARIN
452f45cac6 Merge pull request #1744 from QAComet/QAComet/manage-users-roles-update
test: fix flakiness in manage roles and users tests
2024-03-19 12:57:28 +01:00
Ali BARIN
c644b3d384 Merge pull request #1745 from automatisch/fix-unused-queries
fix: pass all params to enabled of RQ if necessary
2024-03-19 11:25:32 +01:00
Rıdvan Akca
68160c20e8 fix: pass all params to enabled of RQ if necessary 2024-03-19 13:16:08 +03:00
QAComet
ad144206dd fix(e2e): update expect to web-first assertion, wait for edit form to load 2024-03-18 12:22:56 -06:00
Ali BARIN
f3d20ab769 Merge pull request #1738 from automatisch/AUT-849
refactor: rewrite useAdminSamlAuthProviderRoleMappings with RQ
2024-03-18 15:19:33 +01:00
Ömer Faruk Aydın
9767ca7116 Merge pull request #1741 from automatisch/guard-actions-triggers
fix: Guard actions and triggers properties of apps
2024-03-17 13:26:59 +01:00
Faruk AYDIN
73a5b8553f fix: Guard actions and triggers properties of apps 2024-03-17 12:47:18 +01:00
dependabot[bot]
5c684cd499 chore(deps): bump follow-redirects from 1.15.3 to 1.15.6
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-16 20:12:03 +00:00
Ali BARIN
479f3e3172 Merge pull request #1737 from automatisch/fix-admin-applications
fix: control variables parameter in useApps hook
2024-03-15 17:26:27 +01:00
Rıdvan Akca
6a1350fd00 refactor: rewrite useAdminSamlAuthProviderRoleMappings with RQ 2024-03-15 19:03:54 +03:00
Rıdvan Akca
563784da1c fix: control variables parameter in useApps hook 2024-03-15 18:57:43 +03:00
Ali BARIN
347f0ed3a5 Merge pull request #1736 from automatisch/fix-loading-and-undefined-requests
fix: convert loading to isLoading in useUser hook
2024-03-15 16:50:07 +01:00
Rıdvan Akca
1db9f5b2c2 fix: convert loading to isLoading in useUser hook 2024-03-15 18:42:07 +03:00
Ömer Faruk Aydın
f2a3e26188 Merge pull request #1735 from automatisch/delete-step-fix
fix: Use correct model file to delete step
2024-03-15 16:42:06 +01:00
Faruk AYDIN
1c0897bfb6 fix: Use correct model file to delete step 2024-03-15 16:34:38 +01:00
Ali BARIN
f0793992a6 Merge pull request #1726 from automatisch/AUT-839
refactor: rewrite usePermissionCatalog with RQ
2024-03-15 15:28:33 +01:00
Ali BARIN
393205ba2f Merge pull request #1725 from automatisch/AUT-838
refactor: rewrite useSamlAuthProviders with RQ
2024-03-15 15:28:01 +01:00
Rıdvan Akca
ab49535b6c refactor: rewrite useSamlAuthProviders with RQ 2024-03-15 17:27:48 +03:00
Ali BARIN
8191b48548 Merge pull request #1722 from automatisch/AUT-832
refactor: rewrite useUserTrial with RQ
2024-03-15 15:19:58 +01:00
Rıdvan Akca
925dd06432 refactor: rewrite useUserTrial with RQ 2024-03-15 16:56:31 +03:00
Rıdvan Akca
0d525e056a refactor: rewrite usePermissionCatalog with RQ 2024-03-15 16:51:22 +03:00
Ali BARIN
3aa86eebf2 Merge pull request #1733 from automatisch/AUT-844
refactor: rewrite useUser with RQ
2024-03-15 14:03:20 +01:00
Ali BARIN
d7a93abec0 Merge pull request #1717 from automatisch/AUT-829
refactor: rewrite useCurrentUser with RQ
2024-03-15 14:02:09 +01:00
Ali BARIN
6448d28a18 Merge pull request #1732 from automatisch/AUT-842
refactor: rewrite useSamlAuthProvider with RQ
2024-03-15 13:59:22 +01:00
kasia.oczkowska
449976483c refactor: rewrite useUser with RQ 2024-03-15 12:55:23 +00:00
Ali BARIN
e468b762ef Merge pull request #1723 from automatisch/remove-unused-payloads
refactor: remove unused payloads from RQ
2024-03-15 13:53:45 +01:00
Rıdvan Akca
b578e73cc4 refactor: rewrite useSamlAuthProvider with RQ 2024-03-15 15:52:39 +03:00
Ali BARIN
e381f95b95 Merge pull request #1719 from automatisch/AUT-831
refactor: rewrite useSubscription with RQ
2024-03-15 13:23:06 +01:00
Ali BARIN
5685afae63 Merge pull request #1718 from automatisch/AUT-830
refactor: rewrite useInvoices with RQ
2024-03-15 13:22:21 +01:00
Ali BARIN
53a473422b Merge pull request #1731 from automatisch/AUT-841
refactor: rewrite useRole with RQ
2024-03-15 13:19:41 +01:00
Rıdvan Akca
3f9f17f584 refactor: rewrite useRole with RQ 2024-03-15 15:09:36 +03:00
QAComet
2c410bf318 docs(e2e-tests): write basic README for setting up the tests (#1730) 2024-03-15 13:08:04 +01:00
Ali BARIN
40934a2c77 Merge pull request #1727 from automatisch/AUT-840
refactor: rewrite useRoles with RQ
2024-03-15 13:03:44 +01:00
Rıdvan Akca
ecc9379d7e refactor: remove get-roles GQL query 2024-03-15 14:51:18 +03:00
Ömer Faruk Aydın
f8d27342dc Merge pull request #1729 from automatisch/rest-plan-and-usage
feat: Implement plan and usage API endpoint
2024-03-15 00:56:42 +01:00
Faruk AYDIN
17bd2bf2ba feat: Implement plan and usage API endpoint 2024-03-15 00:49:15 +01:00
Ömer Faruk Aydın
d984a3f275 Merge pull request #1728 from automatisch/rest-saml-auth-providers
feat: Implement get role mappings API endpoint
2024-03-14 16:01:34 +01:00
Faruk AYDIN
64049bd546 feat: Implement get role mappings API endpoint 2024-03-14 15:49:14 +01:00
Rıdvan Akca
9218091c33 refactor: rewrite useRoles with RQ 2024-03-14 16:33:08 +03:00
Rıdvan Akca
75df7d6413 refactor: rewrite parameters of RQ hooks 2024-03-14 13:54:51 +03:00
Ömer Faruk Aydın
29341f81e1 Merge pull request #1724 from automatisch/rest-saml-auth-providers
feat: Implement saml auth providers API endpoint
2024-03-14 10:36:33 +01:00
Faruk AYDIN
68c5a3dca7 feat: Implement saml auth providers API endpoint 2024-03-14 10:27:24 +01:00
Ömer Faruk Aydın
b1e2e370c8 Merge pull request #1720 from automatisch/rest-get-step-connection
feat: Implement get step connection API endpoint
2024-03-14 10:27:18 +01:00
Rıdvan Akca
ba9d3afc88 refactor: remove unused payloads from RQ 2024-03-14 12:25:26 +03:00
Faruk AYDIN
9a0434be32 feat: Implement get step connection API endpoint 2024-03-13 19:51:36 +01:00
Faruk AYDIN
d6923a2ff0 fix: Use insertAndFetch to get record with after find modifications 2024-03-13 19:51:36 +01:00
Faruk AYDIN
8f7f6dc19e feat: Add connection serializer 2024-03-13 19:51:36 +01:00
Rıdvan Akca
70b8817643 refactor: rewrite useSubscription with RQ 2024-03-13 18:03:29 +03:00
Rıdvan Akca
87c25cbbfe refactor: rewrite useInvoices with RQ 2024-03-13 18:01:32 +03:00
Rıdvan Akca
082e905014 refactor: remove get-current-user GQL query 2024-03-13 17:58:37 +03:00
Ali BARIN
e3e598b208 Merge pull request #1721 from automatisch/fix-public-layout
fix: introduce a fix for the content container height in the PublicLayout component
2024-03-13 15:46:21 +01:00
kasia.oczkowska
6cf92d4ea6 fix: introduce a fix for the content container height in the PublicLayout component 2024-03-13 14:28:16 +00:00
Ali BARIN
89ad685f3a Merge pull request #1716 from automatisch/AUT-828
refactor: rewrite useVersion and healthcheck with RQ
2024-03-13 11:02:38 +01:00
Rıdvan Akca
1e868dc802 refactor: rewrite useCurrentUser with RQ 2024-03-13 12:33:31 +03:00
Rıdvan Akca
58fcfd9a34 refactor: rewrite useVersion and healthcheck with RQ 2024-03-13 11:39:52 +03:00
Ali BARIN
c849afbc11 Merge pull request #1715 from automatisch/AUT-698
refactor: rewrite usePaddleInfo and usePaymentPlans with RQ
2024-03-13 09:20:39 +01:00
Rıdvan Akca
2ebe71ddd0 refactor: rewrite usePaymentPlans with RQ 2024-03-13 11:05:21 +03:00
Rıdvan Akca
7a8e8c1f3e refactor: rewrite usePaddleInfo with RQ 2024-03-12 17:21:44 +03:00
Ali BARIN
5e897ad1c2 Merge pull request #1460 from automatisch/AUT-493
feat: introduce asterisk for all the required fields
2024-03-12 14:23:53 +01:00
Ali BARIN
ce07907f85 Merge pull request #1700 from automatisch/AUT-782
feat: make flow editor topbar sticky
2024-03-12 14:21:37 +01:00
Ali BARIN
1e38aa7b53 Merge pull request #1714 from automatisch/AUT-693
refactor: rewrite get executions using useExecutions with RQ
2024-03-12 14:17:15 +01:00
Rıdvan Akca
3bc0c23e5a refactor: rewrite get executions using useExecutions with RQ 2024-03-12 15:45:04 +03:00
Ali BARIN
f07b6d105a Merge pull request #1712 from automatisch/AUT-692
refactor: rewrite get execution using useExecution with RQ
2024-03-12 12:34:48 +01:00
Rıdvan Akca
46491269e3 refactor: rewrite get execution using useExecution with RQ 2024-03-12 14:24:23 +03:00
Ali BARIN
8d9c43af6a Merge pull request #1711 from automatisch/AUT-691
refactor: rewrite get execution steps using useExecutionSteps with RQ
2024-03-12 12:23:19 +01:00
Rıdvan Akca
c3568354aa feat: use useInfinityQuery instead of useQuery in useExecutionSteps 2024-03-12 13:55:58 +03:00
Rıdvan Akca
e68696ccd4 refactor: rewrite get execution steps using useExecutionSteps with RQ 2024-03-12 12:12:09 +03:00
Ali BARIN
35d8b2e790 Merge pull request #1713 from automatisch/fix-auth-client-auth-fields
fix: use useAppAuth for getting auth fields
2024-03-11 16:18:03 +01:00
Rıdvan Akca
1f83573206 fix: use useAppAuth for getting auth fields 2024-03-11 18:07:15 +03:00
Ali BARIN
2887e76514 Merge pull request #1702 from automatisch/AUT-683
refactor: rewrite useAppConfig with RQ
2024-03-11 15:43:04 +01:00
Rıdvan Akca
63b9943203 refactor: rewrite useAppConfig with RQ 2024-03-11 17:32:55 +03:00
Ali BARIN
bd5aedd83f Merge pull request #1696 from automatisch/AUT-685
refactor: implement rest API endpoint for get app and get apps
2024-03-11 15:26:54 +01:00
Rıdvan Akca
c9ff6d7bb9 fix: pass enabled to useTriggers and useActions hooks 2024-03-11 17:17:09 +03:00
Rıdvan Akca
5835def5d0 refactor: move abort controller into useLazyApps hook 2024-03-11 16:16:12 +03:00
Ali BARIN
6a2694ce3b Merge pull request #1644 from automatisch/sync-webhook
feat(webhook/catch-raw-webhook): add sync support and custom response
2024-03-11 14:05:35 +01:00
Ali BARIN
65ae7bce79 chore(webhook/catch-raw-webhook): update description 2024-03-11 13:55:43 +01:00
Ali BARIN
57ce8da0ee feat(webhook): add respondWith action 2024-03-11 13:54:00 +01:00
Ali BARIN
7484bf7403 feat(webhook/catch-raw-webhook): add sync support 2024-03-11 13:54:00 +01:00
Ömer Faruk Aydın
f6b2312c49 Merge pull request #1710 from automatisch/rest-get-connection-flows
feat: Implement get connection flows API endpoint
2024-03-11 12:50:53 +01:00
Faruk AYDIN
6027cb7cb0 feat: Implement get connection flows API endpoint 2024-03-10 16:11:07 +01:00
Ömer Faruk Aydın
c1740aae6c Merge pull request #1708 from automatisch/rest-app-flows
feat: Implement API endpoint to get flows of the specified app
2024-03-09 15:16:01 +01:00
Faruk AYDIN
22ce29e86c feat: Implement API endpoint to get flows of the specified app 2024-03-09 15:09:12 +01:00
Ömer Faruk Aydın
251d1b5b2e Merge pull request #1707 from automatisch/rest-get-flows
feat: Implement get flows API endpoint
2024-03-08 23:21:34 +01:00
Faruk AYDIN
ea64708c69 feat: Implement get flows API endpoint 2024-03-08 23:11:42 +01:00
Ömer Faruk Aydın
209ec27a29 Merge pull request #1706 from automatisch/rest-config-api
feat: Implement automatisch config API endpoint
2024-03-08 22:49:54 +01:00
Faruk AYDIN
ceee495525 feat: Implement automatisch config API endpoint 2024-03-08 22:42:24 +01:00
Ömer Faruk Aydın
751a2347aa Merge pull request #1703 from automatisch/rest-get-subscription
feat: Implement get subscription API endpoint
2024-03-08 14:46:13 +01:00
Faruk AYDIN
efd96d5fdf feat: Implement get subscription API endpoint 2024-03-08 14:33:47 +01:00
Rıdvan Akca
2ee5af8bfb feat: add useAppAuth with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
a4c0edf493 refactor: remove getApp query from web 2024-03-07 16:53:22 +03:00
Rıdvan Akca
28c8be97b6 feat: add useLazyApps hook 2024-03-07 16:53:22 +03:00
Rıdvan Akca
f320a44d45 refactor: rewrite get-app queries with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
c0cc6cc176 refactor: rewrite get-apps queries with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
be62c09d06 refactor: rewrite useApp with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
5fe3546d2a feat: add useTriggerSubsteps and useActionSubsteps with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
c4b2ea125c feat: add useActions with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
3301b038fe feat: add useTriggers with RQ 2024-03-07 16:53:22 +03:00
Rıdvan Akca
6a58d1e3da fix(useAdminAppAuthClient): pass signal 2024-03-07 16:53:22 +03:00
Rıdvan Akca
e5670d820d refactor: rewrite useApps with RQ 2024-03-07 16:53:22 +03:00
Ömer Faruk Aydın
1870aead73 Merge pull request #1701 from automatisch/rest-get-app-config
feat: Implement get app config API endpoint
2024-03-07 14:26:46 +01:00
Faruk AYDIN
95db6cca2c feat: Implement get app config API endpoint 2024-03-07 14:18:21 +01:00
Faruk AYDIN
79a792ac62 feat: Add app config serializer 2024-03-07 14:11:00 +01:00
Kasia
6406f9eb86 feat: make flow editor topbar sticky 2024-03-07 12:20:22 +01:00
Kasia
8f8ec496f8 feat: introduce asterisk for all the required fields 2024-03-07 10:15:53 +01:00
Ali BARIN
3d6847a3a2 Merge pull request #1558 from automatisch/AUT-606
fix: remove unnecessery styling causing the problem with scrolling Edit/Create role pages
2024-03-07 00:38:20 +01:00
Ali BARIN
613abaec1b Merge pull request #1550 from automatisch/AUT-563
feat: render AdminSettingsLayout once for all child routes
2024-03-06 18:56:59 +01:00
Ömer Faruk Aydın
b51ae9ac38 Merge pull request #1698 from automatisch/rest-get-execution-steps
feat: Implement get execution steps API endpoint
2024-03-06 17:30:33 +01:00
Faruk AYDIN
c4fd03542b feat: Implement get execution steps API endpoint 2024-03-06 17:23:56 +01:00
Faruk AYDIN
e40d6c5ef0 feat: Implement execution step serializer 2024-03-06 17:23:56 +01:00
kasia.oczkowska
9f7dee3baa test: introuce test fix, select role by exact name 2024-03-06 16:28:17 +01:00
kasia.oczkowska
d3da62c04a feat: render AdminSettingsLayout once for all child routes 2024-03-06 16:28:17 +01:00
kasia.oczkowska
aa7bb3f8c9 fix: remove unnecessery styling causing the problem 2024-03-06 15:55:03 +01:00
Ali BARIN
3a9dfe339a Merge pull request #1689 from automatisch/fix-auth-in-rq
fix: initialize auth in RQ client
2024-03-06 15:52:17 +01:00
Ali BARIN
08830003a3 Merge pull request #1560 from automatisch/AUT-619
fix: add optional chaining to data.getTrialStatus check
2024-03-06 15:34:04 +01:00
kasia.oczkowska
efeeb6cb02 fix: add optional chaining to data.getTrialStatus check and introduce minor code improvements 2024-03-06 15:12:02 +01:00
Ömer Faruk Aydın
ac59ce2deb Merge pull request #1697 from automatisch/rest-get-executions
feat: Implement get executions API endpoint
2024-03-06 15:08:35 +01:00
Faruk AYDIN
3ff89a03ac feat: Implement get executions API endpoint 2024-03-06 14:46:19 +01:00
Faruk AYDIN
25e231cd7c feat: Extend execution serializer with status 2024-03-06 14:46:10 +01:00
Ömer Faruk Aydın
f4d8d909b0 Merge pull request #1695 from automatisch/sentry-enhancement
chore: Do not enable sentry for dev and test environments
2024-03-05 15:53:36 +01:00
Faruk AYDIN
35ea18a117 chore: Do not enable sentry for dev and test environments 2024-03-05 15:47:07 +01:00
Ömer Faruk Aydın
ee9433261b Merge pull request #1693 from automatisch/refactor-get-executions-tests
refactor: Add steps to get execution tests
2024-03-04 16:23:09 +01:00
Faruk AYDIN
1cb48c7760 refactor: Add steps to get execution tests 2024-03-04 16:14:11 +01:00
Ömer Faruk Aydın
172bf4bd51 Merge pull request #1692 from automatisch/remove-empty-associations
refactor: Remove empty associations from serializers
2024-03-04 16:14:00 +01:00
Faruk AYDIN
fe1039cfbc test: Add permissions to get current user tests 2024-03-04 16:07:18 +01:00
Faruk AYDIN
a9de79546b refactor: Remove empty associations from serializers 2024-03-04 16:06:50 +01:00
kasia.oczkowska
7afdf43872 feat: introduce propTypes 2024-03-04 15:21:07 +01:00
Rıdvan Akca
bfc7d5d0dd refactor(web): rewrite useAdminAppAuthClient with react-query (#1690) 2024-03-04 13:09:42 +01:00
Ömer Faruk Aydın
690832052a Merge pull request #1691 from automatisch/error-handler
feat: Send rest API errors to Sentry
2024-03-04 13:01:20 +01:00
Faruk AYDIN
f7c1a47d52 feat: Send rest API errors to Sentry 2024-03-04 12:19:53 +01:00
Ali BARIN
930843d065 fix: initialize auth in RQ client 2024-03-04 10:48:55 +00:00
Ömer Faruk Aydın
a9ee609502 Merge pull request #1688 from automatisch/rest-get-execution
feat: Implement get execution API endpoint
2024-03-03 19:06:10 +01:00
Faruk AYDIN
9fd2125923 test: Add tests for execution serializer 2024-03-03 18:58:54 +01:00
Faruk AYDIN
ede8703f9d feat: Implement get execution API endpoint 2024-03-03 18:53:14 +01:00
Faruk AYDIN
6d85623d9b feat: Add execution serializer 2024-03-03 18:52:32 +01:00
Faruk AYDIN
6236ee8f6d feat: Add authorizedExecutions to user model 2024-03-03 18:51:50 +01:00
Ömer Faruk Aydın
92665d80d6 Merge pull request #1687 from automatisch/get-action-substeps
feat: Implement get action substeps API endpoint
2024-03-02 16:30:43 +01:00
Faruk AYDIN
70ae0bc77e feat: Implement get action substeps API endpoint 2024-03-02 16:24:20 +01:00
Faruk AYDIN
e28c757352 feat: Add find action substeps method to App model 2024-03-02 16:24:20 +01:00
Ömer Faruk Aydın
7cdcf7ebab Merge pull request #1686 from automatisch/get-app-actions
feat: Implement get app actions API endpoint
2024-03-02 16:19:57 +01:00
Faruk AYDIN
7c368af5ed feat: Implement get app actions API endpoint 2024-03-02 16:13:13 +01:00
Faruk AYDIN
df2fbbabc6 feat: Implement action serializer 2024-03-02 16:12:51 +01:00
Faruk AYDIN
48141eb199 feat: Add find actions by key method to App model 2024-03-02 16:09:57 +01:00
Ömer Faruk Aydın
343fbb282c Merge pull request #1685 from automatisch/get-trigger-substeps
feat: Implement get trigger substeps API endpoint
2024-03-02 14:44:06 +01:00
Faruk AYDIN
cea9ed056b feat: Implement get trigger substeps API endpoint 2024-03-01 16:35:46 +01:00
Ali BARIN
73bd90c555 refactor(web): utilize REACT_APP_BACKEND_URL for GQL and REST API URLs 2024-03-01 15:14:22 +01:00
Ali BARIN
917de46c45 chore(web): build with API URL 2024-03-01 15:14:22 +01:00
Ali BARIN
b592092923 chore: update building web in e2e tests 2024-03-01 15:14:22 +01:00
Ali BARIN
760bc1c22a fix(useAutomatischInfo): pass signal correctly 2024-03-01 15:14:22 +01:00
Ali BARIN
1f8b81ee78 refactor: remove GetAutomatischInfo GQL query 2024-03-01 15:14:22 +01:00
Ali BARIN
70af7d05e3 refactor: remove AutomatischInfo context 2024-03-01 15:14:22 +01:00
Ali BARIN
14c04ee4ac refactor: rewrite useAutomatischInfo with RQ and REST API 2024-03-01 15:14:22 +01:00
Ali BARIN
83815d3caa feat: introduce react-query and react-query-devtools 2024-03-01 15:14:22 +01:00
Ali BARIN
487c621fa5 chore: update react and react-dom to 18 2024-03-01 15:14:22 +01:00
Ömer Faruk Aydın
304eab801c Merge pull request #1684 from automatisch/rest-get-triggers
feat: Implement get triggers API endpoint
2024-03-01 15:10:31 +01:00
Faruk AYDIN
dfe3add1cc feat: Implement get triggers API endpoint 2024-03-01 15:03:53 +01:00
Faruk AYDIN
a32bf5539e feat: Add find triggers by key method to App model 2024-03-01 15:02:56 +01:00
Faruk AYDIN
e944333e5f feat: Implement trigger serializer 2024-03-01 15:02:21 +01:00
Ömer Faruk Aydın
dad23a52b0 Merge pull request #1683 from automatisch/rest-get-apps
feat: Implement get apps API endpoint
2024-03-01 14:27:59 +01:00
Faruk AYDIN
53606c306d feat: Implement get apps API endpoint 2024-03-01 14:21:41 +01:00
Ömer Faruk Aydın
53b03f8231 Merge pull request #1680 from automatisch/available-apps
docs: Add datastore to available apps
2024-03-01 12:03:02 +01:00
Faruk AYDIN
ac5f6dc024 docs: Add datastore to available apps 2024-03-01 11:50:42 +01:00
Ali BARIN
2c15e0dd32 Merge pull request #1665 from automatisch/ts-removal-in-web
refactor(web): remove typescript
2024-02-29 11:43:07 +01:00
Ömer Faruk Aydın
007334fef0 Merge pull request #1671 from automatisch/helix-integration
feat: Use new API endpoint from Helix
2024-02-29 11:41:19 +01:00
Ali BARIN
b3ae2d2748 refactor(web): remove typescript 2024-02-29 09:38:32 +00:00
Ömer Faruk Aydın
7149c766d0 Merge pull request #1675 from automatisch/get-app-auth
feat: Implement get app auth API endpoint
2024-02-28 16:25:40 +01:00
Faruk AYDIN
5dca0191d2 feat: Implement get app auth API endpoint 2024-02-28 16:16:13 +01:00
Faruk AYDIN
356668a68d feat: Implement auth serializer 2024-02-28 16:16:13 +01:00
Faruk AYDIN
63c9442126 feat: Add find by auth method to App model 2024-02-28 16:16:13 +01:00
Faruk AYDIN
0031d7911d fix: Adjust description of app serializer test 2024-02-28 16:16:13 +01:00
Faruk AYDIN
31c92b43b4 feat: Add optional system prompt variable to Helix app 2024-02-28 14:18:55 +01:00
Faruk AYDIN
2667548041 feat: Introduce optional session ID for helix app 2024-02-28 13:44:04 +01:00
Faruk AYDIN
54282ba7e0 feat: Use new API endpoint from Helix 2024-02-28 02:23:50 +01:00
Ömer Faruk Aydın
7f324abd44 Merge pull request #1669 from automatisch/helix-attemtps
fix: Add artificial delay to Helix API attempts
2024-02-27 23:49:05 +01:00
Faruk AYDIN
65a0c3b40a fix: Add artificial delay to Helix API attempts 2024-02-27 23:44:52 +01:00
Ömer Faruk Aydın
2449baac5b Merge pull request #1668 from automatisch/document-datastore
docs: Add datastore app to the integration list
2024-02-27 22:10:52 +01:00
Faruk AYDIN
0ab03e1856 docs: Add datastore app to the integration list 2024-02-27 21:44:51 +01:00
Ömer Faruk Aydın
9a3f85106c Merge pull request #1667 from automatisch/fix-helix-integration
fix: Stop asking to helix server after 50 attempts
2024-02-27 19:17:04 +01:00
Faruk AYDIN
42c495d8ab fix: Stop asking to helix server after 50 attempts 2024-02-27 19:14:19 +01:00
Ömer Faruk Aydın
58def585f1 Merge pull request #1666 from automatisch/datastore-app
feat: Implement datastore built-in app
2024-02-27 19:13:26 +01:00
Faruk AYDIN
047034d831 fix: Remove min length validation from value of datastore 2024-02-27 19:05:27 +01:00
Faruk AYDIN
bdb2f24a81 feat: Implement datastore built-in app 2024-02-27 19:01:46 +01:00
Ömer Faruk Aydın
636870a075 Merge pull request #1661 from automatisch/get-app
feat: Introduce app serializer
2024-02-26 22:32:06 +01:00
Faruk AYDIN
8981174302 feat: Introduce app serializer 2024-02-26 22:25:03 +01:00
Faruk AYDIN
dd5f05334b feat: Allow renderer to use explicitly defined serializers 2024-02-26 22:17:21 +01:00
Ömer Faruk Aydın
929b626b51 Merge pull request #1660 from automatisch/rest-get-app
feat: Implement get app API endpoint
2024-02-26 21:44:23 +01:00
Faruk AYDIN
7d5b2ec81e feat: Implement get app API endpoint 2024-02-26 17:59:48 +01:00
Ömer Faruk Aydın
f0e2d36c34 Merge pull request #1657 from automatisch/timestamp-serializer
feat: Use timestamp for serializer date objects
2024-02-26 14:36:34 +01:00
Faruk AYDIN
94f171d757 feat: Use timestamp for serializer date objects 2024-02-26 14:11:56 +01:00
Ömer Faruk Aydın
04e06db430 Merge pull request #1656 from automatisch/api-controller-tests
test: Cover not found responses for API endpoint tests
2024-02-26 13:36:48 +01:00
Faruk AYDIN
d74b215169 test: Cover bad request responses for API endpoint tests 2024-02-26 13:30:30 +01:00
Faruk AYDIN
404ea94dd2 test: Cover not found responses for API endpoint tests 2024-02-26 01:40:20 +01:00
Faruk AYDIN
4afe7c6b46 feat: Handle bad request for invalid UUID 2024-02-26 01:26:04 +01:00
Ömer Faruk Aydın
60b20c4d01 Merge pull request #1655 from automatisch/add-async-handler
feat: Implement async handler for routes
2024-02-26 01:25:35 +01:00
Faruk AYDIN
58658c6b1a feat: Do not expose unknown error message to client 2024-02-26 01:07:31 +01:00
Faruk AYDIN
ec444317b3 feat: Catch not found error message for objection 2024-02-26 01:06:54 +01:00
Faruk AYDIN
8b4aee1afa feat: Implement async handler for routes 2024-02-26 01:03:15 +01:00
Ömer Faruk Aydın
51abd74304 Merge pull request #1654 from automatisch/get-flow
feat: Implement get flow API endpoint
2024-02-26 01:02:38 +01:00
Faruk AYDIN
b93b465f09 feat: Implement get flow API endpoint 2024-02-26 00:52:02 +01:00
Faruk AYDIN
5aad68ec62 test: Use nested serializers explicitly for serializer tests 2024-02-25 23:34:41 +01:00
Faruk AYDIN
74fbc937a1 feat: Introduce flow serializer 2024-02-25 23:31:22 +01:00
Faruk AYDIN
7e35f544eb feat: Introduce step serializer 2024-02-25 23:01:55 +01:00
Ömer Faruk Aydın
ed1c3cffc1 Merge pull request #1653 from automatisch/rest-automatisch-license
faet: Implement automatisch license API endpoint
2024-02-25 18:36:42 +01:00
Ömer Faruk Aydın
c4983a9f9b Merge pull request #1652 from automatisch/rest-automatisch-info
feat: Implement automatisch info API endpoint
2024-02-25 18:36:27 +01:00
Ömer Faruk Aydın
5b43262e7a Merge pull request #1651 from automatisch/remove-role-join
chore: No need to join role since we don't expose roleId anymore
2024-02-25 18:36:10 +01:00
Ömer Faruk Aydın
dad4408679 Merge pull request #1650 from automatisch/rest-get-invoices
feat: Implement get invoices API endpoint
2024-02-25 18:35:52 +01:00
Ömer Faruk Aydın
a78c4d12b4 Merge pull request #1607 from automatisch/AUT-681
feat: implement app-auth-client endpoint
2024-02-25 18:35:33 +01:00
Ömer Faruk Aydın
74664a9df8 Merge pull request #1649 from automatisch/move-get-user
feat: Move get user API endpoint to admin namespace
2024-02-25 18:34:48 +01:00
Ömer Faruk Aydın
fce5281a03 Merge pull request #1648 from automatisch/move-get-users
feat: Move get users API endpoint to admin namespace
2024-02-25 18:32:24 +01:00
Faruk AYDIN
de0bd2f486 faet: Implement automatisch license API endpoint 2024-02-25 03:28:20 +01:00
Faruk AYDIN
079fb5d108 feat: Implement automatisch info API endpoint 2024-02-25 03:27:17 +01:00
Faruk AYDIN
1c7435a32b chore: No need to join role since we don't expose roleId anymore 2024-02-25 02:02:02 +01:00
Faruk AYDIN
1afd374cf6 feat: Implement get invoices API endpoint 2024-02-25 01:31:36 +01:00
Faruk AYDIN
3adf549915 feat: Extract get invoices logic to user model 2024-02-25 01:30:29 +01:00
Faruk AYDIN
e94d669eca fix: Cover empty array case for renderer helper 2024-02-25 01:29:59 +01:00
Faruk AYDIN
5fac0b4689 test: Add tests for app auth client serializer 2024-02-24 02:51:34 +01:00
Faruk AYDIN
832d323a6e refactor: Remove redundant query string from get app auth client tests 2024-02-24 01:25:46 +01:00
Faruk AYDIN
03f1dbd5b2 feat: Add check enterprise middleware to get app auth clients 2024-02-24 01:24:41 +01:00
Faruk AYDIN
c0a216f109 refactor: Remove license check for admin, since it is middleware responsibility 2024-02-24 01:22:27 +01:00
Faruk AYDIN
ad67b13270 fix: Add missing middleware imports for admin app auth clients 2024-02-24 01:18:30 +01:00
Faruk AYDIN
5d420c08c6 fix: Remove forgotten character in the routes 2024-02-24 01:14:56 +01:00
Faruk AYDIN
3d8235c670 refactor: Use kebab-case for app auth client serializer filename 2024-02-24 01:10:59 +01:00
Faruk AYDIN
5a209f81d1 feat: Add missing middleware checks to admin app auth clients 2024-02-24 01:08:08 +01:00
Rıdvan Akca
d17d8e2805 feat: implement app-auth-client endpoint 2024-02-24 01:02:28 +01:00
Faruk AYDIN
ca7636e7bc feat: Move get user API endpoint to admin namespace 2024-02-24 00:40:54 +01:00
Faruk AYDIN
532cfc10d0 feat: Move get users API endpoint to admin namespace 2024-02-24 00:31:15 +01:00
Ömer Faruk Aydın
72d68c4377 Merge pull request #1647 from automatisch/error-logger-for-queues
feat: Add logger for errors happened in queues
2024-02-23 23:57:00 +01:00
Faruk AYDIN
00f5964aa4 feat: Add logger for errors happened in queues 2024-02-23 23:50:50 +01:00
Ali BARIN
bd1ad5fa56 feat(http-request/custom-request): utilize accept header for parsing response 2024-02-23 18:03:56 +00:00
Ali BARIN
f2e22e7445 feat: keep axios defaults for instances 2024-02-23 18:02:33 +00:00
Ömer Faruk Aydın
fcf345abab Merge pull request #1642 from automatisch/delete-step
fix: Allow permitted users to delete others steps
2024-02-23 14:15:29 +01:00
Faruk AYDIN
24ad43d3e4 fix: Allow permitted users to delete others steps 2024-02-23 13:45:50 +01:00
Ömer Faruk Aydın
9a7cdf42e1 Merge pull request #1641 from automatisch/remove-role-id-from-user-serializer
chore: Remove redundant roleId from user serializer
2024-02-23 11:28:20 +01:00
Ömer Faruk Aydın
c36b652d5b Merge pull request #1640 from automatisch/rest-get-notifications
feat: Implement get notifications API endpoint
2024-02-23 11:28:11 +01:00
Ömer Faruk Aydın
553070fc23 Merge pull request #1638 from automatisch/rest-get-payment-paddle-info
feat: Implement get paddle info API endpoint
2024-02-23 11:27:50 +01:00
Ömer Faruk Aydın
5d69f7e24f Merge pull request #1637 from automatisch/rest-get-payment-plans
feat: Implement get payment plans API endpoint
2024-02-23 11:27:36 +01:00
Ömer Faruk Aydın
bc0e2bada0 Merge pull request #1635 from automatisch/rest-get-role
feat: Implement get role API endpoint for admin
2024-02-23 11:27:22 +01:00
Ömer Faruk Aydın
80b6cc1d94 Merge pull request #1636 from automatisch/rest-get-permissions-catalog
feat: Implement permission catalog API endpoint
2024-02-23 11:20:34 +01:00
Ömer Faruk Aydın
bce3273e64 Merge pull request #1634 from automatisch/rest-get-roles
feat: Implement admin get roles API endpoint
2024-02-23 11:20:25 +01:00
Faruk AYDIN
3abf61152a chore: Remove redundant roleId from user serializer 2024-02-23 01:30:57 +01:00
Faruk AYDIN
14923d4cd6 feat: Implement get notifications API endpoint 2024-02-23 01:24:56 +01:00
Faruk AYDIN
6fdc4bf900 feat: Implement get paddle info API endpoint 2024-02-22 20:22:05 +01:00
Faruk AYDIN
d21e1f75b5 feat: Implement get payment plans API endpoint 2024-02-21 18:15:32 +01:00
Faruk AYDIN
84a0b37fcc feat: Implement permission catalog API endpoint 2024-02-21 17:52:51 +01:00
Faruk AYDIN
f135a0f09e feat: Implement get role API endpoint for admin 2024-02-21 17:39:05 +01:00
Faruk AYDIN
0f24c99456 feat: Add permissions to role serializer 2024-02-21 16:01:45 +01:00
Faruk AYDIN
9eae0ab947 fix: Move get saml auth provider mocks to correct namespace 2024-02-21 15:37:39 +01:00
Faruk AYDIN
3bf1f79c79 feat: Implement admin get roles API endpoint 2024-02-21 15:35:30 +01:00
Faruk AYDIN
b21074c871 fix: Move saml auth provider router to correct folder 2024-02-21 14:59:42 +01:00
Ömer Faruk Aydın
d7893d9a32 Merge pull request #1621 from automatisch/show-saml-auth-provider
feat: Implement API endpoint to show saml auth provider
2024-02-20 13:00:25 +01:00
Ömer Faruk Aydın
9cbdda330c Merge pull request #1620 from automatisch/fix-authorization-middleware
fix: Include http methods for route rules
2024-02-20 12:59:12 +01:00
Ömer Faruk Aydın
42a9bfd099 Merge pull request #1619 from automatisch/get-saml-auth-providers
feat: Implement get saml auth providers API endpoint
2024-02-20 12:59:03 +01:00
Faruk AYDIN
eb15bd01ca feat: Implement API endpoint to show saml auth provider 2024-02-19 23:41:37 +01:00
Faruk AYDIN
9e98aebeb3 fix: Include http methods for route rules 2024-02-19 22:22:04 +01:00
Faruk AYDIN
1361cbc826 chore: Remove get saml auth providers from authorization list 2024-02-19 22:19:37 +01:00
Faruk AYDIN
679d0808a9 refactor: Move saml auth providers endpoint to admin namespace 2024-02-19 22:18:15 +01:00
Faruk AYDIN
6fe9a548ad feat: Implement get saml auth providers API endpoint 2024-02-19 21:48:06 +01:00
Faruk AYDIN
2d6d2430d2 fix: Detect types also for not paginated arrays 2024-02-19 21:46:20 +01:00
Faruk AYDIN
a445538e81 feat: Implement isCheckEnterprise middleware 2024-02-19 21:22:36 +01:00
Faruk AYDIN
50d38ffbd8 chore: Make http log level lower than info 2024-02-19 21:14:54 +01:00
Faruk AYDIN
93bcdfd9c9 feat: Implement saml auth provider serializer 2024-02-19 17:59:18 +01:00
Faruk AYDIN
5be3b101a5 feat: Implement saml auth provider factory 2024-02-19 17:58:52 +01:00
Ömer Faruk Aydın
024c7476c7 Merge pull request #1616 from automatisch/node-18-in-devcontainer
refactor: use node 18 in devcontainer
2024-02-19 11:51:59 +01:00
Ali BARIN
30a7ffe93d refactor: use node 18 in devcontainer 2024-02-19 10:17:16 +00:00
kattoczko
e2d803ebf7 feat: do not let users access notifications page when it's turned off (#1583) 2024-02-16 16:15:01 +01:00
kattoczko
be7e67c940 feat: introduce 404 page (#1600) 2024-02-16 15:54:35 +01:00
kattoczko
ead4b13ba5 feat: Show /login directly on / without valid authentication (#1528) 2024-02-16 15:15:25 +01:00
Ömer Faruk Aydın
e02c42ee18 Merge pull request #1605 from automatisch/test-permission-serializer
test: Add tests for permission serializer
2024-02-16 12:41:09 +01:00
Ömer Faruk Aydın
d39886fdf8 Merge pull request #1604 from automatisch/test-role-serializer
test: Add tests for role serializer
2024-02-16 12:40:59 +01:00
Ömer Faruk Aydın
11a425f1de Merge pull request #1603 from automatisch/test-user-serializer
test: Add tests for user serializer
2024-02-16 12:40:48 +01:00
Ömer Faruk Aydın
f0e194e584 Merge pull request #1606 from automatisch/remove-redundant
chore: Remove redundant npm libraries
2024-02-16 12:37:34 +01:00
Faruk AYDIN
d4b9331cf2 chore: Remove redundant npm libraries 2024-02-16 01:01:50 +01:00
Faruk AYDIN
37e1acc5f1 test: Add tests for permission serializer 2024-02-16 00:19:53 +01:00
Faruk AYDIN
ffaf6a577d test: Add tests for role serializer 2024-02-16 00:18:53 +01:00
Faruk AYDIN
afdaf6ba39 test: Add tests for user serializer 2024-02-16 00:10:37 +01:00
Ömer Faruk Aydın
4c49367910 Merge pull request #1602 from automatisch/introduce-serializers
feat: Introduce serializers
2024-02-15 12:46:20 +01:00
Ömer Faruk Aydın
a506c4411d Merge pull request #1601 from automatisch/rest-get-trial
feat: Implement API endpoint for user trial info
2024-02-15 12:45:54 +01:00
Faruk AYDIN
1859c9854e chore: Add permission serializer to serializers 2024-02-15 02:21:26 +01:00
Faruk AYDIN
6ff29b9ae6 refactor: Use serializer for user model instead of formatJson 2024-02-15 02:19:24 +01:00
Faruk AYDIN
3578f6b849 feat: Extend renderer to use serializers 2024-02-15 02:15:44 +01:00
Faruk AYDIN
0347864fde feat: Introduce serializers 2024-02-15 02:15:19 +01:00
Faruk AYDIN
5f9786a2c7 chore: Adjust get user trial file to have .ee extension 2024-02-14 15:55:02 +01:00
Faruk AYDIN
75aeff1898 test: Cover removed user token for authentication tests 2024-02-14 15:48:49 +01:00
Faruk AYDIN
0afcdce6d3 refactor: Do not expose subscription info for get user trial 2024-02-14 14:23:54 +01:00
Faruk AYDIN
a591d0ea87 test: Add tests for get user trial action 2024-02-14 14:18:42 +01:00
Faruk AYDIN
0e111a3532 feat: Implement API endpoint for user trial info 2024-02-14 14:18:28 +01:00
Faruk AYDIN
b599466ffa feat: Add checkIsCloud middleware for routes 2024-02-14 13:06:58 +01:00
Faruk AYDIN
69727e78df fix: Throw not found error for authentication 2024-02-14 13:06:29 +01:00
Ömer Faruk Aydın
02ae67b147 Merge pull request #1597 from automatisch/rest-api-get-users
feat: Implement api/v1/users API endpoint
2024-02-14 11:38:09 +01:00
Faruk AYDIN
a769f78801 test: Add tests for api/v1/users API endpoint 2024-02-14 01:20:29 +01:00
Faruk AYDIN
d583e42428 refactor: Structure api mock data with folders 2024-02-14 01:02:42 +01:00
Faruk AYDIN
da732becb6 feat: Implement api/v1/users API endpoint 2024-02-14 00:52:17 +01:00
Faruk AYDIN
b89a4d58d9 feat: Add pagination for REST endpoints 2024-02-14 00:51:48 +01:00
Faruk AYDIN
09854147d1 feat: Extend renderer functionality to work with pagination 2024-02-14 00:51:16 +01:00
Ömer Faruk Aydın
3648c2bfe3 Merge pull request #1592 from automatisch/rest-api-get-user
feat: Implement api/v1/users/:userId API endpoint
2024-02-13 12:14:37 +01:00
Ömer Faruk Aydın
3f3ee032f6 Merge pull request #1591 from automatisch/rest-api-get-current-user
feat: Implement users/me API endpoint
2024-02-13 11:34:37 +01:00
Ömer Faruk Aydın
68e5d54331 Merge pull request #1590 from automatisch/rest-api-automatisch-version
feat: Implement automatisch version API endpoint
2024-02-13 10:42:44 +01:00
Faruk AYDIN
824c434b0b feat: Implement api/v1/users/:userId API endpoint 2024-02-13 03:44:44 +01:00
Faruk AYDIN
9f0e0ca656 feat: Implement users/me API endpoint 2024-02-13 02:06:24 +01:00
Faruk AYDIN
95f89ba03e refactor: Use objectionjs instead of knex for factories 2024-02-13 01:49:40 +01:00
Faruk AYDIN
697f72ecf4 refactor: Use api/v1 namespace for routes 2024-02-12 23:30:38 +01:00
Faruk AYDIN
4f03f2ab51 feat: Introduce renderer helper 2024-02-12 23:25:09 +01:00
Faruk AYDIN
c81531cb7a feat: Implement automatisch version API endpoint 2024-02-12 22:59:44 +01:00
Ömer Faruk Aydın
7b6e4aa153 Merge pull request #1589 from automatisch/healthcheck-api-endpoint
feat: Implement healthcheck api endpoint
2024-02-12 22:57:58 +01:00
Faruk AYDIN
f21039d19d feat: Implement healthcheck api endpoint 2024-02-12 22:50:57 +01:00
morihoos
8c936a91be fix(csp): remove illegal characters in directive names (#1585) 2024-02-08 17:41:33 +01:00
Ali BARIN
24451892ff feat: add custom additional drawer link (#1586) 2024-02-08 16:33:12 +01:00
morihoos
6bba2c82fe feat(config): add ability to override apiUrl in environment variables (#1581) 2024-02-07 16:17:03 +01:00
Ali BARIN
3320dc6bc4 Merge pull request #1582 from automatisch/toggle-favicon-and-notifications-page
feat: put favicon and notifications page behind feature flags
2024-02-07 14:46:59 +01:00
Ali BARIN
9d42fd9293 test(queries/get-config): incorporate feature flags
cover disableNotificationsPage and disableFavicon feature flags
2024-02-07 13:11:57 +00:00
Ali BARIN
e6b806616f feat: add DISABLE_FAVICON feature flag 2024-02-07 11:51:17 +00:00
Ali BARIN
6ec5872391 feat: add DISABLE_NOTIFICATIONS_PAGE feature flag 2024-02-07 11:47:44 +00:00
Ali BARIN
a26cf932a1 chore(devcontainer): upgrade node to 20 2024-02-07 11:46:12 +00:00
Ali BARIN
38a3e3ab9f Merge pull request #1570 from automatisch/prevent-public-registrations
fix: prevent registration on non-cloud
2024-01-30 14:11:05 +01:00
Ali BARIN
32b17c1418 fix: prevent registration on non-cloud 2024-01-30 13:03:52 +00:00
Ömer Faruk Aydın
44aa6a1579 Merge pull request #1569 from automatisch/compile-email
fix: Adjust dirname for compile email helper
2024-01-29 13:05:58 +01:00
Faruk AYDIN
2369aacd2a fix: Adjust dirname for compile email helper 2024-01-29 12:48:21 +01:00
Ömer Faruk Aydın
7dafc6364b Merge pull request #1552 from automatisch/dependabot/npm_and_yarn/vite-3.2.8
chore(deps): Bump vite from 3.2.7 to 3.2.8
2024-01-29 12:32:10 +01:00
Ömer Faruk Aydın
3d25fa0aeb Merge branch 'main' into dependabot/npm_and_yarn/vite-3.2.8 2024-01-29 11:14:49 +01:00
Ali BARIN
0297b0f296 Merge pull request #1559 from automatisch/base64-to-text
feat(formatter): add base64 to string action
2024-01-26 10:56:54 +01:00
Rıdvan Akca
4c7d09c3d8 feat(formatter): add base64 to string action 2024-01-26 12:41:05 +03:00
Ali BARIN
48a74826e8 Merge pull request #1557 from automatisch/text-to-base64
feat(formatter): add string to base64 action
2024-01-25 16:56:15 +01:00
Rıdvan Akca
ef34068ac4 feat(formatter): add string to base64 action 2024-01-25 18:52:44 +03:00
dependabot[bot]
3987a8db77 chore(deps): Bump vite from 3.2.7 to 3.2.8
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 3.2.7 to 3.2.8.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v3.2.8/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v3.2.8/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-01-19 22:40:35 +00:00
856 changed files with 14168 additions and 15751 deletions

View File

@@ -28,7 +28,7 @@ cd packages/web
rm -rf .env
echo "
PORT=$WEB_PORT
REACT_APP_GRAPHQL_URL=http://localhost:$BACKEND_PORT/graphql
REACT_APP_BACKEND_URL=http://localhost:$BACKEND_PORT
" >> .env
cd $CURRENT_DIR

View File

@@ -8,7 +8,7 @@
"version": "latest"
},
"ghcr.io/devcontainers/features/node:1": {
"version": 16
"version": 18
},
"ghcr.io/devcontainers/features/common-utils:1": {
"username": "vscode",

View File

@@ -4,5 +4,9 @@
**/.devcontainer
**/.github
**/.vscode
**/.env
**/.env.test
**/.env.production
**/yarn-error.log
packages/docs
packages/e2e-test

View File

@@ -1,18 +0,0 @@
module.exports = {
root: true,
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
],
overrides: [
{
files: ['**/*.test.ts', '**/test/**/*.ts'],
rules: {
'@typescript-eslint/ban-ts-comment': ['off'],
},
},
],
};

View File

@@ -22,7 +22,7 @@ jobs:
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- run: yarn --frozen-lockfile
- run: yarn lint
- run: cd packages/backend && yarn lint
- run: echo "🍏 This job's status is ${{ job.status }}."
start-backend-server:
runs-on: ubuntu-latest

32
.github/workflows/docs-change.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: Automatisch Docs Change
on:
pull_request:
paths:
- 'packages/docs/**'
jobs:
label:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Label PR
uses: actions/github-script@v6
with:
script: |
const { pull_request } = context.payload;
const label = 'documentation-change';
const hasLabel = pull_request.labels.some(({ name }) => name === label);
if (!hasLabel) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pull_request.number,
labels: [label],
});
console.log(`Label "${label}" added to PR #${pull_request.number}`);
} else {
console.log(`Label "${label}" already exists on PR #${pull_request.number}`);
}

View File

@@ -62,8 +62,9 @@ jobs:
run: yarn && yarn lerna bootstrap
- name: Install Playwright Browsers
run: yarn playwright install --with-deps
- name: Build Automatisch
run: yarn lerna run --scope=@*/{web,cli} build
- name: Build Automatisch web
working-directory: ./packages/web
run: yarn build
env:
# Keep this until we clean up warnings in build processes
CI: false

View File

@@ -1,14 +1,25 @@
# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /automatisch
ENV PORT 3000
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base git
WORKDIR /automatisch
# copy the app, note .dockerignore
COPY . /automatisch
RUN yarn
RUN cd packages/web && yarn build
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base && \
yarn global add @automatisch/cli@0.10.0 --network-timeout 1000000 && \
rm -rf /usr/local/share/.cache/ && \
apk del build-dependencies
COPY ./entrypoint.sh /entrypoint.sh
COPY ./docker/entrypoint.sh /entrypoint.sh
EXPOSE 3000
ENTRYPOINT ["sh", "/entrypoint.sh"]

View File

@@ -2,8 +2,12 @@
set -e
cd packages/backend
if [ -n "$WORKER" ]; then
automatisch start-worker
yarn start:worker
else
automatisch start
yarn db:migrate
yarn db:seed:user
yarn start
fi

View File

@@ -6,7 +6,6 @@
"start": "lerna run --stream --parallel --scope=@*/{web,backend} dev",
"start:web": "lerna run --stream --scope=@*/web dev",
"start:backend": "lerna run --stream --scope=@*/backend dev",
"lint": "lerna run --no-bail --stream --parallel --scope=@*/{web,backend} lint",
"build:docs": "cd ./packages/docs && yarn install && yarn build"
},
"workspaces": {
@@ -21,8 +20,6 @@
]
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.9.1",
"@typescript-eslint/parser": "^5.9.1",
"eslint": "^8.13.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-prettier": "^4.0.0",

View File

@@ -11,7 +11,7 @@
"start:worker": "node src/worker.js",
"pretest": "APP_ENV=test node ./test/setup/prepare-test-env.js",
"test": "APP_ENV=test vitest run",
"lint": "eslint . --ignore-path ../../.eslintignore",
"lint": "eslint .",
"db:create": "node ./bin/database/create.js",
"db:seed:user": "node ./bin/database/seed-user.js",
"db:drop": "node ./bin/database/drop.js",
@@ -31,21 +31,20 @@
"accounting": "^0.4.1",
"ajv-formats": "^2.1.1",
"axios": "1.6.0",
"bcrypt": "^5.0.1",
"bcrypt": "^5.1.0",
"bullmq": "^3.0.0",
"copyfiles": "^2.4.1",
"cors": "^2.8.5",
"crypto-js": "^4.1.1",
"debug": "~2.6.9",
"dotenv": "^10.0.0",
"express": "~4.18.2",
"express-async-handler": "^1.2.0",
"express-basic-auth": "^1.2.1",
"express-graphql": "^0.12.0",
"fast-xml-parser": "^4.0.11",
"graphql-middleware": "^6.1.15",
"graphql-shield": "^7.5.0",
"graphql-tools": "^8.2.0",
"graphql-type-json": "^0.3.2",
"handlebars": "^4.7.7",
"http-errors": "~1.6.3",
"http-proxy-agent": "^7.0.0",
@@ -68,7 +67,6 @@
"pluralize": "^8.0.0",
"raw-body": "^2.5.2",
"showdown": "^2.1.0",
"stripe": "^11.13.0",
"winston": "^3.7.1",
"xmlrpc": "^1.3.2"
},
@@ -97,6 +95,7 @@
"url": "https://github.com/automatisch/automatisch/issues"
},
"devDependencies": {
"node-gyp": "^10.1.0",
"nodemon": "^2.0.13",
"supertest": "^6.3.3",
"vitest": "^1.1.3"

View File

@@ -11,7 +11,7 @@ export default defineApp({
'https://azure.microsoft.com/en-us/products/ai-services/openai-service',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/azure-openai/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/azure-openai/connection',
authDocUrl: '{DOCS_URL}/apps/azure-openai/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Carbone',
key: 'carbone',
iconUrl: '{BASE_URL}/apps/carbone/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/carbone/connection',
authDocUrl: '{DOCS_URL}/apps/carbone/connection',
supportsConnections: true,
baseUrl: 'https://carbone.io',
apiBaseUrl: 'https://api.carbone.io',

View File

@@ -0,0 +1,27 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Get value',
key: 'getValue',
description: 'Get value from the persistent datastore.',
arguments: [
{
label: 'Key',
key: 'key',
type: 'string',
required: true,
description: 'The key of your value to get.',
variables: true,
},
],
async run($) {
const keyValuePair = await $.datastore.get({
key: $.step.parameters.key,
});
$.setActionItem({
raw: keyValuePair,
});
},
});

View File

@@ -0,0 +1,4 @@
import getValue from './get-value/index.js';
import setValue from './set-value/index.js';
export default [getValue, setValue];

View File

@@ -0,0 +1,36 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Set value',
key: 'setValue',
description: 'Set value to the persistent datastore.',
arguments: [
{
label: 'Key',
key: 'key',
type: 'string',
required: true,
description: 'The key of your value to set.',
variables: true,
},
{
label: 'Value',
key: 'value',
type: 'string',
required: true,
description: 'The value to set.',
variables: true,
},
],
async run($) {
const keyValuePair = await $.datastore.set({
key: $.step.parameters.key,
value: $.step.parameters.value,
});
$.setActionItem({
raw: keyValuePair,
});
},
});

View File

@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" id="icon">
<defs>
<style>.cls-1{fill:none;}</style>
</defs>
<title>datastore</title>
<circle cx="23" cy="23" r="1"/>
<rect x="8" y="22" width="12" height="2"/>
<circle cx="23" cy="9" r="1"/>
<rect x="8" y="8" width="12" height="2"/>
<path d="M26,14a2,2,0,0,0,2-2V6a2,2,0,0,0-2-2H6A2,2,0,0,0,4,6v6a2,2,0,0,0,2,2H8v4H6a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V20a2,2,0,0,0-2-2H24V14ZM6,6H26v6H6ZM26,26H6V20H26Zm-4-8H10V14H22Z"/>
<rect id="_Transparent_Rectangle_" data-name="&lt;Transparent Rectangle&gt;" class="cls-1" width="32" height="32"/>
</svg>

After

Width:  |  Height:  |  Size: 704 B

View File

@@ -0,0 +1,14 @@
import defineApp from '../../helpers/define-app.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Datastore',
key: 'datastore',
iconUrl: '{BASE_URL}/apps/datastore/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/datastore/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',
primaryColor: '001F52',
actions,
});

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'DeepL',
key: 'deepl',
iconUrl: '{BASE_URL}/apps/deepl/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/deepl/connection',
authDocUrl: '{DOCS_URL}/apps/deepl/connection',
supportsConnections: true,
baseUrl: 'https://deepl.com',
apiBaseUrl: 'https://api.deepl.com',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'Delay',
key: 'delay',
iconUrl: '{BASE_URL}/apps/delay/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/delay/connection',
authDocUrl: '{DOCS_URL}/apps/delay/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
name: 'Discord',
key: 'discord',
iconUrl: '{BASE_URL}/apps/discord/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/discord/connection',
authDocUrl: '{DOCS_URL}/apps/discord/connection',
supportsConnections: true,
baseUrl: 'https://discord.com',
apiBaseUrl: 'https://discord.com/api',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Dropbox',
key: 'dropbox',
iconUrl: '{BASE_URL}/apps/dropbox/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/dropbox/connection',
authDocUrl: '{DOCS_URL}/apps/dropbox/connection',
supportsConnections: true,
baseUrl: 'https://dropbox.com',
apiBaseUrl: 'https://api.dropboxapi.com',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'Filter',
key: 'filter',
iconUrl: '{BASE_URL}/apps/filter/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/filter/connection',
authDocUrl: '{DOCS_URL}/apps/filter/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Flickr',
key: 'flickr',
iconUrl: '{BASE_URL}/apps/flickr/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/flickr/connection',
authDocUrl: '{DOCS_URL}/apps/flickr/connection',
docUrl: 'https://automatisch.io/docs/flickr',
primaryColor: '000000',
supportsConnections: true,

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Flowers Software',
key: 'flowers-software',
iconUrl: '{BASE_URL}/apps/flowers-software/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/flowers-software/connection',
authDocUrl: '{DOCS_URL}/apps/flowers-software/connection',
supportsConnections: true,
baseUrl: 'https://flowers-software.com',
apiBaseUrl: 'https://webapp.flowers-software.com/api',

View File

@@ -1,5 +1,6 @@
import defineAction from '../../../../helpers/define-action.js';
import base64ToString from './transformers/base64-to-string.js';
import capitalize from './transformers/capitalize.js';
import extractEmailAddress from './transformers/extract-email-address.js';
import extractNumber from './transformers/extract-number.js';
@@ -8,10 +9,12 @@ import lowercase from './transformers/lowercase.js';
import markdownToHtml from './transformers/markdown-to-html.js';
import pluralize from './transformers/pluralize.js';
import replace from './transformers/replace.js';
import stringToBase64 from './transformers/string-to-base64.js';
import trimWhitespace from './transformers/trim-whitespace.js';
import useDefaultValue from './transformers/use-default-value.js';
const transformers = {
base64ToString,
capitalize,
extractEmailAddress,
extractNumber,
@@ -20,6 +23,7 @@ const transformers = {
markdownToHtml,
pluralize,
replace,
stringToBase64,
trimWhitespace,
useDefaultValue,
};
@@ -37,6 +41,7 @@ export default defineAction({
required: true,
variables: true,
options: [
{ label: 'Base64 to String', value: 'base64ToString' },
{ label: 'Capitalize', value: 'capitalize' },
{ label: 'Convert HTML to Markdown', value: 'htmlToMarkdown' },
{ label: 'Convert Markdown to HTML', value: 'markdownToHtml' },
@@ -45,6 +50,7 @@ export default defineAction({
{ label: 'Lowercase', value: 'lowercase' },
{ label: 'Pluralize', value: 'pluralize' },
{ label: 'Replace', value: 'replace' },
{ label: 'String to Base64', value: 'stringToBase64' },
{ label: 'Trim Whitespace', value: 'trimWhitespace' },
{ label: 'Use Default Value', value: 'useDefaultValue' },
],

View File

@@ -0,0 +1,8 @@
const base64ToString = ($) => {
const input = $.step.parameters.input;
const decodedString = Buffer.from(input, 'base64').toString('utf8');
return decodedString;
};
export default base64ToString;

View File

@@ -0,0 +1,8 @@
const stringtoBase64 = ($) => {
const input = $.step.parameters.input;
const base64String = Buffer.from(input).toString('base64');
return base64String;
};
export default stringtoBase64;

View File

@@ -1,3 +1,4 @@
import base64ToString from './text/base64-to-string.js';
import capitalize from './text/capitalize.js';
import extractEmailAddress from './text/extract-email-address.js';
import extractNumber from './text/extract-number.js';
@@ -6,6 +7,7 @@ import lowercase from './text/lowercase.js';
import markdownToHtml from './text/markdown-to-html.js';
import pluralize from './text/pluralize.js';
import replace from './text/replace.js';
import stringToBase64 from './text/string-to-base64.js';
import trimWhitespace from './text/trim-whitespace.js';
import useDefaultValue from './text/use-default-value.js';
import performMathOperation from './numbers/perform-math-operation.js';
@@ -15,6 +17,7 @@ import formatPhoneNumber from './numbers/format-phone-number.js';
import formatDateTime from './date-time/format-date-time.js';
const options = {
base64ToString,
capitalize,
extractEmailAddress,
extractNumber,
@@ -23,6 +26,7 @@ const options = {
markdownToHtml,
pluralize,
replace,
stringToBase64,
trimWhitespace,
useDefaultValue,
performMathOperation,

View File

@@ -0,0 +1,12 @@
const base64ToString = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'Text that will be converted from Base64 to string.',
variables: true,
},
];
export default base64ToString;

View File

@@ -0,0 +1,12 @@
const stringToBase64 = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'Text that will be converted to Base64.',
variables: true,
},
];
export default stringToBase64;

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'Formatter',
key: 'formatter',
iconUrl: '{BASE_URL}/apps/formatter/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/formatter/connection',
authDocUrl: '{DOCS_URL}/apps/formatter/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://ghost.org',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/ghost/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/ghost/connection',
authDocUrl: '{DOCS_URL}/apps/ghost/connection',
primaryColor: '15171A',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: 'https://github.com',
apiBaseUrl: 'https://api.github.com',
iconUrl: '{BASE_URL}/apps/github/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/github/connection',
authDocUrl: '{DOCS_URL}/apps/github/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: 'https://gitlab.com',
apiBaseUrl: 'https://gitlab.com',
iconUrl: '{BASE_URL}/apps/gitlab/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/gitlab/connection',
authDocUrl: '{DOCS_URL}/apps/gitlab/connection',
primaryColor: 'FC6D26',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://calendar.google.com',
apiBaseUrl: 'https://www.googleapis.com/calendar',
iconUrl: '{BASE_URL}/apps/google-calendar/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/google-calendar/connection',
authDocUrl: '{DOCS_URL}/apps/google-calendar/connection',
primaryColor: '448AFF',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://drive.google.com',
apiBaseUrl: 'https://www.googleapis.com/drive',
iconUrl: '{BASE_URL}/apps/google-drive/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/google-drive/connection',
authDocUrl: '{DOCS_URL}/apps/google-drive/connection',
primaryColor: '1FA463',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://docs.google.com/forms',
apiBaseUrl: 'https://forms.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-forms/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/google-forms/connection',
authDocUrl: '{DOCS_URL}/apps/google-forms/connection',
primaryColor: '673AB7',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: 'https://docs.google.com/spreadsheets',
apiBaseUrl: 'https://sheets.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-sheets/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/google-sheets/connection',
authDocUrl: '{DOCS_URL}/apps/google-sheets/connection',
primaryColor: '0F9D58',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -1,4 +1,3 @@
import FormData from 'form-data';
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
@@ -6,45 +5,51 @@ export default defineAction({
key: 'newChat',
description: 'Create a new chat session for Helix AI.',
arguments: [
{
label: 'Session ID',
key: 'sessionId',
type: 'string',
required: false,
description:
'ID of the chat session to continue. Leave empty to start a new chat.',
variables: true,
},
{
label: 'System Prompt',
key: 'systemPrompt',
type: 'string',
required: false,
description:
'Optional system prompt to start the chat with. It will be used only for new chat sessions.',
variables: true,
},
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'Prompt to start the chat with.',
description: 'User input to start the chat with.',
variables: true,
},
],
async run($) {
const formData = new FormData();
formData.append('input', $.step.parameters.input);
formData.append('mode', 'inference');
formData.append('type', 'text');
const sessionResponse = await $.http.post('/api/v1/sessions', formData, {
headers: {
...formData.getHeaders(),
},
const response = await $.http.post('/api/v1/sessions/chat', {
session_id: $.step.parameters.sessionId,
system: $.step.parameters.systemPrompt,
messages: [
{
role: 'user',
content: {
content_type: 'text',
parts: [$.step.parameters.input],
},
},
],
});
const sessionId = sessionResponse.data.id;
let chatGenerated = false;
while (!chatGenerated) {
const response = await $.http.get(`/api/v1/sessions/${sessionId}`);
const message =
response.data.interactions[response.data.interactions.length - 1];
if (message.creator === 'system' && message.state === 'complete') {
$.setActionItem({
raw: message,
});
chatGenerated = true;
}
}
$.setActionItem({
raw: response.data,
});
},
});

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://tryhelix.ai',
apiBaseUrl: 'https://app.tryhelix.ai',
iconUrl: '{BASE_URL}/apps/helix/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/helix/connection',
authDocUrl: '{DOCS_URL}/apps/helix/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -90,7 +90,7 @@ export default defineAction({
async run($) {
const method = $.step.parameters.method;
const data = $.step.parameters.data;
const data = $.step.parameters.data || null;
const url = $.step.parameters.url;
const headers = $.step.parameters.headers;
@@ -108,14 +108,17 @@ export default defineAction({
return result;
}, {});
let contentType = headersObject['content-type'];
let expectedResponseContentType = headersObject.accept;
// in case HEAD request is not supported by the URL
try {
const metadataResponse = await $.http.head(url, {
headers: headersObject,
});
contentType = metadataResponse.headers['content-type'];
if (!expectedResponseContentType) {
expectedResponseContentType = metadataResponse.headers['content-type'];
}
throwIfFileSizeExceedsLimit(metadataResponse.headers['content-length']);
// eslint-disable-next-line no-empty
@@ -128,7 +131,7 @@ export default defineAction({
headers: headersObject,
};
if (!isPossiblyTextBased(contentType)) {
if (!isPossiblyTextBased(expectedResponseContentType)) {
requestData.responseType = 'arraybuffer';
}
@@ -138,7 +141,7 @@ export default defineAction({
let responseData = response.data;
if (!isPossiblyTextBased(contentType)) {
if (!isPossiblyTextBased(expectedResponseContentType)) {
responseData = Buffer.from(responseData).toString('base64');
}

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'HTTP Request',
key: 'http-request',
iconUrl: '{BASE_URL}/apps/http-request/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/http-request/connection',
authDocUrl: '{DOCS_URL}/apps/http-request/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'HubSpot',
key: 'hubspot',
iconUrl: '{BASE_URL}/apps/hubspot/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/hubspot/connection',
authDocUrl: '{DOCS_URL}/apps/hubspot/connection',
supportsConnections: true,
baseUrl: 'https://www.hubspot.com',
apiBaseUrl: 'https://api.hubapi.com',

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: 'https://invoiceninja.com',
apiBaseUrl: 'https://invoicing.co/api',
iconUrl: '{BASE_URL}/apps/invoice-ninja/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/invoice-ninja/connection',
authDocUrl: '{DOCS_URL}/apps/invoice-ninja/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -10,7 +10,7 @@ export default defineApp({
name: 'Mattermost',
key: 'mattermost',
iconUrl: '{BASE_URL}/apps/mattermost/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/mattermost/connection',
authDocUrl: '{DOCS_URL}/apps/mattermost/connection',
baseUrl: 'https://mattermost.com',
apiBaseUrl: '', // there is no cloud version of this app, user always need to provide address of own instance when creating connection
primaryColor: '4a154b',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://miro.com',
apiBaseUrl: 'https://api.miro.com',
iconUrl: '{BASE_URL}/apps/miro/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/miro/connection',
authDocUrl: '{DOCS_URL}/apps/miro/connection',
primaryColor: 'F2CA02',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -0,0 +1,70 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create board',
key: 'createBoard',
description: 'Creates a new board.',
arguments: [
{
label: 'Board Name',
key: 'boardName',
type: 'string',
required: true,
description: 'Title for the board.',
variables: true,
},
{
label: 'Board Kind',
key: 'boardKind',
type: 'dropdown',
required: true,
description: '',
variables: true,
options: [
{
label: 'Main',
value: 'public',
},
{
label: 'Private',
value: 'private',
},
{
label: 'Shareable',
value: 'share',
},
],
},
{
label: 'Template ID',
key: 'templateId',
type: 'string',
required: false,
description:
"When you switch on developer mode, you'll spot the template IDs in your template store. Additionally, you have the option to utilize the Board ID from any board you've saved as a template.",
variables: true,
},
],
async run($) {
const { boardName, boardKind, templateId } = $.step.parameters;
const body = {
query: `mutation {
create_board (board_name: "${boardName}", board_kind: ${boardKind}${
templateId ? `, template_id: ${templateId}` : ''
}) {
id
name
board_kind
}
}`,
};
const { data } = await $.http.post('/', body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,3 @@
import createBoard from './create-board/index.js';
export default [createBoard];

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="256px" height="156px" viewBox="0 0 256 156" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M31.8458633,153.488694 C20.3244423,153.513586 9.68073708,147.337265 3.98575204,137.321731 C-1.62714067,127.367831 -1.29055839,115.129325 4.86093879,105.498969 L62.2342919,15.4033556 C68.2125882,5.54538256 79.032489,-0.333585033 90.5563073,0.0146553508 C102.071737,0.290611552 112.546041,6.74705604 117.96667,16.9106216 C123.315033,27.0238906 122.646488,39.1914174 116.240607,48.6847625 L58.9037201,138.780375 C52.9943022,147.988884 42.7873202,153.537154 31.8458633,153.488694 L31.8458633,153.488694 Z" fill="#F62B54"></path>
<path d="M130.25575,153.488484 C118.683837,153.488484 108.035731,147.301291 102.444261,137.358197 C96.8438154,127.431292 97.1804475,115.223704 103.319447,105.620522 L160.583402,15.7315506 C166.47539,5.73210989 177.327374,-0.284878136 188.929728,0.0146553508 C200.598885,0.269918151 211.174058,6.7973526 216.522421,17.0078646 C221.834319,27.2183766 221.056375,39.4588356 214.456008,48.9278699 L157.204209,138.816842 C151.313487,147.985468 141.153618,153.5168 130.25575,153.488484 Z" fill="#FFCC00"></path>
<ellipse fill="#00CA72" cx="226.465527" cy="125.324379" rx="29.5375538" ry="28.9176274"></ellipse>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,21 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'apiToken',
label: 'API Token',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Monday.com API token of your account.',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -0,0 +1,18 @@
const verifyCredentials = async ($) => {
const body = {
query: 'query { me { name, email } }',
};
const { data } = await $.http.post('/', body);
const screenName = [data.data.me.name, data.data.me.email]
.filter(Boolean)
.join(' @ ');
await $.auth.set({
screenName,
apiToken: $.auth.data.apiToken,
});
};
export default verifyCredentials;

View File

@@ -0,0 +1,9 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.apiToken) {
requestConfig.headers.Authorization = $.auth.data.apiToken;
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -0,0 +1,20 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import triggers from './triggers/index.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Monday',
key: 'monday',
iconUrl: '{BASE_URL}/apps/monday/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/monday/connection',
supportsConnections: true,
baseUrl: 'https://monday.com',
apiBaseUrl: 'https://api.monday.com/v2',
primaryColor: 'F62B54',
beforeRequest: [addAuthHeader],
auth,
triggers,
actions,
});

View File

@@ -0,0 +1,3 @@
import newBoards from './new-boards/index.js';
export default [newBoards];

View File

@@ -0,0 +1,29 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New board',
key: 'newBoard',
pollInterval: 15,
description: 'Triggers when a new board is created.',
async run($) {
const body = {
query: 'query { boards { id, name } }',
};
const { data } = await $.http.post('/', body);
if (!data?.data?.boards?.length) {
return;
}
for (const board of data.data.boards) {
$.pushTriggerItem({
raw: board,
meta: {
internalId: board.id,
},
});
}
},
});

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: 'https://notion.com',
apiBaseUrl: 'https://api.notion.com',
iconUrl: '{BASE_URL}/apps/notion/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/notion/connection',
authDocUrl: '{DOCS_URL}/apps/notion/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [addAuthHeader, addNotionVersionHeader],

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Ntfy',
key: 'ntfy',
iconUrl: '{BASE_URL}/apps/ntfy/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/ntfy/connection',
authDocUrl: '{DOCS_URL}/apps/ntfy/connection',
supportsConnections: true,
baseUrl: 'https://ntfy.sh',
apiBaseUrl: 'https://ntfy.sh',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'Odoo',
key: 'odoo',
iconUrl: '{BASE_URL}/apps/odoo/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/odoo/connection',
authDocUrl: '{DOCS_URL}/apps/odoo/connection',
supportsConnections: true,
baseUrl: 'https://odoo.com',
apiBaseUrl: '',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://openai.com',
apiBaseUrl: 'https://api.openai.com',
iconUrl: '{BASE_URL}/apps/openai/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/openai/connection',
authDocUrl: '{DOCS_URL}/apps/openai/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -64,32 +64,17 @@ export default defineAction({
value: '1',
description:
'The ID of the stage this deal will be added to. If omitted, the deal will be placed in the first stage of the default pipeline.',
options: [
{
label: 'Qualified (Pipeline)',
value: 1,
},
{
label: 'Contact Made (Pipeline)',
value: 2,
},
{
label: 'Prospect Qualified (Pipeline)',
value: 3,
},
{
label: 'Needs Defined (Pipeline)',
value: 4,
},
{
label: 'Proposal Made (Pipeline)',
value: 5,
},
{
label: 'Negotiations Started (Pipeline)',
value: 6,
},
],
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listStages',
},
],
},
},
{
label: 'Owner',

View File

@@ -1,23 +1,25 @@
import listActivityTypes from './list-activity-types/index.js';
import listCurrencies from './list-currencies/index.js';
import listDeals from './list-deals/index.js';
import listLeads from './list-leads/index.js';
import listLeadLabels from './list-lead-labels/index.js';
import listOrganizations from './list-organizations/index.js';
import listLeads from './list-leads/index.js';
import listOrganizationLabelField from './list-organization-label-field/index.js';
import listOrganizations from './list-organizations/index.js';
import listPersonLabelField from './list-person-label-field/index.js';
import listPersons from './list-persons/index.js';
import listStages from './list-stages/index.js';
import listUsers from './list-users/index.js';
export default [
listActivityTypes,
listCurrencies,
listDeals,
listLeads,
listLeadLabels,
listOrganizations,
listLeads,
listOrganizationLabelField,
listOrganizations,
listPersonLabelField,
listPersons,
listStages,
listUsers,
];

View File

@@ -0,0 +1,23 @@
export default {
name: 'List stages',
key: 'listStages',
async run($) {
const stages = {
data: [],
};
const { data } = await $.http.get('/api/v1/stages');
if (data.data?.length) {
for (const stage of data.data) {
stages.data.push({
value: stage.id,
name: stage.name,
});
}
}
return stages;
},
};

View File

@@ -12,7 +12,7 @@ export default defineApp({
baseUrl: '',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/pipedrive/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/pipedrive/connection',
authDocUrl: '{DOCS_URL}/apps/pipedrive/connection',
primaryColor: 'FFFFFF',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Placetel',
key: 'placetel',
iconUrl: '{BASE_URL}/apps/placetel/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/placetel/connection',
authDocUrl: '{DOCS_URL}/apps/placetel/connection',
supportsConnections: true,
baseUrl: 'https://placetel.de',
apiBaseUrl: 'https://api.placetel.de',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'PostgreSQL',
key: 'postgresql',
iconUrl: '{BASE_URL}/apps/postgresql/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/postgresql/connection',
authDocUrl: '{DOCS_URL}/apps/postgresql/connection',
supportsConnections: true,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -9,7 +9,7 @@ export default defineApp({
baseUrl: 'https://pushover.net',
apiBaseUrl: 'https://api.pushover.net',
iconUrl: '{BASE_URL}/apps/pushover/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/pushover/connection',
authDocUrl: '{DOCS_URL}/apps/pushover/connection',
primaryColor: '249DF1',
supportsConnections: true,
auth,

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://www.reddit.com',
apiBaseUrl: 'https://oauth.reddit.com',
iconUrl: '{BASE_URL}/apps/reddit/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/reddit/connection',
authDocUrl: '{DOCS_URL}/apps/reddit/connection',
primaryColor: 'FF4500',
supportsConnections: true,
beforeRequest: [addAuthHeader],

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Remove.bg',
key: 'removebg',
iconUrl: '{BASE_URL}/apps/removebg/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/removebg/connection',
authDocUrl: '{DOCS_URL}/apps/removebg/connection',
supportsConnections: true,
baseUrl: 'https://www.remove.bg',
apiBaseUrl: 'https://api.remove.bg/v1.0',

View File

@@ -5,7 +5,7 @@ export default defineApp({
name: 'RSS',
key: 'rss',
iconUrl: '{BASE_URL}/apps/rss/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/rss/connection',
authDocUrl: '{DOCS_URL}/apps/rss/connection',
supportsConnections: false,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Salesforce',
key: 'salesforce',
iconUrl: '{BASE_URL}/apps/salesforce/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/connections/salesforce',
authDocUrl: '{DOCS_URL}/connections/salesforce',
supportsConnections: true,
baseUrl: 'https://salesforce.com',
apiBaseUrl: '',

View File

@@ -6,7 +6,7 @@ export default defineApp({
key: 'scheduler',
iconUrl: '{BASE_URL}/apps/scheduler/assets/favicon.svg',
docUrl: 'https://automatisch.io/docs/scheduler',
authDocUrl: 'https://automatisch.io/docs/apps/scheduler/connection',
authDocUrl: '{DOCS_URL}/apps/scheduler/connection',
baseUrl: '',
apiBaseUrl: '',
primaryColor: '0059F7',

View File

@@ -11,7 +11,7 @@ export default defineApp({
baseUrl: '',
apiBaseUrl: '',
iconUrl: '{BASE_URL}/apps/self-hosted-llm/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/self-hosted-llm/connection',
authDocUrl: '{DOCS_URL}/apps/self-hosted-llm/connection',
primaryColor: '000000',
supportsConnections: true,
beforeRequest: [setBaseUrl, addAuthHeader],

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'SignalWire',
key: 'signalwire',
iconUrl: '{BASE_URL}/apps/signalwire/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/signalwire/connection',
authDocUrl: '{DOCS_URL}/apps/signalwire/connection',
supportsConnections: true,
baseUrl: 'https://signalwire.com',
apiBaseUrl: '',

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Slack',
key: 'slack',
iconUrl: '{BASE_URL}/apps/slack/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/slack/connection',
authDocUrl: '{DOCS_URL}/apps/slack/connection',
supportsConnections: true,
baseUrl: 'https://slack.com',
apiBaseUrl: 'https://slack.com/api',

View File

@@ -6,7 +6,7 @@ export default defineApp({
name: 'SMTP',
key: 'smtp',
iconUrl: '{BASE_URL}/apps/smtp/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/smtp/connection',
authDocUrl: '{DOCS_URL}/apps/smtp/connection',
supportsConnections: true,
baseUrl: '',
apiBaseUrl: '',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Spotify',
key: 'spotify',
iconUrl: '{BASE_URL}/apps/spotify/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/spotify/connection',
authDocUrl: '{DOCS_URL}/apps/spotify/connection',
supportsConnections: true,
baseUrl: 'https://spotify.com',
apiBaseUrl: 'https://api.spotify.com',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Strava',
key: 'strava',
iconUrl: '{BASE_URL}/apps/strava/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/connections/strava',
authDocUrl: '{DOCS_URL}/connections/strava',
supportsConnections: true,
baseUrl: 'https://www.strava.com',
apiBaseUrl: 'https://www.strava.com/api',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Stripe',
key: 'stripe',
iconUrl: '{BASE_URL}/apps/stripe/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/stripe/connection',
authDocUrl: '{DOCS_URL}/apps/stripe/connection',
supportsConnections: true,
baseUrl: 'https://stripe.com',
apiBaseUrl: 'https://api.stripe.com',

View File

@@ -7,7 +7,7 @@ export default defineApp({
name: 'Telegram',
key: 'telegram-bot',
iconUrl: '{BASE_URL}/apps/telegram-bot/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/telegram-bot/connection',
authDocUrl: '{DOCS_URL}/apps/telegram-bot/connection',
supportsConnections: true,
baseUrl: 'https://telegram.org',
apiBaseUrl: 'https://api.telegram.org',

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Todoist',
key: 'todoist',
iconUrl: '{BASE_URL}/apps/todoist/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/todoist/connection',
authDocUrl: '{DOCS_URL}/apps/todoist/connection',
supportsConnections: true,
baseUrl: 'https://todoist.com',
apiBaseUrl: 'https://api.todoist.com/rest/v2',

View File

@@ -10,7 +10,7 @@ export default defineApp({
baseUrl: 'https://trello.com/',
apiBaseUrl: 'https://api.trello.com',
iconUrl: '{BASE_URL}/apps/trello/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/trello/connection',
authDocUrl: '{DOCS_URL}/apps/trello/connection',
supportsConnections: true,
primaryColor: '0079bf',
beforeRequest: [addAuthHeader],

View File

@@ -9,7 +9,7 @@ export default defineApp({
name: 'Twilio',
key: 'twilio',
iconUrl: '{BASE_URL}/apps/twilio/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/twilio/connection',
authDocUrl: '{DOCS_URL}/apps/twilio/connection',
supportsConnections: true,
baseUrl: 'https://twilio.com',
apiBaseUrl: 'https://api.twilio.com',

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Twitter',
key: 'twitter',
iconUrl: '{BASE_URL}/apps/twitter/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/twitter/connection',
authDocUrl: '{DOCS_URL}/apps/twitter/connection',
supportsConnections: true,
baseUrl: 'https://twitter.com',
apiBaseUrl: 'https://api.twitter.com',

View File

@@ -8,7 +8,7 @@ export default defineApp({
name: 'Typeform',
key: 'typeform',
iconUrl: '{BASE_URL}/apps/typeform/assets/favicon.svg',
authDocUrl: 'https://automatisch.io/docs/apps/typeform/connection',
authDocUrl: '{DOCS_URL}/apps/typeform/connection',
supportsConnections: true,
baseUrl: 'https://typeform.com',
apiBaseUrl: 'https://api.typeform.com',

View File

@@ -1,408 +0,0 @@
export const fields = [
{
label: 'Summary',
key: 'summary',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Case Title',
key: 'caseTitle',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Status',
key: 'status',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.status',
value: 'casestatus',
},
],
},
},
{
label: 'Priority',
key: 'priority',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.priority',
value: 'casepriority',
},
],
},
},
{
label: 'Contact',
key: 'contactId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Group',
key: 'groupId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listGroups',
},
],
},
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Product',
key: 'productId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listProducts',
},
],
},
},
{
label: 'Channel',
key: 'channel',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.channel',
value: 'casechannel',
},
],
},
},
{
label: 'Resolution',
key: 'resolution',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Category',
key: 'category',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.category',
value: 'impact_type',
},
],
},
},
{
label: 'Sub Category',
key: 'subCategory',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.subCategory',
value: 'impact_area',
},
],
},
},
{
label: 'Resolution Type',
key: 'resolutionType',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.resolutionType',
value: 'resolution_type',
},
],
},
},
{
label: 'Deferred Date',
key: 'deferredDate',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Service Contract',
key: 'serviceContractId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listServiceContracts',
},
],
},
},
{
label: 'Asset',
key: 'assetId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listAssets',
},
],
},
},
{
label: 'SLA',
key: 'slaId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSlaNames',
},
],
},
},
{
label: 'Is Billable',
key: 'isBillable',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Service',
key: 'service',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listServices',
},
],
},
},
{
label: 'Rate',
key: 'rate',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Service Type',
key: 'serviceType',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.serviceType',
value: 'servicetype',
},
],
},
},
{
label: 'Service Location',
key: 'serviceLocation',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.serviceLocation',
value: 'servicelocation',
},
],
},
},
{
label: 'Work Location',
key: 'workLocation',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,78 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create case',
key: 'createCase',
description: 'Create a new case.',
arguments: fields,
async run($) {
const {
summary,
recordCurrencyId,
caseTitle,
status,
priority,
contactId,
organizationId,
groupId,
assignedTo,
productId,
channel,
resolution,
category,
subCategory,
resolutionType,
deferredDate,
serviceContractId,
assetId,
slaId,
isBillable,
service,
rate,
serviceType,
serviceLocation,
workLocation,
} = $.step.parameters;
const elementData = {
description: summary,
record_currency_id: recordCurrencyId,
title: caseTitle,
casestatus: status,
casepriority: priority,
contact_id: contactId,
parent_id: organizationId,
group_id: groupId,
assigned_user_id: assignedTo,
product_id: productId,
casechannel: channel,
resolution: resolution,
impact_type: category,
impact_area: subCategory,
resolution_type: resolutionType,
deferred_date: deferredDate,
servicecontract_id: serviceContractId,
asset_id: assetId,
slaid: slaId,
is_billable: isBillable,
billing_service: service,
rate: rate,
servicetype: serviceType,
servicelocation: serviceLocation,
work_location: workLocation,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Cases',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,649 +0,0 @@
export const fields = [
{
label: 'Salutation',
key: 'salutation',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Mr.', value: 'Mr.' },
{ label: 'Ms.', value: 'Ms.' },
{ label: 'Mrs.', value: 'Mrs.' },
{ label: 'Dr.', value: 'Dr.' },
{ label: 'Prof.', value: 'Prof.' },
],
},
{
label: 'First Name',
key: 'firstName',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Last Name',
key: 'lastName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Primary Email',
key: 'primaryEmail',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Office Phone',
key: 'officePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mobile Phone',
key: 'mobilePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Home Phone',
key: 'homePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Date of Birth',
key: 'dateOfBirth',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Fax',
key: 'fax',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.title',
value: 'listContactOptions',
},
],
},
},
{
label: 'Department',
key: 'department',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Reports To',
key: 'reportsTo',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Lead Source',
key: 'leadSource',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.leadSource',
value: 'leadsource',
},
],
},
},
{
label: 'Secondary Email',
key: 'secondaryEmail',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Do Not Call',
key: 'doNotCall',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Notify Owner',
key: 'notifyOwner',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Twitter Username',
key: 'twitterUsername',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'SLA',
key: 'slaId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSlaNames',
},
],
},
},
{
label: 'Lifecycle Stage',
key: 'lifecycleStage',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.lifecycleStage',
value: 'contacttype',
},
],
},
},
{
label: 'Status',
key: 'status',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.status',
value: 'contactstatus',
},
],
},
},
{
label: 'Happiness Rating',
key: 'happinessRating',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.happinessRating',
value: 'happiness_rating',
},
],
},
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Referred By',
key: 'referredBy',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Email Opt-in',
key: 'emailOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.emailOptin',
value: 'emailoptin',
},
],
},
},
{
label: 'SMS Opt-in',
key: 'smsOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.smsOptin',
value: 'smsoptin',
},
],
},
},
{
label: 'Language',
key: 'language',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.language',
value: 'language',
},
],
},
},
{
label: 'Source Campaign',
key: 'sourceCampaignId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaignSources',
},
],
},
},
{
label: 'Portal User',
key: 'portalUser',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Support Start Date',
key: 'supportStartDate',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Support End Date',
key: 'supportEndDate',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Other Country',
key: 'otherCountry',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.otherCountry',
value: 'othercountry',
},
],
},
},
{
label: 'Mailing Country',
key: 'mailingCountry',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.mailingCountry',
value: 'mailingcountry',
},
],
},
},
{
label: 'Mailing Street',
key: 'mailingStreet',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other Street',
key: 'otherStreet',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mailing PO Box',
key: 'mailingPoBox',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other PO Box',
key: 'otherPoBox',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mailing City',
key: 'mailingCity',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other City',
key: 'otherCity',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mailing State',
key: 'mailingState',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.mailingState',
value: 'mailingstate',
},
],
},
},
{
label: 'Other State',
key: 'otherState',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.otherState',
value: 'otherstate',
},
],
},
},
{
label: 'Mailing Zip',
key: 'mailingZip',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other Zip',
key: 'otherZip',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Contact Image',
key: 'contactImage',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Linkedin URL',
key: 'linkedinUrl',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Linkedin Followers',
key: 'linkedinFollowers',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Facebook URL',
key: 'facebookUrl',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Facebook Followers',
key: 'facebookFollowers',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,129 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create contact',
key: 'createContact',
description: 'Create a new contact.',
arguments: fields,
async run($) {
const {
salutation,
firstName,
lastName,
primaryEmail,
officePhone,
mobilePhone,
homePhone,
dateOfBirth,
fax,
organizationId,
title,
department,
reportsTo,
leadSource,
secondaryEmail,
assignedTo,
doNotCall,
notifyOwner,
twitterUsername,
slaId,
lifecycleStage,
status,
happinessRating,
recordCurrencyId,
referredBy,
emailOptin,
smsOptin,
language,
sourceCampaignId,
portalUser,
supportStartDate,
supportEndDate,
otherCountry,
mailingCountry,
mailingStreet,
otherStreet,
mailingPoBox,
otherPoBox,
mailingCity,
otherCity,
mailingState,
otherState,
mailingZip,
otherZip,
description,
contactImage,
linkedinUrl,
linkedinFollowers,
facebookUrl,
facebookFollowers,
} = $.step.parameters;
const elementData = {
salutationtype: salutation,
firstname: firstName,
lastname: lastName,
email: primaryEmail,
phone: officePhone,
mobile: mobilePhone,
homephone: homePhone,
birthday: dateOfBirth,
fax: fax,
account_id: organizationId,
title: title,
department: department,
contact_id: reportsTo,
leadsource: leadSource,
secondaryemail: secondaryEmail,
assigned_user_id: assignedTo || $.auth.data.userId,
donotcall: doNotCall,
notify_owner: notifyOwner,
emailoptout: emailOptin,
primary_twitter: twitterUsername,
slaid: slaId,
contacttype: lifecycleStage,
contactstatus: status,
happiness_rating: happinessRating,
record_currency_id: recordCurrencyId,
referred_by: referredBy,
emailoptin: emailOptin,
smsoptin: smsOptin,
language: language,
source_campaign: sourceCampaignId,
portal: portalUser,
support_start_date: supportStartDate,
support_end_date: supportEndDate,
othercountry: otherCountry,
mailingcountry: mailingCountry,
mailingstreet: mailingStreet,
otherstreet: otherStreet,
mailingpobox: mailingPoBox,
otherpobox: otherPoBox,
mailingcity: mailingCity,
othercity: otherCity,
mailingstate: mailingState,
otherstate: otherState,
mailingzip: mailingZip,
otherzip: otherZip,
description: description,
imagename: contactImage,
primary_linkedin: linkedinUrl,
followers_linkedin: linkedinFollowers,
primary_facebook: facebookUrl,
followers_facebook: facebookFollowers,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Contacts',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,395 +0,0 @@
export const fields = [
{
label: 'Salutation',
key: 'salutation',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Mr.', value: 'Mr.' },
{ label: 'Ms.', value: 'Ms.' },
{ label: 'Mrs.', value: 'Mrs.' },
{ label: 'Dr.', value: 'Dr.' },
{ label: 'Prof.', value: 'Prof.' },
],
},
{
label: 'First Name',
key: 'firstName',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Last Name',
key: 'lastName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Company',
key: 'company',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Primary Email',
key: 'primaryEmail',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Office Phone',
key: 'officePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Designation',
key: 'designation',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.designation',
value: 'designation',
},
],
},
},
{
label: 'Mobile Phone',
key: 'mobilePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Industry',
key: 'industry',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.industry',
value: 'industry',
},
],
},
},
{
label: 'Website',
key: 'website',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Annual Revenue',
key: 'annualRevenue',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Lead Source',
key: 'leadSource',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.leadSource',
value: 'leadsource',
},
],
},
},
{
label: 'Lead Status',
key: 'leadStatus',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.leadStatus',
value: 'leadstatus',
},
],
},
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Fax',
key: 'fax',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Number of Employees',
key: 'numberOfEmployees',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Twitter Username',
key: 'twitterUsername',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Email Opt-in',
key: 'emailOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.emailOptin',
value: 'emailoptin',
},
],
},
},
{
label: 'SMS Opt-in',
key: 'smsOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.smsOptin',
value: 'smsoptin',
},
],
},
},
{
label: 'Language',
key: 'language',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.language',
value: 'language',
},
],
},
},
{
label: 'Source Campaign',
key: 'sourceCampaignId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaignSources',
},
],
},
},
{
label: 'Country',
key: 'country',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.country',
value: 'country',
},
],
},
},
{
label: 'Street',
key: 'street',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'PO Box',
key: 'poBox',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Postal Code',
key: 'postalCode',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'City',
key: 'city',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'State',
key: 'state',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.state',
value: 'state',
},
],
},
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Lead Image',
key: 'leadImage',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,88 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create lead',
key: 'createLead',
description: 'Create a new lead.',
arguments: fields,
async run($) {
const {
salutation,
firstName,
lastName,
company,
primaryEmail,
officePhone,
designation,
mobilePhone,
industry,
website,
annualRevenue,
leadSource,
leadStatus,
assignedTo,
fax,
numberOfEmployees,
twitterUsername,
recordCurrencyId,
emailOptin,
smsOptin,
language,
sourceCampaignId,
country,
street,
poBox,
postalCode,
city,
state,
description,
leadImage,
} = $.step.parameters;
const elementData = {
salutationtype: salutation,
firstname: firstName,
lastname: lastName,
company: company,
email: primaryEmail,
phone: officePhone,
designation: designation,
mobile: mobilePhone,
industry: industry,
website: website,
annualrevenue: annualRevenue,
leadsource: leadSource,
leadstatus: leadStatus,
assigned_user_id: assignedTo || $.auth.data.userId,
fax: fax,
noofemployees: numberOfEmployees,
primary_twitter: twitterUsername,
record_currency_id: recordCurrencyId,
emailoptin: emailOptin,
smsoptin: smsOptin,
language: language,
source_campaign: sourceCampaignId,
country: country,
lane: street,
pobox: poBox,
code: postalCode,
city: city,
state: state,
description: description,
imagename: leadImage,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Leads',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,244 +0,0 @@
export const fields = [
{
label: 'Deal Name',
key: 'dealName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Amount',
key: 'amount',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Contact',
key: 'contactId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Expected Close Date',
key: 'expectedCloseDate',
type: 'string',
required: true,
description: 'Format: yyyy-mm-dd',
variables: true,
},
{
label: 'Pipeline',
key: 'pipeline',
type: 'dropdown',
required: true,
value: 'Standart',
description: '',
variables: true,
options: [{ label: 'Standart', value: 'Standart' }],
},
{
label: 'Sales Stage',
key: 'salesStage',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.salesStage',
value: 'sales_stage',
},
],
},
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: 'Default is the id of the account connected to Automatisch.',
variables: true,
},
{
label: 'Lead Source',
key: 'leadSource',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.leadSource',
value: 'leadsource',
},
],
},
},
{
label: 'Next Step',
key: 'nextStep',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Type',
key: 'type',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.type',
value: 'opportunity_type',
},
],
},
},
{
label: 'Probability',
key: 'probability',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Campaign Source',
key: 'campaignSourceId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaignSources',
},
],
},
},
{
label: 'Weighted Revenue',
key: 'weightedRevenue',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Adjusted Amount',
key: 'adjustedAmount',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Lost Reason',
key: 'lostReason',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.lostReason',
value: 'lost_reason',
},
],
},
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,64 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create opportunity',
key: 'createOpportunity',
description: 'Create a new opportunity.',
arguments: fields,
async run($) {
const {
dealName,
amount,
organizationId,
contactId,
expectedCloseDate,
pipeline,
salesStage,
assignedTo,
leadSource,
nextStep,
type,
probability,
campaignSourceId,
weightedRevenue,
adjustedAmount,
lostReason,
recordCurrencyId,
description,
} = $.step.parameters;
const elementData = {
potentialname: dealName,
amount,
related_to: organizationId,
contact_id: contactId,
closingdate: expectedCloseDate,
pipeline,
sales_stage: salesStage,
assigned_user_id: assignedTo || $.auth.data.userId,
leadsource: leadSource,
nextstep: nextStep,
opportunity_type: type,
probability: probability,
campaignid: campaignSourceId,
forecast_amount: weightedRevenue,
adjusted_amount: adjustedAmount,
lost_reason: lostReason,
record_currency_id: recordCurrencyId,
description,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Potentials',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,357 +0,0 @@
export const fields = [
{
label: 'Name',
key: 'name',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: 'Default is the id of the account connected to Automatisch.',
variables: true,
},
{
label: 'Start Date & Time',
key: 'startDateAndTime',
type: 'string',
required: false,
description: 'Format: yyyy-mm-dd',
variables: true,
},
{
label: 'Due Date',
key: 'dueDate',
type: 'string',
required: false,
description: 'Format: yyyy-mm-dd',
variables: true,
},
{
label: 'Stage',
key: 'stage',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTodoOptions',
},
{
name: 'parameters.stage',
value: 'taskstatus',
},
],
},
},
{
label: 'Contact',
key: 'contactId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Priority',
key: 'priority',
type: 'dropdown',
required: true,
description: '',
variables: true,
options: [
{ label: 'High', value: 'High' },
{ label: 'Medium', value: 'Medium' },
{ label: 'Low', value: 'Low' },
],
},
{
label: 'Send Notification',
key: 'sendNotification',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: 'true' },
{ label: 'False', value: 'false' },
],
},
{
label: 'Location',
key: 'location',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Milestone',
key: 'milestone',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listMilestones',
},
],
},
},
{
label: 'Previous Task',
key: 'previousTask',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
],
},
},
{
label: 'Parent Task',
key: 'parentTask',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
],
},
},
{
label: 'Task Type',
key: 'taskType',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTodoOptions',
},
{
name: 'parameters.taskType',
value: 'tasktype',
},
],
},
},
{
label: 'Skipped Reason',
key: 'skippedReason',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTodoOptions',
},
{
name: 'parameters.skippedReason',
value: 'skipped_reason',
},
],
},
},
{
label: 'Estimate',
key: 'estimate',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Related Task',
key: 'relatedTask',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
],
},
},
{
label: 'Project',
key: 'projectId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listProjects',
},
],
},
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Send Email Reminder Before',
key: 'sendEmailReminderBefore',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Is Billable',
key: 'isBillable',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Service',
key: 'service',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listServices',
},
],
},
},
{
label: 'Rate',
key: 'rate',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'SLA',
key: 'slaId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSlaNames',
},
],
},
},
];

View File

@@ -1,78 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create todo',
key: 'createTodo',
description: 'Create a new todo.',
arguments: fields,
async run($) {
const {
name,
assignedTo,
startDateAndTime,
dueDate,
stage,
contactId,
priority,
sendNotification,
location,
recordCurrencyId,
milestone,
previousTask,
parentTask,
taskType,
skippedReason,
estimate,
relatedTask,
projectId,
organizationId,
sendEmailReminderBefore,
description,
isBillable,
service,
rate,
slaId,
} = $.step.parameters;
const elementData = {
subject: name,
assigned_user_id: assignedTo || $.auth.data.userId,
date_start: startDateAndTime,
due_date: dueDate,
taskstatus: stage,
contact_id: contactId,
taskpriority: priority,
sendnotification: sendNotification,
location: location,
record_currency_id: recordCurrencyId,
milestone: milestone,
dependent_on: previousTask,
parent_task: parentTask,
tasktype: taskType,
skipped_reason: skippedReason,
estimate: estimate,
related_task: relatedTask,
related_project: projectId,
account_id: organizationId,
reminder_time: sendEmailReminderBefore,
description: description,
is_billable: isBillable,
billing_service: service,
rate: rate,
slaid: slaId,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Calendar',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,13 +0,0 @@
import createCase from './create-case/index.js';
import createContact from './create-contact/index.js';
import createLead from './create-lead/index.js';
import createOpportunity from './create-opportunity/index.js';
import createTodo from './create-todo/index.js';
export default [
createCase,
createContact,
createLead,
createOpportunity,
createTodo,
];

View File

@@ -1,925 +0,0 @@
<?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 version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="490px" height="399px" viewBox="0 0 490 399" enable-background="new 0 0 490 399" xml:space="preserve"> <image id="image0" width="490" height="399" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeoAAAGPCAYAAACTVJPTAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA
CXBIWXMAABJ0AAASdAHeZh94AACAAElEQVR42uyddbzk1Pn/3yfJyNW968YaLIu7u2tpC7QUSgVa
KkBb2kIdClSoU/3R0pYW/Rb3Fne3XWCxhWXdXa6MJDnn90cykplkJnNt7r2bDy/gzuTJyclJJp88
LpRSiggRIkSIECHCgIRW7wlEiBAhQoQIEYIREXWECBEiRIgwgBERdYQIESJEiDCAERF1hAgRIkSI
MIAREXWECBEiRIgwgBERdYQIESJEiDCAERF1hAgRIkSIMIAREXWECBEiRIgwgBERdYQIESJEiDCA
ERF1hAgRIkSIMIAREXWECBEiRIgwgBERdYQIESJEiDCAERF1hAgRIkSIMIAREXWECBEiRIgwgBER
dYQIESJEiDCAERF1hAgRIkSIMIAREXWECBEiRIgwgBERdYQIESJEiDCAERF1hAgRIkSIMIAREXWE
CBEiRIgwgBERdYQIESJEiDCAERF1hAgRIkSIMIAREXWECBEiRIgwgBERdYQIESJEiDCAERF1hAgR
IkSIMIAREXWECBEiRIgwgBERdYQIESJEiDCAERF1hAgRIkSIMIAREXWECBEiRIgwgGHUewIRIkQI
Rta2eG/9PFam1rMp00nazrIp24UmBJYCS+UkVdWxchIGoAuwlWJcQxuWtJjSMo7hiRZ2HjW93qcc
IUKEEkREHSFCHZGVJlJKMtLi3XXzeH7lW6zqXM/y9AakMDClzaZMO2nLxMRCSoWtFIIc8Rb+ykMA
0vuV8vwlQQkUCkPoKBRNRpK4ZjAs0YwmNBJC0RpLsvuobdlpxDT2GLMDSklimk5Mj9V72SJE2KIg
lFLVX8UjRIjQcyjFnI0L2ZDpJKMkjy1+iZlr32dTNoWpdBCgoYEQaAiEcH6amtAQCASAAiEEyvkT
kWdkUThOyVeFj85eCuF8KZw54X6rAFtJd6oKJUEiUUiUVBhIRjW0cuykvdlzzPbENJ3RyWFsO3xy
vVc2QoQhjYioI0ToQyxrX8mTy2ayMtPJss41vL72QzqsNEroxDQDQ9PRVBHJ5nRfQY6aC9+55OrQ
bW5rjnGLRFXhq8LHog0Kh6CFd67F4yopy7YBSKXIKAvLttCkxYh4M/uO34lRyVYmJFv52DaH0JJo
qfeyR4gwpBARdYQIvQRTmqSsLO9vXMgtcx9ncddGNmQ72JTtAiEwhI6hGWg5c7UAIV2CFMJLpqVw
eVOJUuIFH9XZkcWHpH0UcO+uyiFxBYjSeShnU5FpXSLJ2hZS2YBiVKKNpniMGc1j+dLOH2dC82ia
Ygk0odf78kSIMGgREXWECD3EnA0LWdKxmnsXPsvsDUuwhI6yJZrmmK21fHKFS85A7r/KcRf7a8cU
divm2YIslJm8yz6WkH/AITzjSnxIukhOuRMXecu5I69AKolUEksqdE0jriT7j92Wk7Y+lK2aR0Vm
8ggRuoGIqCNE6AbmblzEE8tf54NNK3hu5VuYaCT1BIYmQDnm45yP2YE/AUuV48Qq2rSHZ31kA03e
0u/L0mkUNO+cyuzP085ohf+UnxCgpMj7vBUKU9qkrDQtusGRW+3J1ObRnDbjCEY2DK/zVYwQYXAg
IuoIEUJCKsWd8x7noaUzWZ7exNrUZgw9RlwzXGIGqQRCKVftFMGDuewoBZVN3qWuZZQrH0zSUKp5
B2vTtZB03rVd4fyUO4zIvxtIj4s9a5vYtsmE5lGMjDXytV0+xn4Td0GPTOMRIgQiIuoIESqgy+zi
3Y1LuGfB0zyxYjZSGGhoGEJzorFFwU/skJR0SUpUHlg6JA3SYwovlcltKvxZOXjM+1WJY5sKu3pt
8B7kveEKhGvyDjo/KUstBMWyihxvW0piKYlSipiy+PjWB3Li1APZffR0NC0i7QgRihERdYQIPkhb
KW7+8DGeW/keb25YSExPEtM0JxDMw2eurxnXbSsCnMDF8Civ1f3SUMHkHcjblQPIvCN5bPBlyO8e
aPJ2x8xr034kXTioEgqlhKOVK4VEkbUtTCvNYeN35YBx2/O5HY8HERVOjBABIqKOEKEIihVd67jq
7bt4fcNiVqc3EhdxYpoBKISoQFAQ2uRdIOlwfumwJu/gVKzyQxSGr2zy9mRyhTJ5V3aEl0etu7Nw
H0MZ28KyTcY3jmD/0dvw/f3PpslI9OVFjxBhwCMi6ggRgHfXL+DaDx7gxTVzsdExhEBHwyFoqES+
UrrE02d+6XAm7zK/dG8Gj1U5v4LJOzisvEDSPnL5tG2FRGApG1va6Cg+NmUfPr/TCUwbNrGHVzlC
hMGJiKgjbNH478JneXXtPO5f/CLJWBMxzUAIRUExrGzGdkzeytUkq5N0gayqm7x9NeQcwpq8+zh4
DEoDyPwPWn4o/2j0gvVAoJRTFy1tZ9Gk5ORpB3Ls5L05aKvdeunqR4gwOBARdYQtEgs2L+O3s2/l
jfWLkAga9DjgFh6pEFhVCpkPsKoePFZRoyySK1eGw2rTtZi8ZU6190V+d1nFUhAmxazsUMHz9Jjk
c68Uyim00mVlaTZizGgdz5+PuIC2ZGutlz1ChEGJiKgjbFF4d8NCrn73Hl5eNx9dxIhret73nNd0
KxT8yCGnbaLCadPlfmmooO6WEG+RbED1MSjR0qtp09I9UCWTdyFCzv+03PMiHxTnc075ymsBhVpK
plzYIgsLgTsZBZYbeIayOGny3pyzy0fZpm2r0Nc/QoTBiIioI2wRWN21lmvef4j7Fr2Mpscdgoa8
/zlPjFXMwTnIGki63C8NlUi6LL2qSvUxqEWb9kwoeMrVTN5lXB/G5B0Y/VYehe71ExSte+5VQ5Gx
sxhS8pntjuKLO5/A8Ia2mu+LCBEGAyKijjCkoZTN3969m7sXvcomM02jkXAJ2ustBekGTVUn6dB+
aXdwh298orY9A1KZpH04vtZULKBg1i+R8a5FdZO3lLmlqpyKJYM06cAp54qIC19xKLxQKQUSRUc2
xdhkC1/Z6Xg+s+OJoVwWESIMJkREHWHI4rU1c7h85nWsN7MYQkcXoiyCO88XfeGX7na+tPev/Efw
Ua7DadLkZCuYvAtrQSiTdyF4rGRivgqxbyFynykXmbyDLAe5fDgEyn2ZsKSNadvMaB3Fzw48hx1H
bVP9QkaIMEgQEXWEIYclHSv5/Vu388yq92g0mjB8CBp8fLbViJdikgpR2ESWapSV86ULH2uJ8g7r
ly6bkL9cIYqMStp0teAxL9cGn4/3KBVM3lXPQWErMKUkle3gM9sdwdd2O5lRjSOqXtMIEQY6IqKO
MKRw84cPcdO8Z1ib6aRRT1IpDzqsz9azj6xQ1KMYYXOme1TYpGiAqlHelf3veblCFJnvfHta2KT0
BHzJvFKQewXLh3SN40o6pV/HN7Tx3b1O4/itD6x+YSNEGMCIiDrCkMCyjlX85PXreWPDUpJ6HAO9
so8VAOUETFXw2Xr2cU3CVWt5F0U6B9byLnK6ektxV07FKg8ew1cD9cq6keyVTN654DEUgbW8PYaH
YAuB173sky9dds7BPvYy/7VPRH5+2KJzUICpbDJWluO32p0f7f85RkfadYRBioioIwx6/GfuI1zz
wcOklSKhGQhEVYVX5jRXGY6kC27bKibvIk3aGbaCyds9rm/kdtFYwdXHCCRpj1k/dPWxyg03Csps
sDZdMcq72jlXPH3/8/AEmfmcg1ROwZSR8Ua+v9cZnLhNpF1HGHyIiDrCoMWG9CYunXUdL62dS4Pe
4ASLVSHp3M2ulAxF6I6sa5LOO3GDd1B5S7QqIqswqVjVSbpgGi8at6LruzJJF9aieipWXusW3STp
QD72N92XHSXA5J0//YJZwDM31xiOabva9aTd+PnBX6Up3kCECIMFEVFHGJR4fuVsLn/9BjosSVI3
HKtuCO04b/KuUvAjh7xPtoq26Q5bFFQdUAAkNwlP/FetwWPuuJXdxK7Ju7ImTZ7bKnTFck35YUze
1YLHQudLU0K3PsF+3gA4/xcNmRd0zOEpK8O4RBM3nvAjJraOI0KEwYCIqCMMKljS5Jo5/+Xv7z9C
S7wFXbjPbxVOO/aYvOsRPFamWVYPHnPm7ePz7UEtb29wd5jgsYCJuV9X7AgWGCfmn4oVxuTtOf0K
7Te96eAKpRRZaSGQfHXH4zl/z9Oq3wQRItQZEVFHGDRoz3bytef/wJz2tUWFSyqbgIvhEIBEhCR1
AFlzw43uFDYJDNUu+SrYn1u+a3VtupImWjj/YkU2+M0gMA0tcMphtWn/8wijTRfiCkpWUSmkgo5s
Jx+Zshd/OOKCUKl5ESLUCxFRRxgUeGfdh1z06j/YbNokdMMlT6hEWsWo2eSN629GBvahLh68lq5Y
ufkEmrwpfFUIlnJfALzh0j7nSNXCJoWYq8okXZ6KVXLQMKlYpSW7SxcjZGGTwCWS/i4Jr1nfb/4K
W0KXlWFq80iuPurbTG2bQIQIAxERUUcY8LhrwZP84Z37EMJAF7rXFB3eKl3VZ+uRd//TvYYb3cyX
9pVzIPwZz+ccw5q8w5J0blIlB/VViIO1aV+Td6UAspxjvISkvTIQVEFNViRpV0Y632ekRaOm8d29
TuO07Y8mQoSBhoioIwxoXPLqP3hk+ds0xpLoaEhRQnDhsqVCpSnlUHjI91L1sbAmb1+tu2SDZzdV
PA0nij2faxw4Xdf0X7kEao+rj/XU5C0DCJhikg5j8vZfjOIXEaXAVjad2Q6+ufvJfD3yW0cYYIiI
OsKARNbO8J2X/8rLaxfSaCTRRM7466ZV5VCFSwda9bHAWt4V05PcmlvFyiHkz6wgoUq2eyFy2qks
G6hIcRVFa1Bhgav11/Y952CTdxmZV4ryzg8aEEDm2eT/QuQd3gkyU0BnNsVnZhzKpQedQ4QIAwUR
UUcYcFiTWseFL13NB+1raTLiCJGr71WkTQdbNPPIm5jrVX3MlQN8qo8VyecdqiJ/UlI5c88ZyaWS
SKmc/yvproXMj9lqJNDQ8/5sLxELbCSbsyk0JVACJBoCgS40NCHQhIYQAqGc4+VOX5Qucu7lJL+9
+Hjl1yVMYRPf6mNBJu+CX6LMN50/dN5tXW6yL7eol7wSKcWmdCfHT9qdSw74HONbxhAhQr0REXWE
AYXFHcv55otXszLdToMezwdySXxM3lCFpKna1tGzT94cGt7k7QxbzdYcUPoTQDm9lXPmV6kUUik3
ol2goYgLGJloYWrLWKa2jmP30dvTaDQ4qWk4DUdaYg1oRbRafm6KjdkuNOEcz1awMbOZWSvfZ2nn
KuZtWs4ms4us1LABpWxnvi6J6zkid/26UuRM7cGsW2oVqOqXBqoWNpH+JJ0/dJlvutQvTSBJF4wS
inYzzTYto/jPRy6J+lxHqDsioo4wYPDhxsVc8PLVbDYzxDUDIYppraiSWBVN2pHOBY8RKvVGeoLH
Kgzu0ShVucZZIgelEeHud0pgK0nWMrGVTbMRZ3zTaFpiSVqNGHuN2pZjJu/LyIbhAG6LTq3P1l4p
ia0kmtD5YMNinlz8Cu9tWMJGO8vGdAcrU+tJm1l0LYahx9wqcL3sl65Sy7tS+838pvylKH958hZu
KZEpmSJKkbZNxieb+cuR32TH0Vv32dpHiFANEVFHGBB4dOnL/PzN25BoxFztDYrSqop9mxDCdVxk
8g7tlw4xuCviaJRVqo8BCMerjlJIJLaCtJVBySwTG0dwyPjdGZlsZtvW8Rw4YTcSerzel6IMG1Kb
eXHFbBZ1rGFRxxpeXP42K1MbMfQ4DUaiqHSrQ97KjSeoRtJlZF6hlnfVfGmK/dLl2rQ3it1Hxieo
PlccRbNNbv3oZewwKiLrCPVBRNQR6o7Hl77Cpa/f7GhrQuQ1aShJY6olFatCO8RSeYcjwqdiOVMJ
SK/KD+gc25ISS9kIwBAwIdnC6TOOYYe2yYxMtDC2aVS9l79mLGtfxdp0O2+v/ZAb5zzCejODJR0/
va7pCKG5tcPdKPSKwWOqbM3KZSgtMeaVyVnCC39QE0l7rqvXCqAUmNJGl5J/H/c99hy/fb2XP8IW
iIioI9QVjy15mStm346NwKikSee+DJuK5RM17Ie8y7OX/NJKOhRuSpOMlWF0Yxsj442cMGlPTtnm
CJJanJgeq/ey9xoydobObJp/vX0fL6/6kBWpDWzMdJKIJYgJp9WoyEXd+Zq8qwSP5T9USNfKq8E+
wWMhSDoXue/ds/CCoVCYSqKsLHd+7CdsN2pqvZc9whaGiKgj1A1PLH2VS2bdREx3zaei+DFZQtIh
tOlaU7EKz/+ep2IppZAospaFlFn2HbMdu47YmpOnHci4ptH1Xup+w7tr5/HE0jd4ceU7vLF2ATEj
QUwYaJC/vl4SrhI8lv8QppZ3uUx5OrZPRRnhu2eRud55RGakQrdNrj3++5FmHaFfERF1hLrg0SUv
8Ys370AKrYyknednbfnShWduWYJvsLyicnvHksG9tbzdaSmwlI0tJUpmOXvbozlk4u7s0DZlSGnO
taIj28ncjcv4z3uP8MiSWSg9Rkxo6EIHcqQdbPmovbCJz8uW7/DlCd4+r12UvuwpN1nOMYPb3PKR
H7NDFGAWoZ8QEXWEfsfTy2dy8cyb0DQDQ9O8hExRxHZNhU1ywWNQakb1lffk2tZq8naittPSxFAw
samNk6fsz2nTjya+BZNzEDJWhr+9cSePLpvNova1GHqMuG7gV9I1Hyyfe4mqlIpF5cIm/qlYRWPJ
UpN3kYy7obS0ugJM20SXNted8AP2GBdp1hH6HhFRR+hXfLhpMd966e9ssjLENN1D0h6tuAaTd14D
9/F1BsqH6YoFHgtoroKVKSVdZgeHjtuJ47bak49OO7TeyzooIKXFDe88yMNLZvHymrm0xVsxhABR
uAu87mb/hhteJdv/Bim3qJcXmSk3vBTJBJZWVyipMKVNAsWjn7qSEY3D6720EYY4IqKO0G9Y2rGS
rz7/FzaZ6XyedDHCtnIsRq1R3pDza1audZ0bPF/UTClMaWErm52Gjef8nU5mn7E71ntJByWydpan
l7zO72feztL0JgyhOy9tgoLDo1qUdwW/NJT6poMDyPxeEyv6rt37TKHI2BZbt4ziH8dexITWsfVe
1ghDGBFRR+gXmLbJF5/9DR+2r6NBj/m2jvStPlZd4a0pyrvm6mMoLCUx7QwTGofxk73PYpcR09E1
vd5LOuhhS4v7PnyWa955kAUda0kYCccVUqFpSHlcmU9hE0+kd3BRlmodvXzfE4vfAJRis5nh6K12
5urjvlvv5YwwhBERdYR+wWef/DnzOtb7knRZ9THnTwdhTN4+6T9BkDJs9TGFDXSZKSY1DeeMbQ7j
jG2PqfcyDln8eeatPLBoJos619FkJBFCIfy06bLqY/kPjkyl6mPux/KW3uVFWXwDzHIxEEVlbVGw
KdvFqdP25cqjLqj3MkYYooiIOkKf44ev/p3Hlr9LSywZoElDt3OmazB5O5pWtYYbCikhK20yZhcX
7PJxTp56IMOTbfVexiGPtV0b+dOs27hr3gsYRtx1j4DHIdKT6mPFrgyCSRpKb79yki7O2ZcKOrNd
XLDbR7lgn9PrvYwRhiAioo7Qp/jT27fyn/kv0mQkfAlSuv91vg2vTddcy9v9T2WTtxMoZts2uw7f
ip/u8wXGDcLKYYMdH65fxEXPXM389tXE9DiGJhxbS4XCJlDql/brUOaXXu9fOa28BrmosN2x1GxM
b+Y3B5/D6TtFlpcIvYuIqCP0GWatncMFL/8DQxjoQuAb9EM3u2IF1Ib2Q5jqY1Ipuuwso40GvrzD
8Zy6zRH1Xr4tHv+afS9Xzb6fDNCgxR1TeABJl2vTwQ03avJL+1hsyqumOdFtlpQIKbnxhB+w2/jt
6r18EYYQIqKO0CdY3LGSLz33R9K27SkNWoyywia1VB8LSdJhqo9Z0iYrTQ4dvR3f2+PTjGkcWe/l
i+Dig/WL+NOs23ls2Ts0GUl0Dfzqq8sgk3dg8FgYkzdlpc3K7qKi6DaniYfN6EQTj572O+KxRL2X
L8IQQUTUEXodpp3ltMd/wppsmoRPGhYE5EyHCsR2NfAQJUIhl+Xjl+rjNFxI2yYaNj/d87McM3n/
ei9dhAD84dWbufH9JzFR3nvK950tTPWxcpO3bwBZSTaB5xb1qZomlaLTynDwmBlc99FL6r1sEYYI
IqKO0Ov4/stX8fSaD2nU4r4kDcXVxyCgsoTvPiAR5R0UgveRfsFjCqUE7VYXe42Yyvd2O51t2ybX
e9kiVMGCDUv42pN/ZkH7WprcwERv9THw8037N9zAs6H89vNvFuIphOZTkEWCk7aV6eTz2x3OTw77
Sr2XLcIQQN91oo+wReLuBU/zzOoPHJ9iAEnnUrEclOXK+CIfGR6C0HPHKFgtvc0zLKnYlG3nU1P2
55+HfSci6UGCacMncetHLuOoiTuzKduFbdtA9epjFWWK7qOykuBFJK3wMZ2X3lu5cRS0xJu56f2n
eG7RrHovW4QhgEijjtBreG/DfL70/B+JiSS65v8OWHhMBtZoDNzPrzZ0oLx05YsepkopMtIiIQTf
2/UTfGTqwfVesgjdxB1zHueK127FVhDXDffbEpM3VaK8obI2HWTyLqQQlI8sC5+z0qTNSPDgp37L
sGRLvZcswiBGpFFH6B0oxa9n3wLE0bVKmrQqb7jRyySdO04pSXdaGSY3tvG3g78ekfQgxye3P4p/
H3MRDZpGl5VB5SqdgKevRk9JukyTrkTSFA0mFDFNZ222i/Me+m29lyvCIEdE1BF6Bb9/6xbmtK8h
oen4saknrarYnlgFquyP6vJKFR/HaaTRZWXYtW0CNx7xA3YcsU29lytCL2CPsdtx60cuZdvmkXTZ
2cILWlFRkwKU53/+Hpei7mtFe5XVRwtOwy/6QyGEoMGI8/Ka+dz2zqP1Xq4IgxgRUUfoMZ5c9iq3
LHyxkOvqg9I+zuEbbrj7hWh05e0x7XwjFXSYKQ4euy3XHPZ9Ekay3ssVoRcxtW0CN37kUnZpm0jK
zjrBZRTfLqrwb0kqljdfujx8vOzdUJXt5WnLiU83rxxZ/+TFm3h/3cJ6L1eEQYqIqCP0CCkrzT8/
eJiEFkcLaDGZ13QCn5L++xRIujpLe0naTfxSioyd5eTJe/OHAy9A06LbfSiiNdHMbR/7GWduczDt
2ZRTgzuPkpzqQBIuz8v3Ejk5U03ZyHl+FmV7oQBNaFhCcPFT/6j3UkUYpIieXBF6hF+/+R/mdawl
pukVq4l5SoSGNHmLvBYUorCJh6RBKkmHmeYL0w/jx3t/od7LFKEfcMlBX+S0rfdnU6bT8VnnIahs
zFF5sZJvinYoz8XPfcr3ePG5sZ3dBAnN4LW1C7n2jfvqvUwRBiEioo7QbSzcvIz/Lp1Jo5EM5FFZ
9N88QlQfywf1hDB5F8bMkTRkbJMvzjiCc3f+RL2XKUI/4heHn8dP9j2TjkwXtnLSt4rvI99bSvr3
vRaefcvLpZSO7Xuzul8JIWiKJfnT6/fw3up59V6mCIMMEVFH6CYUP3ztXyT1BjRvkeUiCee/eW26
PBk1YJ8c59ZQfSwXG64UHWYXZ00/jK/v/Ml6L1KEOuCzu5zAd/f8BB2ZLoeDISDJQDn1ZYOKmuRk
AmrEe7ullhcolcr7jS4EnVaWK1+9td5LFGGQISLqCN3Cv+bcz+LURuKaHti9yjfKO0zrypDBY+C6
r3PakpKkLZMvzTiS8yNNeovGV/Y4mZ/u/1k2pTryPuuwfmnvB39tu1owZLmlPBcFnuCBhTN56MPn
671EEQYRIqKOUDMWt6/g+g+fJIZRpfpYpS/89xHVnoCl+yin4YZU0GmmOXvbQzk/0qQjAGfudDyn
b3sQHWYKpVT5XVXyRXnnLHwt2eWWcFUmE3QLC6CtoZVfvPh/ZKxsvZcowiBBRNQRasZ1cx8mKwVa
QGGTgtuuyDcdmntVoQZzFeR82UopUmaaz21zSETSETz45eHn87kZh9JhpV3zSw6yTLasK1Y1mbxg
UVMO3G5tZTIuhMBAY1m6ncujKPAIIRERdYSaMHP1ezyw9HUajJhvzrS3+hiURtwGwVN9zN2tElRu
J2CzmeKo8Tvyrd3OqPfyRBiAuPTgL3Hg6G3ptDIo5fqlK5UIzX0TUMu7pDMHpQ5u724+9ccRJLUY
/134GvPXLan38kQYBIiIOkJN+O1btxHT4hWLMxX80iJU5LYs/SNESVHlajwpO8veI6fwqwPOr/fS
RBjA+H/HXMgeIybTZWfd+zHMDeklckVxLW/f4qOlX3m/KGrIpQlBp7T488w76700EQYBIqKOEBr3
LnyGhZ0biGlaYI9p37DuMF2xfKJv/aBykeNI0rbJti2juergb9V7aSIMcDQnGvnDkV+nRRhkpJ3/
3pOIUHRvFRN5WeB4+R8BJcALvwVVRNICJ12r0Uhw/4KXeGXp2/VenggDHBFRRwiFDZlN3DL/GWK6
EUjSvsE6VZGrPhay4YYbyWMpybBYgj8eeD5xPV7v5YkwCDChZQzXn/gD4igsaaNQPsFjKjjArFLh
+bIS4OUBZqLkFheAoSf4xQs31ntpIgxwREQdIRSeWDaLue0riQm9bJu34UbZl4EoNFEIFzyW20sp
iW1nuXCXUxjdMLLeSxNhEGGn0dtw2f6fozObcvOci5t1+NcsE55NAXXNyuuNFr7wfWFVCKGIazpv
rFvIUwteq/fSRBjAiIg6QlVk7SxXvXc/zUaTr2uvEOEdPmfa4/MLGRHuNFxQdJgpzplxNMdPPqDe
SxNhEOLk7Y/gM9sdSqfZVQgE96k+lkeV6mPlUd4lVcx8hy3UH08YCa589fZ6L0uEAYyIqCNUxbXv
/49VmRQ2EktKbOWkREHOC1fSO7BK9THy0uH80uA+7FCkbJODxmzLl3c6ud7LEmEQ45IDz2aX4ZNJ
2VmXrH3jvkuqj5Wbs/PVxzxR3kXatu8tXtDiBYKYZvDBxuXcN+fpei9LhAGKiKgjVMXxk/bnm9sf
z04to2mJxYkJnYw0SVtZLGm6xSSc3s+lHYb8UNw3ODQUmMpifLKZy/Y6u95LEmGQI24k+NcJ36NV
S2BLq+xW9LijvbbvgoxP9bHSQfzrmpW03BRgI7jh7UfI9+mMEKEIQilVy+MyQgSWdazitvlPsKRr
A2szm5m7eRmWhLgeJyaMvIZdMehMyXBdsci1CpZ0ml38af+vcPCE3eu9BBGGCG5791F+9Pz1NMUb
0IS3g7Wo4JeWviTtdf2UVygtrnfr+R9KKdanNnPrRy/mkCl71HtZIgwwREQdoUdQSvL0ilks7drA
i6ve5pU1czG0JIamoQmBhsgTtifoTPo38iiFdJk6Y2c5Y+uD+Naun6r3KUcYYrjosT9z78JXaY4l
EUIUTN4VgsdUhVSsqiTto1SDImPb7NAyhrtO+xW6rhMhQg4RUUfoNWSsDIs7V7O0YxX/mPM/VqTb
ydgWutAxNB0QCOH7FPOFckWz0mRCQzO3HPVjYlEqVoReRle2ixPv+AFrMh3EdKMQ5OjTFSv/TdnX
3pzp8tu7aAdZStLu10phmln++8krmDFqSr2XJcIAQkTUEfoMGzPtXP3u3XzYvoa3Ny7CRtCox51U
1SratFNAwsl07bK6uPmI77NtW/TwitA3uOu9J/nB8/8mGUs6JvAAos4XNoGSADL3i/LqpEUyIi8q
fd5TFZKMabLLiK2467Rf1XtJIgwgGPWeQIShi7ZECz/Y4/MAPLjoBRZ0rObGDx4lKwSNegJNaK5f
0Cd/xbU/dmRTfHzS3hFJR+hTnLrDETy5ZBYPL32LBi3mvkj6pC9UqeVdTtIldm4CygYoiVAQ0wzm
bV7Nh+sWM33k5HovS4QBgkijjtCvWNa5mtfXzOWqd++h3ZZIJYlpBpr79MuntUqFKS2mNI/ghsN/
QEyP1XvqEYY4NqQ2c8BN5xOLJd3YimIPsoOCb9qTgJ3/WB56URI1hh/9e2M2NmU6+eouJ3DxIWfX
e0kiDBBERD0I0JW1WNdu0ZWVpDIKqQS2FCQMwQOvr2ddh4nhG3vivuUraE5qHLvLcAxdR6AwdEUy
LmiIC1oaNNoa+9f3K5XkyaWvcuO8p3h/0zKU0ElqhlvlydFmOswUl+9xOh+ddmidr0CELQX/efth
Ln7+OloTTR73jHQVYxGgSSvp1+vDq037+aVLSVoBlrRp1ePcd9ovGNcyOi+5Od1BZ7aLLiuLKW0s
ZQMCS0oemPM0SSNBUfJjCQQZK8MOo6cxY/RUpFLoQkMTkNDiNMcbaE02kjAS9b4EEXwQEfUAw6I1
KV6d18HS9TbZrMH8NZ28sbCLOcszbGqXYApQGiiXmXXNPyhLAcX9onPVGZQCYTvRMHEY1qyx1cgY
h+/YwqThDTQ2WLQ2CI7YsYXJoxr65ZwfW/Iy9y95hedXzyEukhiawJI2Ow0bzz8P/169L0mELQhp
M82Z9/2EdzetIOlacapGeeOkP1fyS/uTtCtT5LB2iu8pusw05+16Ilu1jqbLtnl3zTzmrl3M0vY1
bDbTZG0bpQFoCEDXDHL0LHC7xSrKGFsqG6ncUmu2QiiIGwbjG4czadgYdh47nTHNI4grwaRho9lv
4s40J5vqfVm2eEREXWfMXdHF9c+s4rV5FumsxryVGZauNSEjAQM0DXQBuvMg0PPkW/myVQ7Wct/e
3Zd5qTSwpFtswQJdMGV8nK3HxGlMSKaOEXzrxPFMH9t3xC2lzRvrPuQ3b/yH+Z0bsew01x/+XXYZ
Ob1fr0eECA/OfY5vPHU1jW66ln9hE2/OdLnJ26tN+wWPleZxFacvKgSmmSVtpkHTMHQDQ9PRhIZA
kHeh54/lPXL546FEpmh/BdhKYiuFJU2nAIytaIk1MKVtLKObhtOsx9h33HacvutxtETE3e+IiLof
sb4jy4oNNrMWdPKb+5axYJUgnY1hZ21XAwY0DU1zO+24vrDcFdI0DZ+me2VQSrmyleCMWzpm7liW
DVLKfMWRZEOMeMxk+jjFBcePY9/pTbQ1Cca39b6p7PGlr7Jo8wq+uOPH+ufCRIhQgs/cczmz1i8i
JnSEpwZoSR/qkvaVZTLlLmqCdvTISJzeXkI5xy8u2ZtXmXM7FPbMH7lC+hi4FoDc/p6C584BnJd4
p2SwVBIpJbqmkYzFidmKnUZM5oKDP83ohmFMah1DIhaZzPsSEVH3OSS3vrCO1xdkuffV9cyZlwUR
B8PRlIVQ+UAqb5CK8x2EJV7ysk5jeq2qnBDCR/P2Ht+5PUS+QpgtBcoGyDBxrOCcw0cyYYTO6QcO
o60h+rFGGBp4d82HnHzP5SSMRMlvyVvYJNdwo1JhE19tuijZ2rfRXEnps7J2m/kP5eljIlg4X5vA
G7me29P9UoJ0iwI7X7lBnkoh3Tr/lpKYto1m2xw0aSeOmrYvk1pHcvyMA+t96YYkIqLuIzzx9nr+
9MA65iy3+WBhCmwDYhpCxyFnzS3yGwJhiTp3KavJ9kQu951CYNsC27TBNpk+JcnkUToXnjSMj+wR
tZ6MMPjxzYeu5H9LZtMUi+F6ft0tIkCTBr98aVfMK1OUx+Wr/OJ1epdq2wWSLozur02H8aV75+1/
Xt55y9xzQEDWtsiaWWKazl5jpzO+sY0LD/w000dF6WW9hYioexGL12a46Zm1/PGB1azdHEdlbNB1
hFFIPBKuFasWDdlf8/WXDUvoPZcrmOSdyFOBbdnE4xrNSZtvfKSZMw8cxfSxiarafYQIAxHvrP6Q
k+66mOZEK1pJKVHp2xXLS9L+Ju8gv3Rhc6lT3F9BLtGUc59k2WCUadOVgt4IKhpYmLcnME6pQqKa
AtM2saRFcyxJWyzJTw4/h93GzWBc66h6X85BjYioewzFzc+v5eE3O7j+4XUgkxAXoCk0kcvFhGIz
dljizcmHJdV6EHpBxu1KLRW2BMvUwE5z9D5xTt9/JJ85pIWGWFT+M8Lgwjce/j0PLn6dxljc8RVD
qOAxf5N2efnccm26ByRddkDplfHVpgvzDq7s6523bxdbt1d8ri+opRS2lKRsk0YlOGv3Ezh88m4c
vs3e9b6kgxIRUXcbkp/ftZS7X04z671OUDFIamjCeZ0u/CBK3qdr9Df3BfmGGTOMedx/LNen7ba+
zGQFmBl2nRHjmN2S/O7MSRDS5B8hQr3x8pLZfPWxP2Mh0YUW0HADSqPGwpC0vzYd1uTtI1NBmy7v
9lU+b//IdFdGVvCnlxzAkxWmFFJAZzpFUtM5aKsd+cSMQzh116PreVkHHSKirhGrN2e55fk1fOeG
1ZgpJ2dKxDTXNAY9j8YuyEI4E3k9fdhVZdy39awtkLakpRHOOSrJd08ay4ThUfBZhIGPT99zKbPW
LiJpGCBFAKF5CQ/8/NIl+dKlMiXdPjwyZR98/NKeAYtk3G2BvmkpqvulqaZNOy8Y/uflWtuwSVtZ
dKEzOtHEzw7/EodtvSeN8f6p1zCYERF1SGzsynLjM+v50X9W0LFBh5iGZhRHalfXUGvRjvvKPN7f
csWmcaWcdG3T1Egm01x40nC+fGQbU0c1hr4OESL0N55f/AZnPfRbGmJJUKLH1ccgSPkNIOlqUd6V
SLqsopr/vAPzvIvC2n1JusSn7h8Y505SgRIiHzXeZabYffgUzt7jRM7c/fg6XNnBg4ioQ+CKu5bw
14c3sXyxCQ0xhB5eM86hVm26t9Oxwo5bi2m8mlyQaTyX5pVNScaMUpx5SAN/+NxEIOrBG2Fg4sDr
vsIG28QQWsn97DV5+5JZiTbt70ouMVXjx7s+vukqxVhkJb90DVXTfE3eJRPwTzOj7AXD2c2hnaxt
05XpYp/xM/jybidy6q5H1ePyDnhERF0Bj7+1kbP+3yKWrQB0DWHk6vKFj9qGvg8gc154+4pY+2Ks
QsS4ZQtMWzJ+pOTXZ47hcwcPJ/JhRxhouOWdR/jh89fTbCTde7qoSEglbVoVaa61RnkX1yEpInLP
1wGFTXLVycqjvL153oEBZEXz9j8vKpO0z9xV0fnlzi1HP2nbRBeK7VrH85ePfofton7cHkRE7YN3
lnRwxV0rufmhzZCMgSHyPmjnxg9Pus4+9Q0gc35vKlQRlN43eVeXcdI6FGZKcvgeOj88eRTH7jIs
9PpGiNDXWLB+Kafc/WNMBLqmUai/WcnkjSePK1jjLNE2KVJCoUwjzX/tz/qAqGDy9ka7BQaQufMO
Pi/vy0WwybtoTqWnQ9FOSiFRZG2TjJnha3t8jHP3PYWxUVoXEBF1Gb530wKuemgTXRs0aHQK3ufb
3SnnvXAgaNO1yCqlEJoIpXXXg6gdDdvRUroyAk03OefIBv5y1lYkYpE5PMLAwCVP/YP/fPAMzbEk
4UzeBd90GNMxBFm5fcziFUgawhU2CTZ5F+Yd7JcuHKDyVAoafkDmWGEH94VHKtic7mRa62i+tc8n
+MyeJ/b7tR5oiIjaxbtLOzjhF/NZvAQ3UKzkFu4mSUNtxU16OypcKQUaaPRjpHeIYwaPo7ClIJ2R
jBxuccP54zhxt+Gh1iRChL7EvXOe4sKn/+E268AT3l2tlndw9TEo05RzH4Kqj3l3KxqwRMY/PLt3
orxLAt9EySFKGTmMTPHQCjClhWWb7DduBleddBETho3pg6s6OBARNYpLbl7CFbesA2EgYt6G8Xmp
kFpp6T59YfIOO3Zv+pzDyvWOTC5CXCObtfjcEUn+/ZWJGPqWqV1v6MqyKWWzaK2FUoq17QrLdrQP
yzQCcw6c70u2CEU8ZoESxAzFyGYNXRdMHRmjMa4xoilW79Md0Djm5m+zpHM9cWEAQVqpl+z8Td71
qD4GSFF79bGAeVcOHvP61P3N+V65sgh25dQcz9gmSeBnR36ZM3c7rj8v94DBFk3UH6zo4PQ/LOaN
tzLQFEMI5d7gPrdwDaSbk+9Lk3dYYq1fOlb3ZQrnB1IKulI2u2wt+NWnR3Li7kNXu160Ls2T73Yw
f63FsvUS0zRIZzU+XJ2mMyNZuUkipSKdLVx3TRhUCr4rvUeUUICdf1I3JhS6BuOG6SRjGrts1Yim
ZTEMyZTRgu3Gxzh4eiNjW6Ocd4BvPXQlDyx5g4QWQ/iahr0RWsEm7wDTcQ+qj0H1KO+iXiDlMtWq
j5UcoEzGZ5IVLPj4krnPgZUCW1l0ZDr51HaH8rOjv8LIpqH7HPDDFkvU/3hsJV+7ZiVWp4ZIauTb
yQWgO0TdF/K9nY7Vm3K99QLh3e74r9OmQiqbK85o5ocfnxB6XQcaOjMWnWlFxhLc9upanp+b4cOV
kmwmQWdGsjmlyFiOv07TnN7Dhu68tOj5CP/CT9YbgeyFs610uyjahhOJq8BWrhXDVigUSil0XZCM
CZoTGk1JiCUybDtOcMY+wzhoeiMgaWnQSG5BcQTvr1nAqff+xL3PNR8S9jJhMJlVMB0H5Uv7DliN
qL1R3uWlT4vGkRXmnR9KBvvcfSYZkFnm2SH4JcR7DlJCp5lmuNHAbZ/6CbtOmNH7F3iAYgskasn3
blrCb29YB80JhC4DtegcukO60Pu+6VqrlYWR7U250P7rbo5jS0h1WXxkf4N/fXkiY4cNfC3PtC1e
nJdi5QZ4Y1GK/73ZztyVNlY2iaHrLgGTt+ZoWuF10emwBn5EXKmxS7UYAW999lIITzS+05dYuf93
oomVAilsDCPLrlN0ztinjbHDBOOHSw7YuqXeS96nyNomh1x/Hpulhe6+SHlQwpT+vFrudw5F1L6+
3aJxfCuQlXfzqhTlXSRa0adesbCJ37kF7xBwbj5y0s29lhbSsvjRgWfy9YM+1a3rONiwRRH1yo0Z
TvntfF563YQmDYHqNf9t6T51TceqQbbXfN0hgu26Xz+8eDt0phRTxlvc/s2t2GfrplDr0Z/oyJj8
4eG1LF2rM3eFxasLuujo0onpBglDQ9dB0wr9fp1nX0HzrdZdrfoa1WKxqLS90BlJuFH5CkcbVwiU
Etg2pEyFhUlbk83hM5oZ2Wpz0PYap+/dhlFjYaDBgJ88/U+ue/8ZmvVYESuWJyWXu5Jz/l0I1jgr
+KXBl6RzQ5enYxXlcAemYpWbvD2HyR8qrG/aJ8q7mjbtddeXzx9R9P7j5GNLKWnPdPGRaXtx7Scv
dVPmhi62GKJ+8p1NnHDFfDLtBiJJaGKE2oub9EU971rG7m2SrjrHXiTpSjLF29NZsDG55zuj+ege
9fVXbeyy2NipuPKhlTw626QjFWNNu2O+NnSNuJ4LUFSh2pxWui61rFGtY1fbv3ybt9WpVALTVlhS
kYjBiCaNttY0nzmwgU/tNYzmpKA5MfjN5G+s/IAT7vghIxvbvDpvpVreJZHSZTI1mbzLNWn/KHDy
ken+9ce98w6rSQcdqvhtokJLbHy16YqatPtXsYzbXrPTTDG1ZRSPfu6PtDYOXWvOFkHUd768hk/+
fDEYCYRRXYvOYTAGkIUdtzcD0sJExPeGf7t4DKUUli3IWFl+cnoLPz65f/3WlrR5+K0O3lxk8u+n
NrB0XQyBjiac4CxDd+YpfJq1VCPioHWodY1q3b9nmroqvIAo5zHrtDx1NG8lsmw70eaCo9vYagQc
NqMJCPc7GWhYtHE5x97yHfRYwumoVeL89Q9sLjeJ52UqRUpXVl8DSLogk3OZ+4qU5Ev7D1OhsElu
bpAnaeXOvRpJ5+UC/dLu/AOj2N0pKEXazDA60cw/PvZd9puyay9d5YGFIU/Ul966mJ/dsBaScYQW
nqRh4ASQ1SI7sEqF1iZTa7S4QiFtQVdWcu6xcf501gTifZzC9fL8dv7vuU7eXGTxzJwUhkiSjAl0
TeYDu4r7c9eyFr1h0u4fk7j/NvBq287/hHOdlEAqjVRWohsZjtk5yeRRNhcc08aUEYOvT/m3H/0z
9y14lUYjVj3KO0CbruSXDvbthilsUjB5ywokV6pNVwoeKz+y/0lUyBzzfOFftMUrp9we2cHzd180
gJS0SAqdXx3xJT61+7G9dZkHDIx6T6DvoPj+TYv4zS0bIRlH04OyTQP2VrWRes2zq2H8sLK1aN1h
j90bhF/L8WpZA4FA0xVNCY2rH8qybMMi7rlwaqiI+BqOzMZOm7tmbeAvD3awdJ1gQ6cibhi0NTTg
PKCcuXnn2D2NuLvrFFZbrmV9w27335ZT4xwXgK6BjiTWAEo18OTbirSl+O/MzYwanuXnp7ayz9SG
QWMan9Y6Dss2Ubrh+O/d0y2PAvfqQcr3g4+Mr/rk1bgryrgk5//IU559g4dRnvMq49ySvcvOrUIq
Fr1B0m7PewQkNIOssrnwsb/Raab5wj4fYyhhiGrUihOumMNDz2ehUSuKng25dzcDyLa0Npb9mdZV
zewqFXSmBbtOs3ji4qmMbO5p4Q7Js+93cdPzm7n2qXaQDei6Im5oaKJ3Tdq9sX9PteG+M4n7bXeD
0pTAko4LwwaaGtN878Qm9ts6zn7TBnbr03vfe5LvP3MNuh5Hq1hKM6D6mI/Z2KNNVygMAlSv5e11
mZfLuAVZel7YxMcvHSYVKzhRG2/wWABcm36x71259cI3dm3mm3ufwk+P/WpPL/OAwRAkasWpv/2A
u59IOSSt165dDZR0rJxsf1cXCyvXW77w3jDp5rZ1pAXbjM/y5q+2oTHePe3sn0+v4Y4X0zz6dhqd
OA1xDc19cgaZtQey2bqeJvHK21W+yQ2AlBrtGUUymeETeyc5dHs4c9/6BgoGYW3nek679yes6NxI
TNNDmbzLKnT52JCDiaxIJtBv69Wmu13YpFq+dLXCJhXM9WFM3qGI2hUoPZRyg8w2pzr48m7H8+sT
v9GLV71+GGJErTj+ijk8/EIWGpwHal/2jc7JQ99EhtcjFzrs/HojiruWY4VOJ1KCjrRixkSLF38y
jeFN4bw7G7tsbn5pPb+6p51VmwRK6iRjAiFk1Ujtvoy0Dr1/QN50T69BX869dF/lmmSV0ujKSgxd
MWWMxaUfb+aYHRtpiA+sFJwz7r6MWavnkzBiVWt5B5e3DqNN+0R5V9BGK2rT1fKlPZPoZr50wNw9
u1bRpqGabx2kK+AnJpViU2ozX9vjo/z8+PMZ7BhCPmrFqb/7gIefy0JT90m6Oz7C7kSG93xs5SNX
/Z0rrAZcWQiqVUerJcis9+CkQTUnBR8uN9j3kvm88cutaUoG3+bzV6e5d1YHF9+2Htt0ipAk8m1N
XW0hxDxrvdd6a//8OleIvwijyde6Lcz4ta6bcAlECElTwiHsJWvinPMPk7ZhK/nxx5r56G4NDG8c
GPXIm/U4Eln+qwvonFFO0j451WUelRIZFaAl5+Sk8vFfCy+LitJRi4fxmrx9Ibx/lPGuKN+hJBU7
YP69Q9Io0JRiWLKFv75+P1IpfnHC1xjMGFivqN2G45O++4kMNDmRt90lgO74pfviGOVjK++/Srgm
LoGTw+pU7ir9V7kyOTn/8Wqbnwq5vr0hU3uQk1NuszEhmLcyxv6XLWBjl1m23/pOkx/cuoqDLlvK
hddtRldJGuKKeJ6kvevVUzLrvfMLv4Zhx+5ucFtP5lYZzj6aBomYIBFXdHY2ct6/TY7//QZ+8cB6
Cppa/XDIpF1cblMlvKo8JB0cQKbKZQICsMCNS8tVNvEYQt3gK5cQbacILDL/r3RMwop8WlSeivPj
5b70zkkEzr30L3weJd4v/Em6/EiVA8gK61pJzFEkBC3JFv4y6z4uffjqWi/vgMKQMH1fdMMCfv9/
m6FFQwhV0UxZCf2RjlVrLrRShbdbKZ3cVKeOI4WoTAHC0EjEvL9fIQTprAQ7/0X+/0LTMDTnYege
Mb9Pb+VW915zju4GYEF7WvGRPeG/350GQMaUXHLnCm55zmTpOpvGuEHMyBUkgcj3HP7Y0DOTevi5
5wqrCExbkDYtpo2VXHBski8c1EK98rHb0x3sef15xHS9YF0K1RULfP3S3q/Jv4zk3sslIAS2kkgp
saQNLgnn5AxNJ6HHSp4DkLIySCVdsiZvhdF1HV1oaHk123npUEJUeGfozepjRXIVc6YLvvXgPtpQ
fDDlWsMUkMqmuPKor/K5vU+qx63SYwx6ov7ZnUu49Nq1kDAQWiE4pdY3+TBFO/z26b2gsIKZFQCh
YdugTAXKAl3S0qwzfXycSSMaaEqYJBIweZSBZQu2nxBn+rgGslZB09A0mL0oxcpNJlIKFq2xMC2d
tKkzb1Uni9aadGyWgA6agR7DaQBRRNq1n0f/BJCFH0NjcwrOPERw5kHD+OLfV7F2Y4xkrNDsoqJG
2oNCLgM3iKtn61/PCHblspZpQ9ZWbDMhwxWnDOPYnRrod8JWsP0/PovQDafwSUneMQQ1pSiJ4KY0
ChyUyhUGARtJxrSwbRMNGNs4jJGNw5k+ajJxQEcwoWkEQgi2ah3LtLbx2Mp2x1fEdYM3Vn7IpnQH
UkmWd6zHUoqUNPlw3WLWdG5kXaodiSJmxDF0g3wVc+FE53tJuqCZ+8TDFZ2fK1fV5O10yYMK2rQb
5V2dpKXrfy9o3UoppFKksin+/dHv8tGdDuvf+6QXMKiJ+vaXVvOpny6DpI7QIUd03fVN9386VuFN
WCqBLZVzw1sKNItxY+GsQ0ezw8Qkw5sV49pi7DalkYTR89CC9R1Z5q5Ms2itSSar8+LcTm55cT0b
NglQMdAFhubkvzpzd394IawV/UHCYY+Ts0qkTTClTYMRw9AlzutIz4mwXtqyYwWsX4WzgVB4RSkw
LY12M81Je+j84MQGdp/Uv2lde1/zBTqUxBB6mdrorymXm7yd3ZSjxSqJrSS2srFsiS5ttmoexce3
O5RpIybQEksyuXUM45pH0dbY2uP5b+jaxJKNq1jWvoYOK8MzC2bx/OLZLE9tRjMMYsLRuHWhuaSt
yqOty7TpMCVCC3JhC5uUafl+wwUEwSkUpmXTrMe5+ZM/Zs9JO/bujdDHGLRE/eQ7Gzny4nkgYggj
58OpnaS7s1/vpGM5fiXLBkyJloC2JthhK7jkExPZZVITDQnFiKb+q9q0rt0kYyrmrEhz6e3LmLdS
Y91mgZmV6DGdmF5sKu/eQziMTF+MkTdUCNd8FoKkoT6R3FXvrxAkXU9NveLce7h/+XVVgEZnRtKU
VHxsb4tffGIErYn+iZM95dbv8s6m1cSE5r7M+mjT/vVC8zJIhSltsnaW5ngjw+JJdmgZzzcO/DQT
W0fToMdoSTb3y/kAbOzaTJed5bUl7/D/XrqD9Vaa1V2bsLFI6HF0TS/EJ1SL8q5Y4tSVq5iK5chJ
N4y9sli5Nl0MJRUZ26TNSPD6168jGUv225r2FIOSqJeuTzHpK++AFUfECiTdHZN3bt/+KhXqBHUI
bBNIZZk2Pc6ukxN88oAmPnvwGOrlbwvCDc+u4r8z08xelOH9hVmIN5CMKbcto2NaKwS79EU/av/t
3SvQURTF3Ycm7Z7uH+r8K8y/r4m4Xj77StdVKedhnrFgWEuGX5/WxCf26vt64n+feTe/evV2GvV4
fl7+Vu6ioC23ip0EUmaGTDbNfhN3YHLLKE7f/ggOnrZnn865ZijJX1+8nbfWLeLlZXNYuHkVTckm
4pqBKMqDLz7zsIVNwvqlZU9IuuiCKKXosjLsNnIKD5x1JTFjYGQQVMMgJGrJnt99h9fnKEgUbpKe
aNP90cYSHNO2sgTYGU46sImT9xnOR/duYUzrwO+rvLYjy6OzO7n5hQ3c/1oaVJy4odA1kdck+rMA
Sl9vH6wBZD3dv2+ItPfmFmbdLanRkcly/O5w+ceb2WFc32lOc9Ys5IRbv0cy0eA26KhQx9vlaVtJ
stLGMjN8fufj2HfC9nxk2wMw9IFPGvPXLeHV5e9z81uP8OLy94nHEo55XNMoK5JSpbBJZZN37cFj
vnnfPhdEKdiU6eTj2+zHdZ+6rN5LGgqDjqjP++d8rr5nMzRoHpLuljZdxYTou0tNx3K1ZyUgaxNv
hFP3T3DJKRPZcVISMQiz45SSzFud5Yp7VnDXSxk2d2jEYhqG3nsFUHpCJDmZehN9f5l+a1mfgUKk
fe+7dh7aHRlobczy41NifPHAYfSVdv3bF27i9zPvZkTSabOohPAQtRsuhalsLNumLd7AJ6YfzGd3
O56pw/u361tvIW2mmb9+GT9+7B/MXr+EjmyKhngCHYEUohcablRpGJIX8+Z9+x7Sh6iVgI1d7fzj
xG9z+h7H1Xs5q2JQEfW1T67ki79cCi0JimttdEub7iZJQzjfdM7ELdOStpFw8n6N/P5zWzG8H33O
fY1U1uTcfy3jkdkZVq6GZKOBljeJ1752PfX7hpHpDTLo6fhB+w+ECmf1fMHo3bk7j2zThrSp2HdG
hv935nC2Gd03v79vPfwH7pz7PI2JJvTiThY4UdsdmS5mDJ/IiVP35rsHfqY42GPQY/HGlfz0yX/x
zJK32WylaYwlS0zixQhZy9utoBbcR7tILleCloqu8PwHiUAohaUkSMn9Z/ySPSZtX+9lrIhBQ9Tz
V3Wx7TfmIM0YwvD6RaH2vOm+S8dSTr6zKSCb5kefG81nDhnOjhP7LxikvzF3VRfXP72R39y/CTMb
Jxl3TOKl/uv+Sceqnzbel2blvt4eZm7Q/eC4vtTkg/fPuWQglRU0NWa47JQ4Zx8wjL7ANbPu43cv
/ocOZaNrBgIwbZMRsQYu2v90TplxKMN6IVJ7oOKNZe/z91n3ces7T9CUbCGu6f7+62p+aRTIKiRd
mi9NoPLuyX2TJU/8tJVlTKyFl877O42JgdsIZtAQ9c4XvsU7HyqIe/3S0D2S7qt9rKwCKTlkD4O/
nD2Z3aY01Xvp+g0rN2b46jVLeeB1Gyk1t1Z2uAI0vaFxVdoe9hhDJRq6t8fuq2P353bLFqRNm/22
M7nv6yN7uR2qg1Xt60hLk6fmv8rmTCdHTd+fUclWxjSP6PVjDVTMXb2Qz9/1cxZ1bSCmOylexVFl
VaO8pcg19+pWKlZ+OxRp0j711nEiwTdnujh/z5O44vjz6r10gRgURP39mxbwm5s2QrPhucD9lY5V
eZ+cv0UhOyVTpmp87+MjOP/Y8fVeNl+Y0mJl1zomNY/ts2M8+d5Gvvz31cxbAg2NOkL0fcpWT1O6
BrT/VoESqmpt9cFaeKW/guOU+1vtyii2GW/y+zMbOXCAt9McrFBK8dcXbuNPM+9ls5WiyUiQ06ar
5ku77TcrlghV/t2z8ijJW/fVunPKO5LOTIp/f+y7fHznw+u9dL4Y8EQ9a347+/xgHtLSEbp3qfsz
bzo4LURg2wpMm9OOaOLf506mOTlwozdnrX6Pi2ddy+4jtmVy81ia9BhTm0dz6MS9e/U4HWmTS+9Y
xR/u6yAWixE3CtHh4de3d7aHHaP/04pq2L9KOtZgjjLv3wA05RZK0UnbaS4+2eDCo9uI0DeYs3oB
v3zmRv47/xWaE43o6NW16aokDQgZwuTtjFmJpJ2ULbCUjWaZzPnWzTQlB54VdIATtWLqeW+yaJnm
MXnnt3ZTM+6ddCznB29nQCRMHr90CkfsNLzeC1YVzy6fxY9m/R9Z23Zr/1o0GUmmtU6kRdc5bqs9
OWbS/iT03gm6eeLdjZzx5xWs2RinMVHc8KKwttD3JutK3b6GHhnVNvZAfYEJY3Lv7rk5wZ4a7RmL
j+1jc81Zw53qYhH6BP9+7X5+8vT1ZJE0GHFfpQc3AFdVNXk7LCv9Xl19ktjL5HzCw5WSdFkZPrHt
QVx96g/qvVxlGNBE/fM7F/PjazZAkxhwJG1LgUrZHLJnjJu+MZXJowZHlZsXVr7JxTNvRCqHuJR7
jpZ0iFsTOpqQ7N42mdOnH8XWLeOY0DymR8dMmzaf+vNC7n9Z0pDU0TTllPDshwIp9Q4g6+n+PSXC
Ps8X76PCK/2VhgeCzoxgpykZrvpcMzv1Yc71lo4P1yzi3P/9ntlrFtIcbyi6tpKcUzpQm84Fj7md
yYKqj5WWgyvTpn1zuJwvbaVIZTP88yMXcsquR9Z7uTwYsET9xoLN7PvD+ZhZDaGXk3R3G2/01OSt
lEPSpLL88LMj+MUZk+u9VDXh5ZVv8YOZNyBVzudZ6ASg3IoMNgrLVmTsNKMSDRw3cW+Omrg7u4/u
WQrDb/+3gu9du5FEMhEq7xr6RyPsibY9cPKalc/2Sn3KqxeoqRqAJqr3JO8rK0RvjJ/3XStFxtQx
4l3c8OVGDp8x8EyfQwVKSb5896+4/f1nGd7Y6jYzCdFwo6Qeqa9v2qe4eplcQORZrnlIVplslRzO
i+f+Y0BVLdMvv/zyy+s9CT+cddUC5s6zIa6VBZBBN9pY5ms910bupXWFbUuAmeam703i2x8ZmAFj
lfDK6nd4YfUHCJErGJP7FwTug00JdAEJPYapFK+vX8gTy2fz/Mo32HXEFNoS3UsxOWhGC7ttbXD/
zHa6Mk7t8DAkVe1h3iOSpmfRzkC351dpbO/8C0TrfZAJNM15ujmaQ/H19P4rSj7nagioXKe0ojGr
nVu9I9h7On7p2gsh0DWJtOPc8mqGSaNsdp4w8KsFDkYIIfjYDoeAZfLy8vdRSHQ0pAjQkHNQXpL2
lS3p8BVYTrSMuZ3fjxCgC40lm9cxzIiz35Rd6r1chXUbiBr1A7PW8ZEfLnAKm5SQdE/qefckb1op
hZ3VaGo2uf2iiZyw+8h6L1O38Kc3b+aWhS+T0GO+6yilW+OnqCwoOLezaZtoQrDn8El8c9fT2Lat
e9aE1xZs5tN/Xs28FRpNyVwUaO1Wk4GS9tM721XJNmdNcucvlVMkwpYK03ba9qmi66QJSSImkEU/
ZyFyRASprHIr4Tn/F2gYuuZ2SBNul7RCvql37YvnFk4T7+so877QxnPWss6szfc/pvjesQM/5mQw
4/53nuYbD/0ZSwhinpzrIpQUDfcl6QC/tEeugsnbYx6XCguFoeCpL/6ZaSMn1nuZnPMYaEStlGS7
b77N3EUaIu61U/QkyrsnbSyVUtgZxYgRikcvncqeU1vqvUzdxp/fvIVbFr1EXCsnaifrQQVEZ+ca
sUtMKTHNNCdM2pMv7nAi01prv5k3p0xO/PUSnp8DzcnyiPCealXVttevCIfP/qrggpO5etC2Q6lS
2Uhh0tqgGDtMZ/Iogz0mNTGyyUDoFjFdIiW0NQtaGwTS59esCVjXoejMOH9nTQ2BwaJ1GeauTrNo
rWT5BpuMKRAqjoaOYQg0DTQhXUtL7oWqel78QE7nqj6GQ9YpU/GZg21+9YlWEnoUZNZXeHzuy3z5
v78jo6TT5KP0mhQFj1WL3i7aoTaTNx6OR+E07jhk/PbcfdZv671EwAAk6p/fsZgfX7cBkr0TQNad
/cpIOgW7b6dx9/emMHX04M67/NPsm7llgb9G7ZTNrVbbzzGWSgldVpqR8SY+tfVBfGnHj9U8l46M
yWE/XcyseRrNyULp0d5Kt6p3JHalTk+4pmrLVtjK+T5haCTiJoZuccgOcY7bpZldJjShaTbNSWhO
aAxr1EjGeq+FY8q02dhl056WpLIC04LXF3dx16xOPlghMbMNZExBxlJowtG+Y5pA03Pn6JxLLesG
PYvk7o+cfITGxi7BCXumuPbs4RFZ9yEWrlvKsTdcRLs0SRrxEi24SvUxn8bYtQSQ5SPCS2SkkmTN
LLeddhmHTe/d1NXuYIARtWL4WbPZuFlAif+yv6qQFR9HKYVtwo5TBK/+egaN8f7pcduXeHHVbH70
6o1IQCta33yshqhYAj8vLMl1KrLI2hYzWsfwi33PYUprbU0GNqWynPjrZbzwnqK5wdHcesW3rIFG
93ygvVGJq3T/XISxVIJ0VmEqi7ZG2GFigqYGiz2maHzuoGHsML7BLQrRNw0kwkPl5/Hk++3cNbOL
Bath/WaN91fZZLIaCUMnkc+PLzxG6lUBLYxMLWMot/To1PGdPPTNkQxriMi6r7B4/XI++p8fsCbT
SdKIFVUWq1B9DMoabvj6pX3Va7zjlsooRaeV5dgpu/OfM35a9+7DA4qof3nXEn70r7XQYJQpdf2f
jqWwMoJhwyzm/GEG44YPjbQNJz3rpqKobweyBpJW4OY6uoEYCjLSIiE0Ltzl45y89eE1zakrY3LI
Txcza56g2V3mgeM7rm2790XP+SyVIGsJukyTlsYsnzmgje3H6+w4WXDMjm01rVW9YSmbu2e1s3Sd
zksfZvjf7BTKStIQ0zF0hZHL0BCq7JHZH9eldwvjOC8rXVmNiaO7eOhbwxndPPhf1gcq3l0xj6Nv
uhBNjxEXeg1dsQoS1U3ePlp3wAGkUmzu2sxDn/8tB0zdra5rM2CIetXGDPv88AOWrAARq18Fspy8
ZSoSSZvnfz6VvaYNnUL6hTxqkdeopatO+wV1lSHffc4b1qGUk4eYsdMcNmYHrjz4GzXNa2NXlhN+
tYxX5kJzQ/A8BrK2nd8mNEwJWUuRMEA3TE7eW+erR4xmeLNg+pihEVEsleSDlSbrOyW/fXgDr34o
MM0EtpTEdA1dI0/YYfzaQesadntf1ZNXSpHKaowY3snz3x9BW0NE1n2FJ+a+wpf++1tMpYiJCtHg
YWp5+0ae+WjoAfqJUpKsstiueRxPn/f3uq7LgOm1dvcrG1iy0AKjnKS7ZQYMTMirDssGlMmt35ow
pEgaQMqcj9T97PpHq5K0ooikC7nXOTgpLoIGvYGnVs3hc49dwfKO1aHn1dYY5+ovjSaRMMlaQXnB
4e6FwIexe09oPbzty9spOnNTCLKWzrpOk7FtisN2htu+1cSqq6ZyzTmT2Gfr5JAhaXBeSLYfn+DA
6Q3c/bXxLLpyHFd+VnDADEVzg83GLolpaigVzqoVNp2qO+jJvSMENMQV6zY0cfSVG1jTYfXD6m6Z
OHLbfbny6PPoyqawAZQKfioVkXTZEykgPFxBKJLOPRMNYTB74xJeXfh2XddlgGjUisQZM8lmkqDL
Mt90tyO9u5GOBRqyPcsNP5zA5w7tWUWugYiXVr7FD1673uUszfVDhjN5F5q4V5CXzs8hZZuMTjTx
y33PZrfR24We372zNvDJ368hocfRa6ztHsr0WeWeqLXAiFJOSpRpaXSZaY7eNcExO8f5zEGtTBg2
dEi5Vry3MsV9b6S5b1aGNxcKmuJOkRtN4GrZtQWg9UeqXvU5QDqrM2pEJ09cNJyRTZFm3Ve47OGr
+fOs+xiWbC6/JmFqeQeYvD3lRANt6oUBpFKkLZM9R0/j4XP+VLf1GBAFT67871IefDYDCf8gmu5U
IOtuOpZMKS47eyTfPHHwFTMJgxGJVu5e9CIZaSKU5gYCQVVtGscvDeW+x1I5IQSG0NhsZXh82Uy2
HzaBrUJ269p+fAOjWi3ueSlNLF5ewD/wmrrHrqqVie4/rAvjOzWJTduJhlbC5JjdFdd+eRwXnjCM
Q7drpiW5ZT/ERzfHOHh6A6fuleDoHeN8sHYTKzdqZE0NTThBg8WE3RNtujcyAMI8LzRNw9BhY0eM
+97q4NS94jTGB4xRckjhiOl7887yD3h33RLielHaVknOtPPRp5Y3+BC1TzR4cIUV50mnHEvhqo4N
7DhiEtuOrk8lygFxl1314HpIaGVpQd3VpqE2cs8ZFew0HLZ3jMtPG5okDdBoNDg1vmVOM67iI3BF
pPC91cvkclq3EoKEppOWku++9C9mrno39BzPP3os556YpDOj8tem4r3g5j6G8T9W2l6tylnu/6al
sSllM36E4qzDFR/8biJ3XzCF/ac3kDCiyOBiDG+Mcdj2SR65cAIzf9rCkbtlGNZkszklkVIL7Teu
tr3adav2PAj7vBBC0RiHpWsa+fQ/NyKVXbe1Heq48fSfsE3rWLLSKtwHnupjqpykPTI5yKL/er4K
gPQ8GYXQSEmL/77/Qt3Wou5EfcsLq1iwEicdq+j7bvumuwkpBUaDxQ1fmzwQlqXPoJCo3F0aJngM
h6QdSRU0aH68gmvIMRXGhI6J4DsvX8Pzy98IPc9ff3os24yzyZjV7wWFY9Kuhmom7Uqr5vxXZ0Mn
tDZnuOwTDbz8kzFcffYkJgzvnU5jQxuCiW0JbvvqOO6/sJlzjxHYIk1HWsOWOUL1v7966rvuiW8b
Su8P4ZK1ZPb8Rj73702kzIis+wp/OfFbSMtCOo2jvR2vghQGH/XaYwcMrEFatFGJXGYYAmiKJfm/
tx5n4brldVmHujPSrc+1QwbfRet2qdCa9lNOQJWU3HbRRCaPaqj3kvQxBLGwUQmqmIMDHDo+XxfL
CiGIaRpdls3PZt4cepatyRi3f2ssprSQIYKRqvmdu6dROWdv2YK0KbBVmr+e08ALl03gxyePpq0x
IujuYProJL/+5AheuGQ45x1nYSuTdFYgZc73X7BehEml6u72sDJQen8492NzUvHwG3Euu39zvZd0
yGLfKTtz2aFnsbmrI1+XvkC++Ju88X5ZlooFASRdROplzzSQusb/3nu2LutQV6J+e0k797y8CRLl
jTd6QtLh93V8jXTBV09o4pR9RtVzOfoNmnA7ZVXzS6tcvnSFqIuir1XxjsUR4coh601mmnfWfRh6
nrtPbuGHJzfSmZYEWUDDPqxrfXlz+hUL2lMSXbP55IGKOb/binOPHMmkEVtukFhvYutRCX5xyihe
+Ukr+26XwVI2qaxAqfAtUHuyvZa8av+xFa0NguueinPl45vqvZxDFucd8AmOnrobXWYm75VWVRWG
ohc+wvili/KrVblITqv+6yt3I2VFu3mfoK5E/fAbm6HDyCe2examVqJ2h6jNNw3SFowar7jy85Pq
uRT9BiEEIxNNLvFVMGWrQvBYRZL27lLuw863kHVeDpa2h0/ZAvjxKWPZa7oibQb7KysGmIlwD+vi
nZQSWLZgQ2eWU/eL8eAPR3LDVyYxoS3SoPsCk9oS/PeCsdx4boLdp5lsTttOK9k+1qahp0TumMGb
44LfPSC4+82Oei/lkMVPjjyHZiOOLW18g8IqNNzwfBWIIs3b73EnBLoQrDPTPDn31X4//7oR9aYu
i1/fswoa9d7Rpql9P6UAy+IXnx5NU2Lg9B7tazQbSWSRIcm7KORJumLwWNGPo2KWQyEig6y0eG/D
oprmmowZXPnZUYBV1nAilO+6yoMYih/WCltCZwZam7PcceFwbvn6ePbburmPrkSEYhy9QzMPfHsE
f/q8TlZlSGdzTUpqfEELsb03iNwZCDRdkdRinHedzUsLU/VexiGJncZvy/cOOJ12M+XpEAdU0COq
Vx/LSeY3VyBzIQS2tLnyuf/0+/nXjahXbsyyZq0OWsGMEDZCsxT5iN0ac6aVJThm3wRfPmpcvZah
Ltht5HT3zdRvYcDHRRMo5/0z2CQkcHq9rs921jzfw7Yfxsf3jZG1RJlW3V3fdWkVKqWU4ydVki8e
KVjw+6l8Yu/hvbDaEWqBoemcdUAb714xnOP2MOnISCxL81z33qjnDdWJvBqKMwUMXZLQ4pzz7y4W
bsjWexmHJM494FS2aRqDqWzyvjDfR06ux7QnQLxC8JgbPV4lCUYgiOkG8zatZvmG2iyDPUXdiPrC
6xc4hy+JPO5phGYYKJz6y1hZrjpnYPQb7U/sOHwKtpLlpiCVL0DmvosG1dYr/FmQ8Aml9InSTMnu
Rche8+XxJOOmYxLNTbSSiz2ExpS716SCTV0wZazFHd8ezt/OnkjMqHuc5RaN0S1xbvjiKH55uqCt
JUtHWuRrp/c0G6THFe58xxDEDMmm9ia+8X+dVLGzRugOhMYVx3yFjlTJy75PRJksfUWvGI4jqkSC
F6ALjeXta7nr7Sf69dTr9jR65h0LtN750dW+E5CFb582gm3HbXlmzUktE7GV6bsuSuSrdxN41xbl
SzsIIGm8H3VNY0XHOjq6oVW3JmP86sxWOrukE2yECixeEia3NvcQzlqwsdPkeycbvPzTiRy789Aq
GTvY8dVD23jmh8M4bg+LjozTK7onmnAYq13Y3O7SMYQQJOM2L32Q4JJ7o+CyvsDx2x3ASdP3I2Vl
UH7N10ufW1XypT17VKUiiVKKWCzO22sW9+t514Wo73ttDR0dynP0nrwp19p4Q0qNeKPF+ceOrsfp
1x9CYuRvz4IJqRA8VrlEaM40Dr6l8Mt4OydrCJ0PNy3jzbXhI7+LceYBwxkz0sKyRdW86eoNGqA9
pWhrsrnh68P45WnjadmC4hQGE0Y2xfjPl0fw6zMVmm6RzkIlPu7rvOpKYwghaG2Afzyhc/VzUdpW
r0MIztv74wj3Zb20sIkqLnAcIhVLUsiXroxcrqogacS5992neW/F/H477boQ9X9ntoNJWVRnd0uF
1oy0zdePb2P6uMZ6nH7dERcGCc3wGOcCo7YpESr6sygBq1xGlMoqhFCkpcWGTHu35j2sMcZFJw2j
K2Pl3iq6AccftSkl2X+GYuYV4/jcgSP6Ypkj9CoEXzpoOA98p4kJo9J0pAsNZXLorUjwHs9UKJrj
Br+4T/L2iii4rLdxyPS92H3UVLLSLrKglKRiVY1wLQrGqQo3gtw1N2oIurCZt2FZv51zvxN11rJ4
c2EGjELudE9+QLWWCpVK0DJC48KPDr2GG2ExLN7Ejm1TsXL+4uou37xc1QoDPtlZnr+ERoeV6fbc
v3JEGztO1jFt/1+Y8kuCLJqDZQs2ddmcebDG0z/eijGtUU70YMLO45M8+p0RnLS3SUda5WMWeivv
OgzZV4UCXVcou4ELbkkR+at7H7867jyUbRfFa/s8eKqQtKoo55V33G0F0bge54ZX/9dv59vvRP3k
O5t55Z1OMFxPaA8ivbsFU3HELgYTRwz1CmTBMPQYu47c2ome9EQ6VnDoyNI/fUIkfXYvlhA4N/ij
i18JjjqvgrbGOMfsppO1yu+B4n7QfjPJmAKExU8+leDGc7dC1L8wX4RuYESjwXVfGMGln1B0mSaW
7VzH3ozirjRGWP91MiaZs7iBr/zfhnov2ZDDbhNmsM/obcgq6fpBBOHKkBRkw3VCdhodOF0G3a8E
xDSdZ5a+3W/vYP3+pFq7WYLpFPbOvb1212dUs29aAXHF5Z8cuk03wmKrljFI2+mr6/SYrhD2WLTJ
K1Xd5F0YwDEzxYTOG2vns6mb5m+A35wxDl03ncj9kl9K+T3haFtdGUFrk82DPxzFpSdH13/wQ/DN
I9v429kxsqQxLa1Iu/JHbVHctY9RKuPUBBc8+EaCZz7sqveCDSlomsY3DvoUmzs3eZ9LFUNscn5p
58/qvmmFku5wnnKijuXGEop3V87rn/Ptl6MU4X+zNkJMzy9af9Tzzr9NWzr7TBfsMS2K7G3W4+ii
VAmukIpVVsu7RMa/IJlXVjn1ybIIOq10t+ce1w3OOixBVwbHb1Rk+iydmFKCrqxg/MgMz102loOm
t9RlvSP0DU7bq5V7v9nEsJYMmayWvx+KEdac3ft1wwVCSHR0vvGfLKvaTSL0Ho6cvjf7TdiOjKtw
5H3TVVtXBlQfC5D3u+wC59l59Qt39su59itRd6Qtbnl+Axi11l4uoHu1m9233JTJFWdseXnTfhiR
aKFRT+Tao1MtFQuK86tLqp1UJOmiXC5XJq7HuWfe0z2a/xWnjWXauCwdaYesC/dEzqfk1upOKyaN
yvDWL6eyzZgt190xlLH/1EbuuaCZ6RPTdGa8EeG19Jquhu5UMhNCENMlazck+dG93bciRShHzIhx
8KRdSJtZClHZfiiqDhGapCVKikA5IQS60Ji7sX+6afUrUaezErVZB61/A8iEcGo3x0fY7Dply4z0
LsXOI6YzrXU8trSChZTfn5WDNry87RNZKcDQNJ5Z8XaP5j+qJc79F01kh8kmm7osTNtplyilwJaC
jKWxsdPkuN3h1Z9NpTlp1HfBI/QpZoxJ8vh3hrPXNlk6M94Kdv3ZLtcXAhoSiv++luSRObXXEIgQ
jE/uchSjG4c5jTKq1DEOFzxW2KWaqCY0NpopMtnuB8eGRb8S9TPvbQK9+2bv7pK7EAIyNuceO4qx
w6IoX4BkLMH4xjanQlnoWt4hAnIoJumyLxEIdAQbzSwps2epK9tPaOCFy6Zw49dGMXVsF5ZKY6oM
Nmn2387krotG87/vTGJ4U0TSWwJims7t57Wy/3Ym7WkR2lxdDT1tlync5h0NMcEP77DYnLaI0DvY
beIMpjSPxLQrB6dWzNbykVYhhA1NY9GGlTw454U+P89+Jeq/PbIKdOfsuxtAVqs2rWmaE0Sm2+w1
LSLpYjhdtGT5w6ooJNIbHRm26k/JACXQhMYms4tb3n+0x+fQkjT47MGtvPLTbVj0p6ks/NNUFv1x
Gg9/bzKn7N1C2J9mhKGB5kSMO88fxj6uZl3p+tcaxV1JplK0uCMEMV2xakOCnz0QBZb1Jj6xw2HY
KqjNUFH1sVBh4UW1v6tICqXRkU3x3uraGg11B/1K1HOWSae8dz8EkBVDWoqdt27gM4duGf2mw+LI
iXsQ12Pe2zsweKxE8/apPlbwYZcN4IUQ2Erx2rrei5hsjOuMaokxusVgZItBTNfrsqYR6o+YpnPH
14Z5NOsg1BLF3VNomkZDTHD9c4LXlkSFUHoLX9r/FOx8TnUxSqqPQfWcaeW4z6pSjVuuQTd02s2+
f/HqR6JWWLZRc8/oYnTb12Qrthqp0EWUN1uMPUbvQFzTvTd4SZxY2ZfF8HVV+w7ggQLimsH7m5ax
tH1FvZchwhBEU9zg9vNa2XfbTJnPGnpuzq4FxeMITdKoJfjRXWkImfkboTI0obFtyxhspUoqlRWi
vIEQJF2oPlYVrsM7psd4del7mFbfRvT3G3M9/e5G1rdb3bJEducHk9tHuZnqx+7W1F+nOqgwzIiV
93d1EeiXVhU/Fr704fecrKbByq6NvLr6g3ovQYQhioRucMtXW9lvO5NUVisj697oR11rX2uBIB6z
eWdxA797PKoF3hvQNI2z9voIGbuYLIsKIodNxVKCsDyde8AZmsFbK+exeEPfKhz9RtT3vrqRbIeN
0Gs7ZHfSsYp9RlKBiCu+/ZEJ/XWqgwpHT9zT8e8olX/Bz5mxC59KTN4lKVuFn0TRAD4/jmJZISGh
J5i55v16L0GEIYyWhMFd57UwYVSGrKmFrmhYi8bdnfzrpAHXPqOxMR3lVvcGdhw7DZnXalXhaRSy
lreqFDTuFXUaGKHyzsAN6U42pDr69Pz6jajXddhACNu/D3piflJK0BDP9uepDiocN3l/N6DM/cJj
KQq4y4XfR1dWiYqadLF5PK4bPLbkDZZ3rKn3MkQYwjA0g7+fnaSxOYVl6zVrwb0tI4RA12D95ji/
eyQKLOsNjG4cxvB4E1IVgsHCFTYpmMhD0Yxr8lYCEG7AmaEj+7iWaL+xVzpjgFYj4Xan1XTRG3NO
Szx4+6jQRRBa4400alq+ZVwh5qJ6LW/fftQBP4zC1zIvriEw0Xhh+ex6L0OEIY69JzXy97Ma6LTS
SKmFiuKuhJ7KCKFoSghuegHeWtH9Kn0RHOw8YVsOmbobWbdKGTK8yRtZCy8VBnYqoSkMI8bc1X3b
n7ofNWqLWtVpharad9j3pIp/HLbis4dE0d5BGNMwnCMn7E7WtvJBZb51v0sCMryE7m4IeLEqxIvn
SNp1BLnFT65+9/56L0OELQBHbNvEnz4TJ23byPB20TL0TpCZQBMSaTbwx8ciou4NTBo2BktaTpQ3
hPNL+9TyDhDNP8jy47uI6wbPL3yjTxt09AtRL9+Q5oPlqXwOdSi4b0PVs9mKdin5ASkEYLHr5CiQ
LAhCaOw7ZkcydtYpxRnUXcPn7dTTj7pK8Fhx43VP8ROhsdmyeHP1nHovRYQtAJ/dr5mvHydpT+Nb
FzwseiMaXAhIxCX/mxVndtS3uscY29iGynfTCoMaTd7CP1Pb0AzeXrWArN138Qb9QtRrNpus3GjV
ZPpW9KAKWW4MBSJuE49F/WArYVrLGNriDUg/c3dALe/Sv6qavJXCL6RSALaS3PDB4/VehghbCC45
oZXdtk6RzoqyZ3pfpGQFw3kxTsYMfnp/pFX3FNuMmEBCj4eqKla5Nni5aO4Pv0IomoC1XZu73bo3
DPqFqDvSEjMtQ6dm5aO2a9Smvf4ghZKCrUbGaG2ISkhWwnYjpjFj2EQsvxstQEsWVaqPhRkHnBcr
Q4vx+tr5zFm/oN5LEWGLgMY/P99CU3PK6WXtsnWYCmNhfdNhMlVyY8V0xexFCZ78MKoD3hPsPWkn
2pLNbkBZJUiQymmTW41i8o+5oDEFQgm6zAxW1eN2H/1C1Js6JWRVnxVzDHx7tRR7bJ1k/PCIqKth
Rus4pLK8GobPG6e3PllZg2rPrvlKZUH1xF05XROsSXfw7PK36r0MEbYQTBuZ4P99JkFWOn3Ne6sA
Si0knZPRNEU6o3Pd8zZ96ugc4hjTOpIRDS2BdSEcOHlY0nXBheIkId3nmY/q6I5h69Rgcq8d/ULU
Wff+C+UK6ObJ+v4wbMVe05rRRFROshrOnHEMLbEmb5pBoAmp5M2xYpS3v8nbIycFTbEk1773EJsz
fZuPGCFCDsfu0MxH9zbpyjqfe6NndTWZILmGuODBNwWzlvR9J6ahDK1akKAkr0mH6HRJoVZ4Zfuu
VNQcLF3TefXZyEVw7svwh6qltm7wW64AZdMQi7TpMJjYPJa2WBxbOaX0Skt7l9XyVqJMxivnfqrQ
6lqSsygpNKDdtrnnw2fqvRQRtiBcfeYIdpmaJmMZVNNme7MueLGcQICQNGhJ/vREquo8IgSjKZZw
wmECGnSE1qSL8qVlKCesIG323UtW/2jUpgZKq7o6PWpj6T8isXjfOfiHGk7f+lCytlkWjBHYY7qq
Jh0c1eEJSBMKIaDRiPOvDx4mY0VaRYT+gSY0/vrZJnQjgy016kWSAkjEJE+/F2PF5qhaWXcxqWWU
Q9Jll7HwXSiGyUd5h+iiBZjS5I2lfVdlsV+IuhbqrbVUaLXWcn3oNhhyOHbyfig769uDpqzHdFWE
MHl7Ork7qVrtpskfX7+13ksRYQvCtqOTfOFQRVfWdlO2vOitSPDKYzk9q5FxfnBPFFTWXVjS9nGf
utXHamy4EQpuyqmSis5s36XYDZi6mr2tTSsFGIoJwwfMKQ54DE8O48CxO5CVhaAWb83v4CjvQqVv
N3isQgBk/negvIELTgS4zhMr3qYjG/mqI/QfLj9pGLtMNclaoqy6YS0R3NVkKo0lBBgavD4/yeZM
pFV3B/tN2hldK4lJUk4GUOha3gqUUI6ZvBJyEeE4A/dld8YBxWK1atNVoUMiNqBOccDjhEn7krHS
HkuEKCbpgJZxnvrgJYVNSuUcbdq/EK+haSzr2sB17z5U76WIsEVB8MtTE3SaWbdQUuEH0JvtMCvL
CXRNsXoT/O2ZKK+6O2htaCrxTyvXZx2y+lhJYRNRSbaiQO9iQLBYmLfRUnkIEbgRmb5rxsETdmW7
tglYyvbvoBXQFYvc18UlQn3g27e6CAJojjXyn7lPsWhz1Ks6Qv9h78mNfP4QRVfGKYRSy3OpNzRu
V5KmhMFT78GGlFXvJRl0kLLYlFdo0BG++lihPkTVXh79RNIwAIi6uybvWog9Qni0JVvZZfgUsrbt
ptQVhW0H5FVDcZvLYE1a4irRskKunhIIBWkp+f2syFcdoX/x7aMbGTEsg2WHS+nsrfzrYrmYrnh9
ocGbSyOi7hEUKBnSL51/OIWI8lblO/e1Pjgg2K5XA8gi9Bhnb3ccCV13O666CKjlDUUasgq+Lvng
sSqd3JVro4rrBk+tfJeXV7xd7+WIsAVh8vA4FxytkbYswqpMvdUOsyCnaIzF+OdzaaJUre7CCR4L
Gz9W3O4yhFjRoM6HIU3UvZ+OFaE3MKl1POOSLVjKLgr8onrDjWrmoEKot/9mVRhCE6BrBn944456
L0eELQxfPaSZKWMsbCkqxsL0ldIgBMR0yWNvG6StvitLORSh5QK6VA3W6VzONCECzspIWvWLFbzu
GnWt2nRNJu/oZbTb+PFen8WSVkUCztf8lpVTsaTnP5W16eLbIaEZvLNxGX978656L0eELQoaFx6n
k7VlWWBZDrVUIQvzzPK+EDipWkk9wZVPbK73YgwqZKwsIhdOFtbk7bakrp1wQ0SG9xLqRtT9YsK2
YfWmqOBJdzCjbTJbN43CtG3fuzfvua4Q4Z2TcyRyTVkqmLzJDeiM7hRBaeC69x9jXdeGei9JhC0I
p+/VxK7TMliWHvi+HzYdqxpycp5qZUKgC8Uz70WVFWvBzKXvYUv3JSrUHsoNIAvhl/ZUWZQeku7r
oOX+KSFa+jnk26jfPrXJanRlI7W6O2iKN/LpbY+i00qV3YSy+K8Qr6GFxjP+glIWa9PFAwo0DbJK
ceGz/6/eSxJhi4LGD05IsimbAaV5Un56Oxo8SM7QYcnaGM/M66r3YgwadGZT4VVjt3xxKK3YM6Ys
60UkUNiDvXuW5uOX7E4971r20TSn2pVlRf7s7uLQCbswqXEElipYJXzzpQNQqOUtA5MYc/e2yOd2
eeUEgqQW440Ny7hm9r31XpIIWxAOm57k8O1tsmbfvuwHPdd0AZtS8Oh7UfR3WGxMd1W03OXhknQu
/rVivrTnsVR4Ahbp0+i6wfZjpvbZefULUSfiCoTl5jX3YwCZ0KLOWT3AqIYRfGTy3ljSyr/5518s
VfUSofm/Kld5rZzj6O6e0GL87d2HmLt+Ub2XJcIWA41P7qNjCzuf0VCrObtHEIoGQ+f5DwQd2ciF
FwZrU+1O9bdKQnmuDVHLu0w7L48MV8op1LTV8HF9dl79QtS5HPT8+vRXOpau8cIHm7BlFDnZXXxx
x5MYlWguMetUDqn0ZGFVE/T/4BlICYEmNKQQfPvZv0WtMCP0Gz6zTxPbjpdki5Ta3qlCFmoEDF3x
5mLB7OXZei/FoIBdrfeT9+FUM4Jia5WUg9/0PbxZQA9iIroXGa5Ag5UbLLqit9FuozHWwMFjtiNt
W0UN2YPJNx/XXTnA25HNbw8QLm7UJSCh6SzqWsfVs++p97JE2GKgcfbBCkvWFsHda3JCkdSSfLAq
irWpCgUdZqqyjlz0cApVy7vki6BHmqEEeh96WfvH9G0IiDll+YTWd2dTqn1rhuDlD7tYuj4qcN8T
XLjnp9GVhZOsIp1chgqXMa9Ji+Bm1DJfxKw0LCMnUNryWrpR4Emu++AJHlzwQr2XJcIWgrP2ayWe
SCFV75m8a7EUNsYFf306TUcmsgxWwgsLXmdDV3vwy4+CHNnmSDp8Le9c9bEyXRqFokGLIeg7N2u/
EPWEEXHGjYy7/sa+MXuXd6ZxchHtrCAdRX73CI2xBr6x68l0mqmKaQje4ijVQy+Fz1+l45WGlmlC
0BRr5JKXrufFZbPrvTQRtggIzj3CIGtqoQqghC0pGurZpkDTJRs3NZO1o+dYJbyzcj6dZhqtYjcg
8n7pWgqbOLv7s5dUMKKhBaMPy1r3C1GPa4szcWSsYuvDsnWq4WYOkhU4/V27stGbaE9x/KR9mNjY
hiUlFX8HqrImrZSjTQdFeeeiLL1Ku7feuIEGQucHL17D+tTGei9NhC0Ax+0UR+pplHLdagHoTf91
PttFgG1r/PXZ9novw4DGso4NjtVP+DxTXJN31TreUJYvragQdKbAUjaT28YR0/su571fiDpu6Ewf
m3SdktVR0xuni0BZHa59cnV/nOaQxtimUXx+2yMxbatMq6gleMybLx0gI0pHL/koIK7prM+mueTF
f9d7aSJsAdh9YpwTd9HI9HOmVOG5pnhyTr1XYWBjVdd6dN3H/FxL8JjP46ZiZLiCrGVx+PQ9+7RR
VL9VJtM0WVP5ll6rWqYJ7n8tehPtDXx6u+MYnWzEUtJbAIKiKmWV4jh8itl7BUq3BNcvVULQaCR4
ZuUcfvTc1fVemghDHhr7bgNp20L5+Kp72zddLCcE6BpsaE8CUWCsH5ZuWMmri98jrvlptd1vuFHx
keY+ryxpsfuEGX16fv1G1BNHCCdvrZfdLJV8Rk6RFMW6Dp2o8Hfv4Pu7f4qMlc0vZ96pID2fyiDD
FDFza+56vijeo6SZlxCCJiPBXQtf5E9RS8wIfYwz9k4yaYTCdotl5FBL3e+wcpqmeeR0DTZ0Cu6a
HVUp88OSTauYv2E5ulaiURdVH6ut4UaVtBV3sxICZVrEjVifnl+/EfVOk5IQF1VLgXYnb7qSyUEI
sE2NJ96JakX3Bo6cvC+HjN2OtG3mg8cK1ceg0k+hYPL28U3LAknnorz9SNobCQ5CKFrjLVz9zoP8
8bVb6r08EYYwWhIxpo3Puqla3vs3TN3vMHJBEAJMU/DW0nqvwsDE/PUrkHpJGFnY6mM52SKBXGR4
lVcqFBAXOkkj3qfn129Efcq+oxjZEqscNVxjDfAweYgCwIa/PbKuv051yOP8XT6GlBa2km5wd2WS
lh612+cttUhTFqVfFKOsw40jpwloiTdz9bsPcdcHT9R7eSIMYXz9sCSGRt71E6YHQS0kHTyeIqZr
rNhgEFkHy/GfWQ8SLybLfNZniOpjZZCVte+ix5MlbXYeO5VJbWP79Pz6jaiHNcZoSsqq91hvO+SF
EKAJlq2Pan73FnYYuQ2fmX4YGdtCBeVBu5D5Wt7KX87dXojy9pFz33bLQ9hwVWwnMrY50cQvZt7G
A/Ofq/cSRRii2H9aglgyjZL5Zoqhnlm19Snwl43p8PJCi/fXRFXKimFaJi8un4ORcxcUmfqqasU+
tbwr9t4qedxlbZODp+1Ba0Nzn55jv7a5bGuy8w2XeopaTOSaAS/NTXH3K2v783SHNL6x2ycZn2jG
DFE2r7wrlheq6EdSJqe8f5YFmeW/FBhCoITGxS/dwGMLX673EkUYgkgaGkfsIDEt3eGCXmzVW/mZ
JtA1xcpNGss3Rhp1MV5Y8AbK0Av5026Ud9Xgsbxs8YcQGnjuMEIgbZu2ZFOfn2O/Njv9+D6tzH6/
ozhHp7Be3fBNh42e1DWB2SV4f0XUhaa3kDDiXLL3p/nK0/8PI97kdkgrL1ZfEaqUmn1IuoiPvRt8
Im8R6JqGwuAHL1zL5VaWk6YfUu+litDPWLR+OX979U7WWSmE0FG2xZTmUVx08GdoiCV7OLrg03s3
cPsLJol4bSmkoUavMp4h42zqiupCFOPKZ29BF7rzSCjKHAnb7bKAKuRe3q8ZTcGohtY+P8d+1ai/
fvwE3JDJkvPtfd902bhxg2ufXE9HOiLr3sKBE3bnlKn70mVmyq0knh7TAQ+WSg24StzZhT+lV8Y7
HAKBoekoTeNHL17HjW8/UO9litCPuPSxv3Pc7T/g/z54hkcWzOSRea/wyMKZ/OOdR9jjmi9xw+v/
6/ExxrXqaLEMQlTPJqn1WVVFipih8fB7marH3VKQzqRZmlqPITRHD3ZjZkKRtPR+qNqeoGSjrSRb
DRvD0dvu2+fn2a9EHdc10LO+eYhhfTi1at65Bh0xQ/DB+yaL1qb785SHPL62y6mMbWjGkkU9q5Xr
9vGQtH8tb88XpTJFJF22oWRYTyQ4Ch1BPJbgipm38KeZN9d7mSL0MdJWhjNuv4Rr3nkUWyqaYkka
YwmSRoJkLEmDHsdUiu8+fQ1XvXR7j441Y0yMo3fQyVqiIl1271lVAQJimuLxOTYpKyJqgKteuJ0F
61diaLqnlne4ftQ5sYJfOqj6mN/jyZI2k4eNZvrYyX1+nv1K1C0NGjtvm0DZhTfIWut5Q3f8QgIh
JCQT/PGBVf15ykMe45pH8c1dP07WNp3uWsrPs1Fe2KTc5O3dXvxnmVxAXFrxXgKBLjRaEi387e2H
+NXLN9V7qSL0ETozXZz0n+/x3Ir3aU00YmjCuf+KurEKIYhpOq2JJn7+4n94dO5LPTiiYLfJOhnL
RlRp1NGbRVAEAqEpulJxlB0Fx6LgyUVvohtGkTZNdR9z2fOjil/arzaTUkglGRXve/809DNR65rG
V48eA27t7e6UCu2+5i3Q4oobn+licyrqptWb+Mi0Qzh83A6krAxSqcr50vke08Wm7BIbt/vRu8X9
JEWZeOEoCpS3ULgmoCXRzHXvP863nvhjvZcqQi9j2aZVHP+fi3h/0wqaE41udoFznyifB6wuNGKx
ONfPfqhHx500QmHErECNutYKZOGfgQpNJui0Ihfea0ve4YkFs0jqsfC1vMvs27KyXzqwbYGjhX92
rxP65Vz7lagBJo82QJj5s+/tYAwgfyFKx9Y1yKQMLrktqhrQ2/jlQV9lm+YxZPMm8IASoWW1vMGP
pP2V5vLKBd6gTT+nt6NdtcQbeWjZ23zp4V+zeNOKei9XhF7AY3Nf4vhbvsvSrk00xZOIortGERT/
oEhqMV5c9h6vLX2328c+dHqcrdo0v5CbPHqzQQe4/m4h0DTBzTNTfbWsgwb3vvMM8USDY9UQKrzX
3j9etSZIFLqC43Y8qF/Otd+Jet9tmtlmahJZo4+lJhM5/rJCCNDh9hdSpMzojbQ30WA08P09P0XK
7EKq4OAxb9ES/4YbJX9SZvIOGjzw3cDRWFpiCV5cM5czHvwZzy55vd5LFqEHuPyJf3LOg7+ny7ZJ
6K7ps+gGq5AMiACyQnHNzPu6ffyt2uKMG2H7EnV3Mliqwr33hRDoAuas3LJrfq/ctIa/vXYfjVrC
bbgRIq1KlX8RppZ3+fcKS0omNQzvt/Ptd6IeNzzB/jOSYIVPMeiObzroksV0wcqVkj9Fvupex77j
d+bcnY6ny0qXp2ZJz/+oWkvXTy649Lfbmc1PfyoKMlOCRj1Ol7T5+lNX8e/Z99d7ySLUiKyZ5Wv/
/R3/fOshEvEEcV33b2sYdFu5RfQa9Dh3z32BtR3dLy3c1GAilTcNsZZnVbhIb9wXj0L0uKYpPlyl
h9t3iOK7//0zGIabFurU8q4IH5N3mFre/i19FRnb5JuHntFv59vvRA2w/QTDNU33vFpPKaq9zQqh
IG7w14c3saY9U4/TH9K4YPdPccS4neiysmUPIllmuS53NJf5nHNy/qW/vXXB/ZtxuYM6lYqEEMQ1
A8OI8ZvX7+Rrj/2O5e1RG9TBgFeWvMVRN32L+xa8SkuiCV0ICsmzMl8IXoqgx2/uPnFe42PxJL99
7sZuz2ePSf5HCZuO5TQNCiGLQmglTiA7wZaaorVk/QqeWDKbuDAQgjxJV9WMS6qPVfVn+5K0k8al
25I9JvZtx6xi1IWov//xCbS2Gdgh+lP3fiEUQcxQLFmmuOmZ9fU4/SGPy/f7AsNjMcxcO0xV+lsJ
Y/IOrHZSPpbPbeTxPeX70RZ1IxIaLfFGnlzxHmf872c8tzgyhQ9k/PmlW/jMfb9gWWoTTbGE+xvP
kXSRybvS07q4GIYQJPUYd374Eq8uebtbczpr32Z0TXQrgwW6byHUBLRnNNZ0bJlBsVc+ezMdZhZN
E+Uc7Idaq4+p4A1KQUZmOWqbvdhl3PR+O+e6EHXMMJg40gK7ejctqC3YInRZ0aTOj25Zg2lv2b6e
vsDwhlauPOh8pJ11XsbKYrxKmJmyPwlgb5+Wsf5VUzwkHfTLE4JGPcEmy+RrT/+VC5/4I5YdxS4M
JCzdtIov3P1TfvPKHaAZxLVSU3eo7uX5+0QVeVA0TZCWJn997d5uzW1kkwF6muKSWL2ZjhUkKwR0
pCVz12x59+rby+dyx7tP0xRzggdrb7gRovpYoEVcgYBMxmS/iTuiG/1X2LMuRA3ww1PGUkhO7zlq
TXMwdEG6M855/1pUryUY0thr3A5cuteZpM00dt5QnTNsF6FIafbNl/YXL3wKCCDL/6FkmTaNO6xS
jqYS13UMXeehpbM56Z7v8+iCnuTYRugVKMUD7z/HkTd+k6dXvEdTvBGj7PftvU/8n6/ScXu4L3Oe
mAUEjUaC/81/mSc/fKVb00zGTaQS1cvllqAnmrcmoDML76zc8oj6N0/9H13SQhdU546y54eq7JkO
JGmVN3lLpRiebOTYGX1fjawYdSPqj+41Aj1uImVRgdbS5Qn75hmQjlVpTCFAj8N/nknxyrxN9VqG
IY2Ttz2cM6YfTMoy3YibEkOVb8ONok/B4uS1pEoBZEUNO/yERJGgJpyH9op0B1976ioue+5frO3q
fqBRhO5jyYblfPL2SzjnoSvBMIjrMfcyll5Hb5S379M3tyHgwS4QNMQb+f1Lt2LatZuS95wqijrE
9W6kd6Xnn2UJVrfX7fFdFzzw9jPcPudZGo2EaxmppbBJgYVrI2lnY65ymWlbTBs2nt0nbd+v5163
K93WGONHp46GdDBJa7m2ZVWgUGghAtNKIzJ1DVIpne/fFAUT9RV+sPfnOHDMNnRaaW9pv6JXW6/S
XBIeHpQzHVAo3NP6OqDGuCwbzP0BC0FcaLQkmrn9w+c58e4fcdPbD3brAR6hdmTMLJc9/ndOuuNi
Xl3zIW3JFifYSvlZygr3iSQoZ9qrZgcoSyQ0nZlrF3D1K3fWOGPBdmMNbEloa163+hSUHtV96ehM
bTnVyTJmhkse/xetDc3hTN5lz48qkeGBJC3doUQ+vP+jM/bv9/Ov6yvZoTs2gTLLan/3SR5i7oSL
fiRCCOIJwVOvZrjqkZX1XIohC03T+NVBX2V8spmMZXq1GuEXvV345NOSGr/qY8UynrF8tOkcSRdM
7CXh5O5TsCGWIKskV8y8jY/c+T2eXTyr3ks5ZCGlzW1vP8oB136F6+Y8Qco2acp1uZKiXJEuutJF
CnMJCmp2QI0890uJENBgJPnty3cwb+3imuZ+4k5N2IHqfMmMerH2t4bAtvu1+WFd8e17/8D8zauI
aRqq2hqWRZjJypHhFWzoOZIWgFSSOBpfP+T0fj//uhL10Tu3se8uDdimT9uF3g4gC4wnUujNMb55
3Vrmreqq53IMWbQlW7n+mB/QrMfI2laZP6+s+lhw6e+KwWP5sZT/yDlBkY8CD3qNdrQjQ9NpNBKs
zHby5cf/wFce+S0vLZ1d7+UcUrjxzf9x2p2X8u3Hr6ZD2jQaCaf7GaCUH0kXXelKhU2K7pNKxU9y
Y2maQGqCCx/+CypEj/UcTEuSUVl3pOAnfi0xNNWfaQqHqrcM0/fz89/g1veeoSmeBCGqV18oEagY
GV4teCy3SSlS0uKU7Q6kKdnY72tQ5ystOHHvBpCy5mAMqPHm98lFzM1B1xS2aXDqlQvruxxDGOOb
x3Dz8RejS4kprZLUaG8ebHCUd6XqY+7XEjeAzNcQ6vFL+w0kPbs6dctjQqMx3sRzK97l3Cf+whcf
+DmLN61EyihjoDswbYu3V83lYzd/lx8/dyOvr1lAa7IZvei3HHAJybs8ZGCIAsX3ia8mnc+rd4Ry
j+MGPc6ra+bxlxdvC30ue03R+fieko40vl0BofZAV6iuqOgaLNloMtRzqde2b+CcO3/pNN4IQ9Ke
C+48V2ptuJEbKL+ne8t1dnVw/oGn1WUdhApdHqdvYEubiV+dw6oNYBii5jfPWooLVBpTKUW2U/LV
jzVw9TnT6rkkQxovLp/NBc/8DSU0dE33FiwpeaqWk3SwX7oQL+KJEvOOVUmb9h2+eEIKpMBGkrVt
UBZ7jJrGN/c6jX3G71jvZR0UsG2bB+e9yF9fvYt3NizH0HRiuuFoC8JzpQOI2r1u0ptmVSbjk4rl
gWvyLimX4w4t2djezr2n/4yDpu4e9sz47LWdPP1OkqZE+bzDPqdystWffwrT0pg4Os3d58Zpa4j1
0RWrP0657rs8s+w9GowYSoRIxfI+DFCIygpzYPWxIoJXkJJZDhi7Hfed/VuMfkzLyqHuthNd0znt
gAYw6Vap0LCoNqYQYDQa/P3BLm57aU29l2XI4oAJu3LlQV/Csi1saVOplH6Y4DFvKlYFkqayNl1O
0qX2d9fHJQQJ3SBuJHl9/RLO+N/POPfRK7nprQdQkYbti6yZ4Y8v3swZ91zOFx/4Le+3r6YhliCu
G2iIsmumVAABF1U0qUbSgSbvkrz60pgJDUFzQzNfe/CPLNsYtsywzvVnN3H8Hmk2pqRTzbYHmm7Y
519Mh5gxdAPK/vLMLTyx+C2XpNhenFwAAEvmSURBVENEAXh9ZJVJOidfIcpbFH3KZDJ8cufD60LS
MAA0aoCNXSbDz3wbEU9g6OF902igVXnXqEXr1jSBaQl0w2TJVdMZMyxR76UZsnh04cv86KXrkUIR
0/Sy+qJlQZvSv0xo/gVa+geP5WXyA/qEk1Nq8i6RKfro1cOc33razIKCCU3DOW7Sbnxx95MZnmwJ
lYkwVJG1snRkU/zwsb/y1oYlLG9fh2boJPSYewly17IkBDCf6lQ6YsHqUl6KtkjGDTL0v8p47hNf
Gek8mNN2lr1GT+OeM39Tw1krLv1vB/98MkZrQkNohWpo4Z9BYe4ZhS019FiKu86Lsd2YofeceuDd
5/jcnT8nEUuiayJc+0ooCyAToeW9G4r3zVgmM4ZP4Plzr0bT61NjfUAQNcCX/7GAa/7XhdEQwuyt
QInqKVlhzejFckpBxlRMHCl563fTGd40dM1K9cbTi1/jW8//E03TiaF5ns5eK7h/lLdHUw7yS+eU
bCgihhJtWlYweRcpct4X8FxxctfMisKSNiYSbMk+o7fmMzsdyw4jJjO5bUK9l7rf8NbKuSzevJo/
v3wbH7SvRBM6uqajCzfV0ueBGtrkrUS+94qvNi1VfudKUd5lJu+iQ+TmppRkc7aTT217CH/56Hdq
WAHFn5/s4Bf/1WmJx9E1uyazd1iillInrbq46/wYe0wcWkT93op5HPj380gkm4gJkNVM3mUm7O6S
tHL/KeyrlKIzm+YPx3yVcw48tW5rMmCI+pV57ez3w/loIo6uVQ4ZUMoJDKvmsahNm9aKPkMmI5kx
WTH7NzNIGFt2p5q+xCMLXuRHL92AEsLRrAnnm/aSdAWTd0lwWJlB3R0+UMbXfV7O3vnnvHJ+6qaS
pLMpJja2cdik3dmubSJn7Hgshj70Umo2pjZzw5sPsqRzHf99/zk6pE0yFsMQGsKNoM8H8pXlrxe+
kL6X0bvWFRtuSOG5FuXDeAPISp7tZfNSCjZnOvnSLsdzxbHn1bQm/3mtk8vvs7EyjSRiznErPq+U
Ww8iNFFrZEhz93kGuw0hon5n+Yd87vafsaRrI0lNq17YxOeeKiXbyvLB+ymlsJRNkzJYePE9dV2X
AUPUAGddtYAbHu3CSAZrwaGDzUJq3bkxS38gSkGmU/Lxg3Xu/s42W0wqRD3w7OJZfOPZv6HrzsPd
CRrJmQ0rkDQEPd19XNbdIOmi4mcloU6+JF1M5MqdgI0iY2VBSbZqGcOoRBPHT9mLU3c4irhm0JDL
Fx5ESJlpNqTa+fese3ll1VzWZrtYsmklhmaQMOL5X0ouSje31iKApPOXWZVq00UyRd3Vyq500X3i
G0BWjaQ9XxSCkMApGbkp3c639jyZS448p6Z1WrA+wzk3pJm7rIGmuIZwu7eVwX1W5V5qqsF5ZOuk
6eLuc2NDhqilLTnqn1/jjXWLaTLi7vUOYfL2PBtkN0jafz+lFJvSndx48g/5xB5H1XVtBhRRz13Z
yfbfmo+Suq+vuuZcxJBat/+YCqUEmbTkYwfo3Pud6YQpahChe3hkwYv88KXrUULDEDpCuCWnqEDS
lUzeFFs5u0fSOQ0Oz57lKnaZtq1y6UGuadyVsZRESqe+vQ4MM2J8dJsDOWjS7rTEk4xrHMG4ltH1
vhRlWL5pNUs71pC2Te5570meXjybdmlioxDKCQjVKYrgL4oV8IQGlDqDizRpKpB0zqrtb/Iu3Cfd
ImnPVApb8/NWYCtJxsxwxaFnc/beH6tp7WxsLr63k9tejqHJODHDds+z+F4M96zKywoB6KRU55Ah
6lQ2zWdvvpwnlsymKZZEuderNpN3RZoO8IcE75exTaY3j+XhL/2RtqbWuq7PgCJqgHOunse/H8lg
xMujH0P7cGrwYUOlQA+FVJDthE8eYXDrN6aiaZEZvK/wyoq3Of+pv2CjEdM0RKVUrPwH/19fQdH2
f42WZfxe7pf2z8OVZQ7rav50hyscHU0Jdwic6OCMNMlaGWIIJrWM5tDJe9KkJ2iNJ9h77PbsMWE7
NNF/91zGzPDc4jeYs24xXXaWpR3rmLV8DvM3rkRpGkk3WltAkQao3EUQfqtR0eRd/sJUcj2KXpj8
n7GFAAN/v7RXlS+T8fpQyuXcUnYWimw2w5+POZ9P7Hp0zev63PwUF9+TYf6KZhpiCl1zj6moKcc6
9wxUShsyRG3bNh+7/rs8t/w9WmLJfI/pWkna+VXVbvL220+h2NC5matOuIBzDjyl3ks08Ih61aYs
074+h1Q6Rswo1YK653MOkoHq0ZhKOWawbEbx0f0N7vvO1hDizTdC9/D+uoWc8/jvaDezJIx42Up7
H6AVyoTmidjn8S2LeKV8ZI/S7B09V19aeEQ9Mj7R6WUvF/l5kychpdwcbTObT/ManmxmRLKVpngC
XcHIeBPT2iaw7fBJDGto5sBJu2NLGwFo1QImcb1wrrL/7ILXUMBzS95kQ7qd1anN2EKjI9vFqq4N
dGRSTrqSHiOmGRi5NCo3dcoT4BMQUe9/icqjvP2nHjbK27mQlaO8A4IUPTuVxvOXfK0csrasDOfs
cjyXH/0VakXKklz9bAf/eFKnMx2nIQaaCJ9jDUOPqNtTnXzhjp/z6KLXaYk1IlBI93qFN3kXIrV9
9wu8OZyNpfspFBnTZKeRk3j2/L/Xe4mcuQ00oga49snVfPG3qzBaDUTOZNXLhVBqJX2pIJOS7LKN
4pnLp9PWOPSCggYKlm1eyece/iWrM500Gom8r9MTPJZjDD+SrqRNe4ODCWfyLgoJrkTS5eHj5VbV
EubyeGpd0lGu1i6RSKny2rdU7nu/68PXXYuRphS6Ks1IF4U5u/+zcAgWBZaynSAvZSOUcLVjEEJD
CA3NnaPwLmj5ihXbiPGR8Q2tdmUq+aVdq0VwYRNZtF69Z/IuOzev0xIbyaZUOxfsdQqXHfWlqvey
H9Z1WVx6f5rH39Xo7IzRnMz5r4vnWMn1B0oNftP3grVLOfG6i1id7aBBT7gWpxANN3xiCirW8q5i
8vaa2BVSKVLpDNee8j1O3b2+vukcBiRRKyXZ6aL3eW8RGDHnstUSGBamClmtaVs5n3U6LdlmouCZ
yyczYfjgCwQaLFjduY4LnvwTb21cTpORKFQlqmDu9j6b/W1dFVOx3I+BqVhFf/oFkJW8AXj39LcB
+3BF0UtB3kUrUDknbV43xiMny9wEkmIRh4RUkYhAFO0vcsdxTfT585AVSDqA1fytyWFIumgcSd9U
H/PcLN5JVpiu5wupFO2pTk6efgD/OPWHdBevL0tz52uK61+0iakGYgbomnKvhSqjnoJyoQY9UT86
50W+/cBfWJltJ6nFXDdXlbSqHEq06e5WHytP43J+Vx3ZDJ/Y9gCu+/Rl9V6mPAZkKLMQGj/+xCjA
dk11tTXeCCMb1idUkHPeZJNJjXnLYbfvL+CRtzbUe6mGLMY0jeT/TryM4ybuQqeZRirpJacS+Ed5
+5O5h1xLN1aSURXG8Sk8rco+BYacljCE4wF2tEXhVurKabzOv5oQaEJDc5szaBroIvevKPyL839N
4Mjn/3WPkm8h6T7scgfIn0D5agjfOVc4Fb8V8yXpMKtVIGlEhWdwyZyqrbcvL5cxe65bl6CloYk7
573Ip265mHUd3XsO7DExyc8/nuTFHzbwhSM7aUimyNrQlQVpayjlvDjl/i1/Zg1OF9ytsx7h9Nt/
wupsB0k9R9Ih9UWfn2zwPVBpo39NRClBNy1+dtxX671MHuiXX3755fWehB92mdzEOys28848Gz0W
Mh2L8P6eMNq0n5wQYOiCjpTgxqc3g8hy+I4tDNYfzUCGJjSOm7Y/SSF4dtnbeZOs37XLK0fBT9pC
e2KvzTa/LffRl5pKqpNRLOMTklzm5ywPaw7w4focvcJ5FQ7tkjuicHTpfJYiF/pVsmJFWrivG6/8
4FVJuNwkHnBegdq0M+/CdfK50kXzDtSm3fUOPi/vJFWgjI+cdFYzacRY0L6GG2Y9wK5jpjF1eHcK
2whakxqHTY9z7mFxYslOBIINaYt1nQqhYs6LVlFDIWddNCxMzthbY1zr4HDDpbMZLnv471z2zA0k
40k3KFE4Zi5BZfO19zLkvyg1XFeWL2wobl+Zg1LQkUnx06O+wHE7HFDv5fJgQJq+c8hYFskz3kZo
DcSMQEcDED7FoRazdyXSV0ohlSDbZXHEHjFuv2gSI5sGnwlqsOCRhS9z8XP/IiMECU33pLgoKMnS
Cqg+RgUZX1Or118a1uTteT6Uq/pemYAUMv/dyv3p5db2MD5e/zl7LedhTN4V5gwlRBd0rcrnHdB7
pWzegdXHinzqFbLC8h8qm7y9JF16TZRyittkMl18e59T+cERX6A38O6qFDMXary8wOKxD2w6OxuI
azqGhhu3o5FRXdx9vsHug8D0/f6qhXzxjl/w5vpFDEs0Om7M/CWXPob+EvhcF+ergCd+DdXHwLmO
aTPLjiO24qlz/0rMGFgVKQc0UQP8+8k1nPPHlRiNMTSfwhZATXW/IVykd6iocQ2E0kilJeNGwi8+
PYIvHDaq3ks2ZLFg41K+9dT/Y277GhqNBFrxW7g3HBwPKZbVjy7XpstTtou1Uo+oV6ZkR98ocK/K
XBinQv1x/928vvLAOefUfuFHZmHm7P6nUrS0T7SVf/iAT5Q3FWT8q8UWzV34WzU883a2BMqU3CcV
bp38DsH54A5sZdOVTbHziCn86YQL2Hn8tvQOJEs2SjJZnfvf7eTO1026UnGU2cCadBf3nh9jr0kD
m6ivevZWfvvS7bSbaRqMeEkpWemucBWLZNl7dZW9Aq6T337KDSDLZjO8+fVrmTxy4JX8HfBEDYqT
fzuPe583iTUEmD17OW2rtmA0J8jMtBRWVnL6YXGuOGMc24xpqPfCDUlkrAw/ffFa7pz3Ig3xRqeH
cd7HVabKBWjSRTLlGVd4Xt/906sp9ZUWj+5VgL2EV66M+uroPlqndyL+WmeI3OOiaDrfFasWLV2J
pCsEYOXPyXt5vKvqH49XNu9uNdzwCdbzBCFVmzvBJJ2bkVKQtkxs2+IH+5/OV/Y9hcZEbz8HnLln
THhuYYpDt2kgpokejtk3mL9mKV++65fMXDOfZCyBkW9rS/6trqJW7JEtPv/u5Es7A/ntp5RiY6qT
iw86g0uO614kf19jEBA1rN6cZsr5c0lnDWJ6OVn3NlF3V0YqRTojGNac5aefGsEFx49hgMbr9RmW
rE/z2sIUbQ2CI3YYRl/57v/zzkP8+a376LAsklohja8UYQqbBDfcINjk7ZOKVW5C9Td5C/8/CjKV
TN6BJF27yTs4ErpK44qatGkRcE7+ax2oTbsXMvA5XPJ2EzyVgHML2KHC+5RnUZRrskc4aXQdmRR7
jtmaC/Y9lZN2PJQtCbZt8dPH/s0/Z95PVsOJ6gY8QYrub6P2wiZVorwrpGIFmby7zAz7jt2Wh770
R/Q6dceqhkFB1AD3zVzLx3+5Ct3QPU07updq1X2ZnFwQmSulsGyBmbXYYarOT08fwSf3GVnv5etz
3PbKOv74YBerNilWb5LEDcWUkUlmTLT402fHMLYPWoau7FjD+Y//gTmbVpE0YmiUXLsyDc2fectK
gPowXflzPEBTzm+njLn8ec5HptLLRaBp2GvrDqjXRsXGFT5qsT+Z1e5P9y9sEublwnshfc+rmhUg
4AUjDFEHZNWVDVx6fkopMtLCtiwO3Wonfn/8N9hq+DiGOv714t387bX7eX/DElqSzc5vEryLk9em
Q/SL9rmQVTtjBVwnv/1MaRNXGs999Sqmjdqq3ssXiEFD1ABf+/cC/npXF7EW3U367z2Szsn1lmkc
BFnLMbYcvIPgz2dNYPcpjfSVhlkPWLbkzSVpLrljDU++5URkG7pAdx+4lq2wlaAxYXLT14Zzwq5t
fTKP371yE//3/lNYQpDQDKdAimvyLrhiS371RcFjUCLj1xWrWKa4lnfpyDnSQHnsvGV1QfIBTyVH
95iHS46u/ALMi2Rcf7pvUFxuzgh/Ipdh5ozHn172dVAAVlmMQPla+1cf887bV6YkeKxCLFj+Q44g
ys/Nu1M+Na4KSQfmhCvn95+xshhofGTrfbjw0M+w7chJDCWksileW/IeP3roat5rX4GmBHEjVr5u
Rfe+rFbLu0LwGAQ8RQN8IrlK3qWbpFJs7urgJ4efxXeP+ny9l7EiBhVRg2Tn77zPO/MUsaST+N+f
vmmUY0CpFg0OhYA1KRUZSyCzGY7fp4FPH9TC5w8Z/AFnf39yLXe83MVjs00a4kkShszn+DrrUHBR
ZC0N3chy/3dGcsiMlj6Zz8yV7/Hzl27k3Y3LaIo35OuEO4+Ckl99kZkVfIi8pL5JQQY/p3eFEqEB
PlzAN4CMYMLLH9rXL00VrdQbQOavTQdVTMOH7AKI3Efb9m+4UTROxcImhXkHFzapQNKe6RZpv6Wn
473AHrnKfulKtcoLckqCjSJtZRGWzRm7HMUJ0/fjuO0GVgpQrciaWa555V7ufOdpnl/2Lq0NLcQ0
3Sln63exil6qqpq8S9Y9iGyLBAKtHn5JXArFxq4OvrnvKfzqpK/XeymrYpARNWzszLLTRfNYvhZi
sV6M4KbKWN0g6eLvFYJ0FhAmu0xO8JG9DC47ZQKJ2MD0ifgtgFSKi+9YwWNvSmYtMklocZJxZ1ul
uAEn9UFj2vg0b/9i6z6bYcpKc8u7j/LHN+7BRNCgx5zHd2kEkyS4K1bwn+4X5dHQnnGkP0mDHwmX
yHh29Y9Mr0R4/iZvL0lXjpYO8KX7zCk4YL3kvGQQibmmZZmfWvn2knn7nnrRvIMDzn3m7X/x/M/P
/8D5+Vc01LknKAWgFEpAVzZNUjPYZczWfH6no/jk7segD6JmP5vTnVx07x94e8Ni3l29kETcSR0D
ghUdT5R3BcItli+6LhVjvAOjC3P7lpN0Kptl5xGTee5rfx8URs5BR9QAbyxsZ4+LFqHHYxia/7s4
9IHJu0qeduVxcg0RBFnTIe6GuGS/7RWXnjyR8cMFM8Y11ntpy/D+ihQbOgTfvXUZby/SSWUdE3fC
8BZhqLYWUiqyNjx28TD236ZvtOocFm1czmUvXMvLq+cSNxIYxfdAT/KlS6K4wgSP+UcMl5BZudXZ
K+MbDV0+Z5/s8TJbuT+ZhU3FKkzQm15Wdrb58yo3G5ebvP2frwUG91WWqvml/dX9IDd7yLkX5HLB
Y8GPloLZxnOObk12hdNGUQNiSvCx6ftz1t4nMb5lBBOGjWWg4b2V81nRsZ6fP/ovPmhfScrKEtN0
DM0ptlLNElkcPAYVuNHnuvgFgeVRa740YNoWDUrnoS9eyU4Tptd7aUNhUBI1wE/vXMJl128i1lw5
v3ogRIOXyuRKNtpSYdkalm3R1Jjl84eMZPcpBvtMT7DHlL4ls0p4e1kHT72bYf4qyTVPryeVdlob
Gpp0ybm6ZaH0Bcmp+iM5+wiNv589sV/O45Z3H+GqN+9jdaaDxljCCWxRwoccytVRf800gKTzO/ju
VWIx9gnEkgEkXDGAzDtnf8tflTn7vFz4W7FrDx7rcS1v982kOkkXfM7+Ju/CNQmIKSvdIeCaeOWq
atLuCVYs3qKcuuFS2VjSJmOZbNXYxid3OYqth43j4Cm7MmVk//xW/PDSgtnMXDGX99cs4pbZj2Hp
gpgewxAaushdohDqaNjgsbLr0t3gMWeD9CFpqSSbO9t54PO/4YgZ+9RtbWvFoCVqgK/8cyH/vL+T
eLPh+6MZaERdmn/t+Lic5belRjprg7QZPUJnh4kJRrZaHLtLA5/cbySjmoxyE26P4Wj5qzZZ/OPp
1byzxGL1RoO5qzIsWwuGYdAY09E0p+1iIW+cilHv4L+9MyP5xP4GN507vhfPoTLWdW3ihrf/x3Xv
P4YlBXHdSRUpPGC6p02XP0/8VTBv1HD5yLIK4fkc2isTaPKufc6hSRoqpmIFE11RAJasRGCFeVcy
eSvhBARlLIuYrqPn8nR95l7Bje6dV+D5ec+zMlEXziG4eEvuPFxN030KW0qStjJI22Jy61imj9iK
YXqco7bZm0/tcZxT2b2GtphhIZVi1ea13PHmY7y89D3WZTt5b/VC1qY2k4gnSBoJN9FUIIRCSVVo
lFMJ+Z+XpGq+dGF58x+623Aj59Mu3mQrSWe6k6tPuojP7nNir69hX2JQEzXAcb+YyyOvWcSTpRrc
wCNpoKppXAgNW7oR01IRMwSNcY1EIsvoVsX+2zaw86QER+4wwm2Np4jpiuaks18pNA06UmBJhS0F
SgnumbWet5akeWtxls1dBlkzRmdGYkuFLgQxQ0PX8PXvVjqPyueo6MoKTtzd4I5v9r9pb8mmFfz8
xRt4ftUcbDQa9BiOb909v0Bt2usrLfq2ol86J1PwO/vb6CrmefseumicomItZSOXOH/9Xck+udBl
HwJkKuVM+y6Hd97+/vbcSVf2pyuXpLuyaVpiDRw6cSfeWD2PVZl250WsUs50oJO+kt/dew7SXfDg
+Ts7B/fRxnNzeMzBTgcWpz+5dDRtW0nimk5TPImQMDbZwoxRkzhg8s4cMHV3FE4jlrhmkIwlnDF8
0GVlsGwbKSBlppm56G2enDeTZe1rWZbaiKUUKTODrSS60DF0Pd9KtWAeKaxBqL5G7n1W0cfsc4vk
/NIV96qoTXv3lErRlU1x4b6f4PITBlbDjTAY9EQNsN/F7/PKu4q4W7msv3Orw8rUpG2r3Nu9Q+BS
OW/xUglsCcq2QbNBkxi6YmSrjm270Y1F09AErG1XzjZpADq6rmPooGtO43qnG5Mr77bRcyAqzLHW
c1RkLY2pY20e/N5oJrbVp0Xo4wtf5b/zX+SeeS/SnGzGEJrbjznA1OoT7VSumfrnVAO+pJGXqaRN
+2rSReP4Rq4XjVNiOobKc5a+06jd5B3wzlI4ghs0X62Wd7n729HglLTJSok0M5y83cGcvdsJ7LXV
jryz8kM+ftvFWAhimoFwF97fRVE+d48mHTh/qvumXVNBsFm/6L5yF8rfauBeNfd5plDYbp6bdP+2
bBvLshBKoSFI6AbDYg2ub7YAoZy5rE93YKMcGhM6uqETExpC09GUQ2yaKPEhl56okkgVkqTd+8xZ
ixBR3vkDV/FLl11H7wbnWor8i48C2jMpTpm+Hzd+9mchJj7wMCSIenPK5KBL5/H2PIi7z//+igYP
K9NbGrnQtKI3ZsfX7RB50TxKrqgQKv8CUDC7U9Ama5hDd7fnmphousUd3xrBEdvXzwcP8NjCV7jy
1ZtZ1LkRgWMSzy1KmTYdFOVdKRXLI+yTilW2W0mwlm80dLkKHSbKu1yxDTNnz7cVoqBLZHxNwt55
BxZs8Zu3y4q2kmRNC4Fku9Zx/P7Eb7Hz2G08Izw9fyafv+9XCE0npmmI0gIpFSLU/YPjynesbPKW
rkFA+A9Tdg0C6pH7XJBirVu5Wnd+Zxc5j64q/dLdUwgKqfvuRpVb8oo2+sKkpPt7CGXCBkL1mPa5
LrWmbxXvSSlJmymO2Wo3bjzzcpqTTdVmPiAxJIganLSto69YwMx3JfFGrWpEcm9Gg/eX6TzIpOxs
d0ja73IWKelO15purkk1Iq6qbQuNDSmTf391GJ8/qI2BgPvef4qbP3iKd9YvIaMkjXq8sGYlodZl
wUiU+6XLCc/X412i0Jb7pbsd5V3Sq7k8yCqMX9pzJgEKdi3BY5BrXVnNL61EjohE/kHb+f/bO+8A
Sco6fz9vha7unrB5F9hdwhJUREAQUDIoKIogKooCinKKnIr5J2dEwBMTihhOD/VQD0E5FAQUBUQF
JEcXlgxLWDZP7FRV7/v7o7p7Uofqme7pntnv84eyU29VV5jpT32zn2OOm+Slc5dy5oEns9+2u1V9
njc8djsf+tN38Y3GteyROGq9uHRNT0C0IU5c2hSvYdIiXeUeV3EETDj46L42Y9wppeXlCxh5Aage
jx934kXPXl1repR7oq7glk6lCXHpsQIfeSIH/RyHbb0rV5367cjImaHMGqEGGMz6vOaLT7DySYVX
ZYAHNC9+3cyRmfVEbirby2tqlJc14xzriThKMZAxfPOkFB87cn7d+z+dXP/U7Vz9xG1c+dRtJBMp
EsoutiQtrRhvncVJHiv/ZOReMN59HCd5bNRxamV5j8vQmvD9O+4NobruVknCqlViVidLOlbyGCay
Rk3k2s2FPnYY8uZd9ud9ux/Fq5a/PNazvOmJOznl6q9jlI1r21Hzmypp4XGTx+o2NileYE3DdNTD
rypGFaoDarvvxxx8RKhqClopqFar89rEZ1T3JWTM58ZwX1c4z0pJYJXvz8QDjXxeJNIDhSxHbrsn
l7z7bFJee0JtzWJWCTXA5uECR5z7FHc/avCSlYUlttu7hgXayHGaIbJTdUm38hzii7ghV7DYe+cC
N3x2OXYHvuHev/ZR/vehP/Onp+/GB2xl4RabORiKL39V0porx3An1kzX2l5Z0MZa03EGblS2pqHq
wI0q/6hedxxHqEfOu+pULHS5xagBCqGPUYokFqfucRTHvOQgXrp4+4af4/WP3s6H/vxdfK1xlT3u
d3OcpVpV1IqCFqdmulYv8vKhRh5+nfcCJrxIVFxT5Xoqrqmytq41XbwHOoZIlz933EtD7UOPcRXU
lOkaz2n0S4ExhmE/xyFb78pVp34LNYOayVRj1gk1wFDOZ9/PP8nDT4OXHGtZNzPuHGdNqz9nqtvj
nmdzPt+gtcVgIcOzFyxnyZwEnUpfbpBv/vMX3LPxGZ4aXIsxkHS94neQKicrlagcw53YJGRiDDeO
4I21pit/t46tma4Xm64erp14zpW7j41aU/xnrfOuZGma4s4hhpyfx1EWO87dmuNfcjDv3/vNJJyp
/X7c9MRdvOcPX0cpK7KsxwR2VbVw/YRrjFUzrWNkeVd7Sap4W6t08KrxLKqkF1R8JrWvvcK1Ue8e
lJZXyGSvdhoVrqOquFcN5o/cq5JI9xcyvH7bPbnkxHNIJWa2JV1iVgo1wOZM0bJ+2OClSy5M1aaa
6dZ+Trus7cav0WCMxcZhn2cv3Ipl8zpXqEdz+cM3cNvaR7nm8VvwsUg6bjQHG1WuMjBKVaiXhvIX
c/FHteLSzaqXrujFHvetXNlSjiPS47K8J1zXxPOORNqUXBJRYiGG0IQM57IsSfZy3K6HsPfiHTlm
10Ob+uz+8thtfOia7+ArQ8Jyx2aD13T7xqyXLqbe1xTpUR6YGuHl4gFGuaWpJ9KjznPs7jWtaV2M
ncRxeRtdtFQbjEtT79Djgu6TzfIebYNrYxjKD3PUDq/i0pPOxbYdZguzVqgB/DDkuG89zTX/LJDo
slF0TnJYnDXTsR1qW8PN/nxjDEM5xeffZvHFY2bW2L9VG57m3rWP8rP7r+b53EBRGxW2ZWMpC1X2
71bIxa5jSVe2OsfVVFcUg4mW9Jg1FdS2suVVZU2demmodF3F4+hSsUy0qFQXbADLGHbpXcLnDjmF
bXuXsMP81nXgenzDat50yZlkdAHPcVF13b6NZHkX74Wqdag6VmaFB1LZI1L5h2OOW9OVXRTRWJZ0
cf0k6qWJk7E95vPrJJ3VSI0v5XiHWtOfG+LM/d/Jl474N6wOnSs9WWa1UJd414VPcen1Wdy0i+NU
f42czmzwToldt9IlXu38Cz5su1WeB7+6PTG+LToOrTUbc/38/N6ruHnto6wZ3siG7AAJO4FnO+Ur
isLZlRJ2Rpk99ZLHJiZ7j77LY+LSlY3fiZY0VLK8KmR51xLpipZ0tMaMOkiIIR/4BKHPVl3zWdq9
gMOX787pr347CcttSZetSjy7eQ3v+O2XeGpoPV1uKpKFqcSlS/XSUCfLu07y2JjbWsearuC1GNss
hdrXFDt5LLq+WMlj5cNHB248Lj1ZkS5a4Sbq5uYXCnzmgHfw+SNOrXe2M5ItQqgBPvo/q/n+H4ex
LQfXHtWRahTTmQ0+VZGsu8aAUaa95VhV9g1Cw5wuw4Nf34oeb+a7p+5/cRV/efpenh1cxx+fuh0f
g+d4OMqOEhLHjNyEMaJYNRu6SXHpat3HatT7VE6wGrdmnKVpiu51jcEYQyEMyAcF5ifSHLnjvizr
XsSbd9mflyzavm3PqS87yIm/+TJ3bniSbjdZ4W9jVKJVvbi0Himxqu0Zr7NuXOihokjXeBY1EvEr
r41VitVAi9Dy58bo5V3lOqoKdQ03vimWouV1QFjI8/O3fo637nF4nLOdkWwxQg1w1d0bOeGCdWRz
NslE1LN2TESwSVncUD95qynlVvWO0aZyrHrbtTEEoeG8Ez1OP2wRs4kH1j7GoJ/j8oeu55YXVpIx
mkDrYh25wlZWJBDFuO2I+7hCVvJUaqYrBGErl1qN3bOyNV0sz4FSeTOG6D9Co9FGExqDpcBVim6V
4OhdDuCwHfZmWc9Cdlq4bbsfy6jbZjj/5kv42m2X0ZVIYVtWxReourHpopDVFKZRylhHQ6kqWjXS
vquX19VYG7NmOrbLu/yrGqOXd4WXw6riXivWbiBEkwny7NC1gB++5TMcsGLPGCc7c9mihBrghc05
XnvOalY9bfBSFlZxTKYxBiywaG0Wd9zjtDu2PNXj19s/5yvesCdcfsY2zEaMMWSCHL7WXPXwX7n2
ydsZ1D7rM5vZlBuM4rRYOLaLpazywINSAHEkrFypMcbYLl7Fn4z7Lo/Tfaxa7NqUS6aKVxOdhzH4
Ooz6ResAhWLrngXMTXSx2OviLS89iDfscgAKRVci1e5HUJPfrbyJj//5+4SAZ7vFl/bo6qtnsY/c
e40affsrLosVmx6XH1Aj2jDmhxPi0hU/YNzamusmXl9doR7TfaxOZLpKXLrGaVe2pIvtVAfyGd6w
/V788l1nkfY6+3etGWxxQl3i2G8/zlX/9HETDrY1Pf284xyn3bHrqZZzxT2/UFssXRBy61lL6E26
bCk8tuFpbnnuAdZmBxgI8ty++gE25gbZlB8CZUWDECwbh6j2N7I5oPw1qEz5S68cA2fkT7gce63Q
2IRS5nWxuQij9ivZNwBGKzSa0Gh87ROGAbY29CTS7DxvKbst2YnuRIolqV6OfdnBLEjPa/dtnRT3
v/AIp199Po8Pri26wuuJNNRtbDIuy76+SEf/mGBZVrQoK1ihdUR6TFy66rpRJ2Vidh8b1ZkvOqsa
Ml2lXrqqtFe6dhNdecEEDGeH+fzBJ/GFWRqPrsQWK9QAl9y6nhMvWAsmQcqzJrjCRzMdE7SaVRNd
7xi1yq2AKZVrxTm/0jzuvmyByz8+h2NfOZctlTUD6xgoZFiX6ceyHW5dfS+rNjzDyvVPMxTkCABT
jnFGyTPR/xTrRsdZzar851yW5jEyHn0Xm8i8GuXLNkphASqMJjUtSs1hu95FHLrD3qyYvwzPcuhN
pFk2ZzG9yfb2aW8mfdkBzr7xZ/xi5V9IJ9I4yqnxPRDD5T0uwD9pl3fVQus4celxx40Zl47dfaz8
uZOZMR39oKG4tDFoIBNk2a57Ed96w79z5Mv2r3eGs4otWqgBnlyX48QLV3Pbw4aEZ5et6/F0QgLZ
VF8WmhF3bt7+hsGsxelHWpz/7sUIozHkAp9QazQax3K4dfV9bMhs5vGNz/FiZiMKixczffg6HGOF
5Rn756wAt/xfUaJXwnJZ2r2AXJhnz8U70+OlefniFey4cFuMNuVubI7t1K2AmC1c/sANnP33i3kx
2093Ig2YiXkD9YRsVF5AyQ9SOzGsSpw2rjVds2Z6nDXdgixvoxptEVp6eayx3zhRN+VwS4FDlr2C
/3vv17FnWelVHLZ4oS7xpd+u4bzfb8b3PZKeLo97g+aJ8HS4tFuVANb87YYgtPC8LHefs5Rt5s6M
5ifC7GXtwHo+cd0PuO6JO+gqjUAtT7Qx1O3lPS55DOqL9AQLuUZSWHyRHtVApNlZ3o0kj5XvyciO
Nd3kY6sWo54Lfo6tvR7Oeu37eferjmr0kc4aRKhHcf/qIT57yVquuzvAcS1cuxTLm1oWd2lNq61l
1NR6k093XbUxhuECXHpGF8fsOQdB6AT+tOoWPnndD9gc5PAcJxrOUm/G9DhrukYC9ph/1ChnH3Pw
MVZozO5jtbuUjVpvTPwZ00XXfiyZjlN6Nv7YRTEvhAF5P897dz+SMw8/mWXzZlZzpGYjQl2BH1y/
li9ftpmNfRZewsK2YarlWK3MBG9W7LpV+1fb1xiDH1rsuE2Wu7+yA4LQKWzKDPD5P/+Qa566k0IQ
kna9Yki/iszU63EdN+u5SkuyMTHdOt3HynXgECvYrHWdDPYq11k3Ll3hemudtsEQGE22kGfnuVtx
7uv+jTfudlCcs5r1iFBXYSDn8/lL1/KTG4YoFFxSXvT+O7pRSieNuaz5IjDF5idTSVCrd36hjt7O
H/rGQrae4zXwhASh9dzy5L386K4rueqxf9Kb7sVVFigVJe2Vft/jNDaZQvexTnJ5x5ox3VD3sagU
UGMYKmTZJjWXE17xWs4+6rRmPL5Zgwh1HW5/fIhv/GE9V9ySw3ZdEo7CUkQuLtP6mukpH6NY1tDK
6VhTtcQzecWJh8BPTtkaQehEfvvA9Xz75l/z+PAGkrZbnMZFsdd3K3p5V6itrlOKFf2vil8vDc3v
5V3Rkq6wT/FFJzSaQhAQ+j7v3+soPnnQu1g+f8t2c1dChDomf3t4gI//Yi0PPmMItSKdiITHskpx
7MqZ4tPSgWwKHcpKaybr0p5aG1JQyhBoi63maq79f/PZfsHsGEsnzD6MMVx0++/58b1X8/TAOpKO
h2s5lGaXVo1LQ+2SrSoDNxqxpMuWdyyXdwOlWKMs6br10qVrGZ21PS6aXZIbDWT9HF22x27zlvO/
7zmXRV1zW/DUZgci1A1y8T/W86u/Z7j+niGUmyRVbEU6olVjk6XaHbueyovAdJVzGQN9mYAL35fm
tEPnT+7BCMI0oXXIuTf+nGseu51HNj1Ld6oLW0UWdiSSo37fxzVXr9ERdBQVaqtjNAuP18u7KOq6
kXrpOj25J55K+QcaU2y2EjXmKQm0a+D1O+7Lh/Z9CwftvFdrH9gsQIR6klx7Xx+/uqWfX9+cwVYe
jmVw7FL/8JK12N6SrplTzmUoBBaL5+a599ylpBNbXp2kMPPYMLiJG566mx/883JW9a/BsR0cy46y
xMvN31RZqBsZuDFhbZ3gd4XW7lUodlYzxHR518lkr3UdxUYlAL6JWs/aQcj7X3U079j9tbxq212n
94HNYESop4ThmQ0Fzv39Gq6802fDACgskq6FUrqlXcpKa9rZKrTe+de9/nJv9cgNt34w4O9fnsNB
O8+ezlfC7Cfr5/jXmif4wvU/5vGBtfTnMyTsBAnLLtqgVTKlq86YrtB9bMK6kY1jennXbf2p6/cp
H/O5Gq1q9OQee9oRxUbxgYJcIY+lYOv0PN76kgP52CHvZmH33JY/k9mGCHWTCHXIN69Zy40PBty4
cpjQd0h6LrYd/RmNfXtVTbFGZ6q1XfnYhrxvsd2SHPefu11zHoogTDOPr3uGi+65mvvWPsE/V6/E
8zySrlfutT3SQAUm+p6ruLyhah9SXewOUt+SLq6PW4pVqmmu230sagQTqUhUAx2YkKH8MF1Wgje8
5DUcuHRXTjvw7e1+NDMaEeqmY/jrw4Pc8XiB71y7jrWb3WjIgq2wlMEuJp+1tEvZFMux6h2/VS8J
2hj8AH70bx7v2k9i1cLMJVvI8ven7uf3D/2Nq1bdTE6BazvYSmFZFpaxis5kGFHORhLIRlneMUdX
Nubypnoplim/dWAwhGE0wCU0mtD32al3CR87+AR2mr+M/Vfs0e5HMSsQoW4hA7mATYOac37/PH9/
KKBv2GHDQIBlWXiujWMBjNz+clmmacI860nPojZ14+utzATP+bDDEp/7zl0K1E60E4SZQH92kPvW
PMaFt1zGkwPr2JwfZiCfwbFsEk405hQTSbSmaHXHzfKua02XcmaKlu8ke3mPkQkFfhjihwEm1Czu
nstcJ82bXvJq/v3A4+lyU6Q9qd5oJiLU08jjazN877qNvLjJ5q6nszz1YgDGxXFsEo4p12crFYms
muAWa0aS2uj674mz79rpUi9t2zSs+eH7k3zgELGqhfZw02MFXraVYklP80ew3vjI7Vz96K1sKGS4
5cl72JQfQtk2CSeBU4prm5G/yol/K40M3BgZXRnL5V0S6XJf7uiHoTH4OsD3fZTR7LZoB3ZZvB07
9i7hlH3fzPItvMVnqxGhbhOrN2S5d3WeDf2Gfzw6xB/uHmYwqzA6gWVZKAVWsexLAZYaEW7LqtZ0
eLQ1XPrZmKLG8mTDke5qkcu5lDVqjIXjgK0anyJW15qu03yldOxCoFi2oMBNn1/C/K4tZ1a10Bnc
/kyW1307ZI9lFicfoDntgO6Wfdb9z63i2YENbMgP8ocHb+KuFx4hq0OwrWJuiypmkY97eVdAtWYl
o1zT0VQsJnQfM+PWGgxam+LMAEOgi2JtDCoI2a53Eftv9woOWLEnC7xu9tt2N+Z09bbzMW1RiFB3
BIYX+30KvqIv4/PbO/v4x6oMz28C33cZzkPe1+T9UjJIMQtz3B+ppRS2NSKU2kCo9Zg1qhQZUwbL
gpSrSLkWSRcsJ8/u29n8a7VmzSYP1x77Ga3skDZ6X2MMgzk48y02XzpmUbsfjrBFYXjfLzP89cEk
rm3wjWbZgpAPvzbkHXt2FXNMWkPez7M5O0hgNM/3r+fiO/7AIxufYWN+mFAphv0s+dAnH/hjXNFl
VzmAAseyGRlrGuWF63Ds94AZFXKzlIVnu3Q5Hp7rYgWaZT0LOXSHvThmj0NJu0m63RTzRJjbhgj1
DOCFzQVWPj/Mg8/lebFfs6E/eustFFyMscpW9/rhAs9uDLBU9KI8v9thxUKPQEfmt7JCXDcEYMkc
xbxui1evSLLHtl3MSTnlz/vLQ30c963BYrvU5jRwaTRuHmrIByEPf3MBS+dKD3Bhevj13Rk+eYnF
3JSNsgCj8EPwQ+jpGeI/j+lh9+Uh282b/rGsT214jpUvPsEj659hIJ9hfXYAYyAo57ooAh3y+PrV
+GGAUoogDFnUPZelc5eU3dlKGzyiRkPb9i6kOxnNI99v+90lttyhiFDPMp7dlMO2FKGBxT02nuNM
6jjLz3iK/uEErj3iAp+s23syCWbGQKZgeN0emt99dJt231ZhC0Cj2fOcYXKZFLajR1VNRHX+WisG
C5qlC/K8eQ/F+w9wWdrbeXPUNw33kfMLWCoS7q17F2Lbk/seEDoDEWqhIj+8YT2f+mWBdCIS2Xa0
GtUGhvIhPzo1xXv3n9fuWyLMcj5zZR+X3txNt6cren+ir0pFqBXDBc3iXs3SRRnOPLKLV23r4jmt
c4sLWzYi1EJF1g747PbZ1fh+CtvSTbWW4+8ftRad35vnga9uTTohVoHQGu5+LsdJP1ZobWGpOi+W
xSYfWoOvFZZl6O0Z5jNHeLxsK4s9ljpIaaHQTESohaqcc+V6zvpNnnnd7epwFrkcB7LwwSM0F7xb
xmAKzScbBLz+ghzPrvNIuvFmzJfTsQygLLS2GM4bjJPl8F0s9t4h5Ng9XbaX/AqhCYhQC1VZ+UKG
Q85eh9YJ7Apa2oxZ1PWT06LYYC4IueiDSY5/lbjAheby7RsH+dbVKeamo8rhehPtSoypVCjVPmJR
8CFvAraZo1jYG7DfzgU+dnA3SccicgqJi1xoDBFqoSan/ORFLr0lpDs5sWZzKm1M6+0/1hI35H3F
gl6ff31tyaQT5ARhPLc+lefdPwlJWi5KNSbSlSzvctlTyTVuSp0GNV4yw5teYfPGXT3mdRl2XmyT
cmRSnFAfEWqhJrc9McjR3+xHazWmhjSOtVyvHKtW3Hv8sY2BoZzmiD01v/voVkgMUJgqBR2w739m
GB5O49g6pss7Xl5GSbKVodxFzGBFZYdhSMLLsde2FnsudZjbHfCyrWGvZUl6Pfm9FiYiQi3U5Zjv
ruaG+x1SiXilWvW2Ty5uXYpXa75xUoKPHC7tRYWpYPjM7zJcdqtHV5Us76p7mviWd2l96fe9lDlu
yvXZhoAAowL+442GDx/U1e4bI3Qg8vom1OXCkxeTKRQw5W5Hpm6Wdz3LJI7lMm4PwNCdtPjcZcP8
64VMu2+LMIP58c1ZLrnFIu1FdkpckZ4sqtxNMAohKUuTcDVdSehyXHZYYHPqa6TZiFAZEWqhLtst
SHLSwQ7DOTOqjXCzhTiilsgrFY0KdUnylu9u5vm+fLtvjTADueHRYb74O+jxXCzVmEMxzktoHIqd
u8FAITCcekiBpMSrhSqIUAux+PSb5tHbFRDq2l9ScTPBa22r5xJPuLBuc4KP/HITo8eECkI91g0V
+I8rDHMSCZTSdUfKjqbe72e1fWqFgLRWJNMZTtlHXN5CdUSohVjssayLkw5Mki0YVJ3YczVK22t9
Mcb50lQKujzDn+51+OSl69p9a4QZg+HUX+RZt8nDsaMhFY1ax5OJTVc7F1AMFgK+d4I0SBFqI78d
Qmw+f+w80imfMKxuGU/WJd5o3FspmJOC/77R8F83bW73rRE6HsOHLh3inieSpBJjY8ax9p6ky7v6
7zvkA4u9dvA5YIWMchVqI0ItxGZBV4Ivv72bnN+4u7kZCWZjt0etG9Ouzcd/keP/7h5o9+0ROpjT
L+3nqrtcelOgVP2EyEo0IzZdwhiFxucjhyO11EJdRKiFhvjAIfPYaRufQmAxOj5cqpuuRLy60+pU
j/MpbMvQm3R430+G+OO/Btt9e4QO5Ee3DHD1PWl6kzZKRS5naK01XWsfYwyFQLHvTnmO2CXd7tsj
zABEqIWGSLs23zt5HoN5H2NGaqqVql2HOtVyrupEYp20PU758SD3PTvc7lskdBDn3zjA165MkHat
Yoa3ark1XW/QjDYWOHnOOabzRmQKnYkItdAwh760l+P2saMhBDHLtapRspZrWR9x9nccTRh4vPMH
/dwrYi0Atzyd4dt/ckm5DpalKYk0NGZNN5pAVv34UdOe/iyc+caQnRaIUAvxEKEWJsVXj59Lbzok
1MSantXottHU63AGUV1qwtFs6PM49jv9PPC8NETZkvnrYxlO/aki7UQiPdrb02g/70apdfxCoNh+
yTDv3EumagnxEaEWJsVLt07zueOSDGR10aqeaPnGiU03s8OZUgrP1QxnPN5+YR/3rBbLekvkxseG
Of0XiiBwcSxTFunpcnlXQ2sFVsA5x9p0y2x1oQFEqIVJc8brFvKqXUJyvqKah3qqHcom88XquZqN
fR7HXdAvMestjO/cNMAHf24TBi5ucdDGaJqZuV2JWuVYGR+O2D3L4Tun2n2bhBmGCLUwBRTnv2s+
lu1H1sIoWtmhLM7xPVeTyaY4+vx+/vigZINvCfzo5gHOv9bDwsZxxol0gxWFjcam6x0rCBXze3P8
4Pjudt8mYQYiQi1Mif136uYLx3kMF0zdxK/xTLZDWRwXpmVZJJwQv5DkuAsGuexOqbOezXzyigG+
eqVH2rWwbTOhAsFQvXxwPM0txzIYY5EJC3z9bQr5yhUmg/zWCFPm029YwIqt8uQKUVZt3EztyVDX
2h710UopXEczL5nkAxdl+MGN0sFs9qE57ZJ+Lrk5SY9nY1kVRLpUWdDAhKzJ9POuPFtdMZQ3nLBf
wOt2EZe3MDlkHrXQFJ7ZmOPAczYwnHVwrOmeVT1u/wmzhQ2hVgzmDB98neGrb51PypVuUDOdzVmf
d/00y8pnUnR7gKos0o3mOkymJKvS+qixicWyJVluPCOJ2EXCZJHfHKEpbLcgyX++s4vNgwHQvEzu
Rvat3nil1MFM8bO/WhzxrXW80Fdo9y0TpsCNjw9z9IV5Vq3uotuL2oJWs5ibmbkd+zhFl3feFPjK
0eLyFqaG/PYITePk18zjhIPGNkKpxFTqqie/XaGUodtTPPSMx0Ff28RtT0pG+MzD8MN/DPC+ixRr
N6VIJcIxbUHHrGzyII2KZ1PhMwwGjGIgq/nysQEHrRCXtzA1xPUtNBVDyH5fWcsjz9kk3bFfYvVc
3nESyKbkEi/tbyAfACrkC2+1OePwedBA/FJoD8OFgM9cMczV9yRIue6ERibjaZYLu9b6Sr+Txhgy
eZvDXzHMRSemkd8tYaqIUAtNZ+ULGfb54ka6XA/bHmndOFWhnWxcu+L+BkID/RnNYa/QfO+kOaxY
IN2iOpW/P5Hl45fl2bCxm3TK1HR1A0RGrcFSjXUhm2os22DwfYt5czP87kMJtu6REZbC1BGhFlrC
hddv5FO/yjI37aKKqdi1hLbe9smKeL3txsBw3rBgTsAnj3L590Pnt/vWCWMwfOP6QX78VxuCBIlE
DPvURILZSKvQRqsQqol0GCoyQYFrPga7bZVs980TZgki1ELL+PRvXuTCa2FuWmFZk3dR1txex3KK
Y8krpQhCRcbXvHHvgPPeNpft5ot13W6e3Fjg+J9kWLexi1QCLEvHspArZ/7XXj9Vl7fBYLQiH2q+
8JY8p+zT1e7bJ8wiRKiFFqI58ptruO0Rl7RnqtSZTsJtPX7/Kl/KjR3boI0i7wN2jvPf1c3Jr+lC
8i2nn0IYct51OS6+GUyYIOEYaKGFPPX1I1Ox3n9Yhq8c1YXEpYVmIkIttJS+bIHXnreOJ9Z4pFwN
qvFWo9XEtqkJZtFPMAa0tunP5dlje/j+yd28cnm63bdxi+HiOwa5+GaLlasd5qQtLKUBGoofNyK8
U49NRyKdKSh222GQqz7YjbzcCc1GhFpoOfc9m+HAczaStDxc25TFupWx53rba8fFoy/fnA9pT/Pq
l4Rc9J6F9KTkC7g1GB5+0efTV2RY+UwSCxvPjazoUiJiK6zperkR9Y8fvdhlCxbLFw/zx4+kSbny
OyI0HxFqYVr466ohjvl2H0nHwxmVCd7UTO4G9o9rbUfucEVoZfj4kSlOPzzNoq5Eu2/nrOH+5/P8
4jafX94KPU6yOExj7GhKiCemjVrHU41NR53HbLq7s9z0KZdeGV0ptAgRamHauOaBAY77ziBzUy6W
mqy1O7KmlVnko/eP+pdbDOQCdt7acNSecM6xC5A45OQZ9gPOunqYa+5zGRx2SHsKhZ5Qdw/xRTru
2tL6RkV69PGNMfihIun5XHwq7LmNJB8KrUOEWphWzrt2PV+9IiSVsHDsZsWWG9+/0e2lblNBCLlA
M6835LTDbN63fy+LesSSiofhyY0h3//bINfem2Q4Z5FyrKhxiQJoLH9hsmunuj4qw7LwdcCVZ4S8
fImUYQmtRYRamHbOu3YDZ18e0pOysJSp2NlpsuVY9faPW65VdXtRsENjEYRgucOc8douXvdyl322
l1aR1bjhkRx/eTjg4ps1SSuFYxtsi4qDNKC1buypJJAZDDq0yOmAz74pz2n7y3xpofWIUAtt4WvX
bOBrV4akXQvLGturebLlWOXtLba2o+NHzVK0sRjKhSS8gCN3c3jbPhZv2WNOu29vh6C54KYh7nsq
wdUPFkiqFKmEiUZRKkUpWawSrRTeycamUaBDi2wYcO7b8py4t4i0MD2IUAtt4zO/WceFf1TM66I8
WGGq/cChebHpeNuj89YaMgVDV9Iwv8fwjlcbTjt4Dj2ehWtvOZnAmULIxozmrKsH+dfqBC/2OWAg
6ZaEuX4cuZWZ25OPTSvC0KJgAv7fm/J88DUi0sL0IUIttBHN23+4lmvvsulNKxTTH3tu1vbIJQ5g
EWgIAou8ybHH9gEfOKiHFYsV+69IMRsT0LTR3PhonjWbHL5xfT8b+tJ4loNtGxwrumJDfKu3leVY
k3V561CRCQPOeVuek8SSFqYZEWqhreSDkG/8cTNfvSJgbtrGrpFgBkwp9tzq/Ue2R3XYBqLezwWN
l8xz2Es9VmwVcsweHvtuN9NbTBquXjnETatg9QaHvz9WwDYeadfGsjRgyglircreni6Xt9aKnA75
jzfn+cCrRaSF6UeEWugIvnbtRs77fUAqYTecYNbqmut6+1fePuLKj7Zb+CHkwyiJbn53yILeAie9
JskRL+0m6RrmpC3smNOeppN8oBnMaQqh4pK7hrjuXwEb+j36Mha5AiQdm4RTcm2bCRncrbSQW21N
a2OTDwPOFktaaCMi1ELHcN61G/jy5Zp5KWtUwlErWoU2f/+4242JktBCA1pHGWlaBczpKfCanWyO
3b2XtBcyJ23YYYHD4p7pb66yenOeF/o0/VmbjYOaK+4f5v5nFYV8EmUsQGFbBkuBZUXtPQ2mZoJf
0y3kSYyxbNSa9kML1w355FF5Tt1PRFpoHyLUQkfxv7f189GLMziWixtpwvTPqm7pdlPOdS795Rmj
0MYi0IqcHxJQIJkwrFik2Gu5R9pTJFyfhb2w7Xyb7RbYvGxJgm5v8vXb64cKPLkxYNVan42DsH4Q
Qt9jcwbuejbHmj4oBDYeCTxXRa1fMcWkv6I4NyDAzVxXWht3QlZj1nTUFrQQWCRTPj87RbPPcim7
E9qLCLXQcVx13wAn/SiDZztFgZhcbDluh7NmWcvVtsc9B1TRYWwUhqi5ih8aNBpjDI6tSLpRBnXa
U3QnLLTS2E4eBXWFSGuFCZNYSjGQC8n4UaZ6EECowVIKS1kkbIVtR8l9Ro18Pahx7uw44tfIunr3
qdFjNnrcUm5BtqCYPyfPD05U7LetNDMR2o8ItdCR/PPJDG+9YCOFfJqkN7mmGK12acf9jMbPwTDm
j9JE87xLbnMDaGMY+cuN9o0jXKX6ZatYC158PyjfXVOMMSsVJcUxhWYkjQpqexPISlOwYOmiLNed
4dHlurE+QxBajQi10LHc/1yWE364iTUbUnQlS27X+ElKU+kHHvf402FtN7bGVFkzflTkRBGOa322
wuXdbKu7keOCQWvFUF6x107D/OK9aXo9O9ZnCMJ0IEItdDSDeZ+PX9LHb26FnqQVTVaKMSZzNljb
zTjPuGsaOZ9mu7xbUV8db33klQi1hW9C3rx3lu++tYfZWOsuzGxkmoDQ0fR4Lj993yIW927ie38q
0OMlsC0N1Hf11hPZekz2+M2iWecZZ03cz2rkupu9rhHqX08k0n5gEVp5vn685u179jb9PAShGYhF
LcwYfn17P5+4ZJig4OG5UVvHSnSKNT0dFnkzrOl2WckNJ4UpmlSOFcWjc77FvN5h/vvkBK9cJjPG
hc5FhFqYUaxck+H9Fw2w6lmX7qSaMNADpj6rutb2esdv5mc0Q8jrfU6c4zSyrtHs7Ua6lTWjHCtq
YmKR8TX77Jzhv05Is7BLHItCZyNCLcxADCf993quvgeStoNjm2Jpk5rG6VnttZSbcS2NrGuF6E9n
bLrUi90PbAIrz6der/nwQbOz97ow+xChFmYsV943wOkXD5HPpUgmDIrJ11yPXtNKa7zeZ8TZHuda
GjmXOPcEaKoLPc65NXI/qh87KnUzWjGcV2y3VYazj3E4dCepjxZmDiLUwoxm/WDIey5axx2Perg2
JNzWWbLTJbDNijs3M4O7rR3IJl03HcWi/VARmJDX75HlR+/sAqT0SphZiFALs4Lv37iZb1xTYCjj
0eVNrLmGzmg12ikJZHE+q9FjddIYS2MMBovBnGH5gjyfOxqOfnk61nEEodMQoRZmDU+sz3Hm/w1y
3X3QnXCwLcqCPVVrOc6aThDyRta0y5qG1o6xNAaCUJEJfN6xX8CX3ugxJykJY8LMRYRamGVoLr0j
wyd+PUgh55FMKCzVnNh1K3uCl9ZMV5JZu8qxoH6su7y2wXKsaHa0RS4wLJyX4fzjXQ5a4SEJY8JM
R4RamJUM5X0+cWkff7gHQt8h5UU9rsfPSobpHXNZi+mIgcc9TjvXNTLCspTNDYpswaa3O8cJrw74
jyO6EYEWZgsi1MKs5h+PDfPF3w1z5+MOc5J2sZTLTJgENX1jLquvmU6393QLcKMx7Po106WQBvih
YiAf8tZ9CnzscJeXLvbqfoYgzCREqIVZT6A1f1o5xKd+nWHzQBLXBtuC0gCLTnBpQ3MaoHRyF7Jm
JZBF90vhhxAaw9KFWf7rxCQv38pFrGhhNiJCLWxBGL74u41cdrth7WaLnqSDbZu2xpVH96SejpKt
mdAqtPraqD+31jb9eZ/tFgacdrjmffuKm1uY3YhQC1scz/Xl+enfsvzs5hyZbBrPMZGFrUxpsjPQ
GV3KpntNI8eajnIsQ/RMjFGEGnIBzO3JcsZhCd6+ty3Z3MIWgQi1sMXyXJ/PD/86wP/8I8QveCRs
cGxAlRKUWt8TPG5XsOnq6d3Mz5vM2pH7EXUUwygKIYTa4CTynHmUxdG7JVjSIwItbDmIUAtbPDk/
5NOXb+aOxyxWrYlqsF3blKdzRVZdY5nicdZMtzXdzCYora2DjmLQhcAirwvsto3ioF1zfO6IXsTF
LWyJiFALQpENwwV+eWuWy+7MsfIZj96kg22HWEqNcYtPV5vPTo5NNzVrvFRipcAYiyCwGfAL7L9z
gbfv7fDOvT3cBoZyCMJsQ4RaEMYxXAi5/ekc5107xKpnPfK+hWsV3eI0b/BGp8Wv41xX3OPFvQcR
Fn5oCA2kvJBXrshx1hu72H6BhWtJX25BEKEWhKoYntlY4OxrBnjwGZtHXwTPckm6YBXLu0rxVMbV
ZU91stV0WtONdgyb/IQsU9wGkWfCIlPQYAW8bBvFrsuznPXGOcxJKsTFLQgjiFALQgwKOuTXt2e4
52nNb+/OE+RTeI7CsgyWimTFFJPQZmKr0FbNkDalWnUTDSHVBrRWZIOQrnSOk/fzePlyzXGvSALi
3haESohQC0JDGB5d6/PQCyHnXdfHc+uSBKGLhca2FK5joZQplxVValcKU8sWL63p5FahSkWdxQyK
IDQEOurd7ToBy5dk+MpR89h6bsiOCxNNfDaCMDsRoRaEKVAINRfcuJm/P2yxfkDx6DqNbVzSroVt
A2igKNfF8YuzY4xlyVYmyog3ZdsZhSLQFlk/xHICdl5ssWSuzwG7aD584BzGhwoEQaiNCLUgNIkX
BwtcdV+WweEkv7pjgCfWgWvSeK7CtQ1KaSylorKv4uCJEqMzyjutHGv0uvGubEMUczZG4QeKXBAS
2nn2XaE4bBeXbeaFHLu7R5crdc+CMFlEqAWhBawfKrBuANYNhfzPrUPc9gQYP0UugCCMeo1bqOj/
i1pqSslpxX9Xc523thyr1GiEkZMwpXGTitAYtIbQRPu7jsK1NYlUloN3MZy4dw+9Kdh+oSLliDgL
QjMQoRaElmPI+QZbWVx8ex/XP+zTN5RgOGfx/OaQgVzkLraxSTgWtgV2OfG5ZLdGlITVMPbPtl7r
0/HrRye9jf0KiD7YmCjxKwgUgQnRymCMYVEvLOiy6EmFbDU/z5t39zhilxRKgedItrYgtAIRakFo
G5p/PJHlkRdD+ocdgsDmnueyPLkhZM3myJWMcbGwcKyoN5rjKEpyOHFcsy7/l1IWjBHnUYtNsURK
Re7rUBdFWWuM0mgCelOaBd3wiqU2Oy9M47g5elOag3Z22WWRhwiyIEwfItSC0EEUwpB1gyGbM4Zc
AbR22JwJuf7RIYbyitueLICB/pyif8im5CnX2oYwARjU+JizAeVmR/5pYH5vSG9KYSvYf0eHrXot
Dl7RjWNrUJo5aejyYNkcBymbEoT2IkItCIIgCB2MvCoLgiAIQgcjQi0IgiAIHYwItSAIgiB0MCLU
giAIgtDBiFALgiAIQgcjQi0IgiAIHYwItSAIgiB0MCLUgiAIgtDBiFALgiAIQgcjQi0IgiAIHYwI
tSAIgiB0MCLUgiAIgtDBiFALgiAIQgcjQi0IgiAIHYwItSAIgiB0MCLUgiAIgtDBiFALgiAIQgcj
Qi0IgiAIHYwItSAIgiB0MCLUgiAIgtDBiFALgiAIQgcjQi0IgiAIHYwItSAIgiB0MCLUgiAIgtDB
iFALgiAIQgcjQi0IgiAIHYwItSAIgiB0MCLUgiAIgtDBiFALgiAIQgcjQi0IgiAIHYwItSAIgiB0
MCLUgiAIgtDBiFALgiAIQgfz/wFxLcTVOOyTRQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNC0wMS0w
M1QxMTowMzoyMCswMDowMEecRdUAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjQtMDEtMDNUMTE6MDM6
MjArMDA6MDA2wf1pAAAAAElFTkSuQmCC" />
</svg>

Before

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -1,43 +0,0 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'username',
label: 'Username',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Email address of your Vtiger CRM account',
clickToCopy: false,
},
{
key: 'accessKey',
label: 'Access Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Access Key of your Vtiger CRM account',
clickToCopy: false,
},
{
key: 'instanceUrl',
label: 'Instance URL',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: '',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

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