=Requiring files based on Site class settings
3 files added
49 files modified
3 files deleted
| | |
| | | namespace JVBase; |
| | | |
| | | use JVBase\blocks\CustomBlocks; |
| | | use JVBase\integrations\BlueSky; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\base\Site; |
| | | use JVBase\managers\EmailManager; |
| | | use JVBase\managers\ErrorHandler; |
| | | use JVBase\managers\InvitationsManager; |
| | |
| | | use JVBase\managers\DirectoryManager; |
| | | use JVBase\managers\ReferralManager; |
| | | use JVBase\managers\RoleManager; |
| | | //use JVBase\managers\SchemaManager; |
| | | use JVBase\managers\SEO\render\SchemaOutput; |
| | | use JVBase\managers\SEO\SchemaOutputManager; |
| | | use JVBase\admin\SEOAdmin; |
| | | use JVBase\managers\AdminPages; |
| | | use JVBase\managers\NotificationManager; |
| | |
| | | use JVBase\rest\routes\ContentRoutes; |
| | | use JVBase\rest\routes\TermRoutes; |
| | | use JVBase\rest\routes\UploadRoutes; |
| | | //use JVBase\rest\routes\BioRoutes; |
| | | use JVBase\rest\routes\SettingsRoutes; |
| | | //use JVBase\rest\routes\ShopRoutes; |
| | | use JVBase\rest\routes\ContentTermsRoutes; |
| | | use JVBase\rest\routes\SEORoutes; |
| | | use JVBase\rest\routes\QueueRoutes; |
| | |
| | | use JVBase\rest\routes\LoginRoutes; |
| | | use JVBase\rest\routes\NewsRoutes; |
| | | use JVBase\rest\routes\ReferralRoutes; |
| | | //use JVBase\rest\routes\MagicLinkRoutes; |
| | | use JVBase\rest\routes\ResponseRoutes; |
| | | use JVBase\rest\routes\OptionsRoutes; |
| | | use JVBase\rest\routes\VoteRoutes; |
| | |
| | | use JVBase\rest\routes\ApprovalRoutes; |
| | | use JVBase\rest\routes\AdminRoutes; |
| | | use JVBase\rest\routes\IntegrationsRoutes; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\SchemaHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | 'seo' => new SchemaOutput(), |
| | | 'schemaHelper' => new SchemaHelper(), |
| | | // 'uploads' => new UploadManager(), |
| | | 'userTerms' => new UserTermsManager(), |
| | | // 'userTerms' => new UserTermsManager(), |
| | | 'email' => new EmailManager(), |
| | | 'terms' => new TaxonomyRelationships(), |
| | | // 'terms' => new TaxonomyRelationships(), |
| | | ]; |
| | | |
| | | if (Site::has('feed_block')) { |
| | | $this->managers['terms'] = new TaxonomyRelationships(); |
| | | } |
| | | |
| | | if (Site::hasAll(['dashboard', 'membership', 'feed_block'])) { |
| | | $this->managers['userTerms'] = new UserTermsManager(); |
| | | } |
| | | |
| | | $this->routes = [ |
| | | 'login' => new LoginRoutes(), |
| | | 'integrations' => new IntegrationsRoutes(), |
| | |
| | | 'forms' => new FormRoutes() |
| | | ]; |
| | | |
| | | if (Features::forSite()->has('magicLink')) { |
| | | if (Site::has('magicLink')) { |
| | | // $this->routes['magicLink'] = new MagicLinkRoutes(); |
| | | $this->managers['magicLink'] = new MagicLinkManager(); |
| | | } |
| | | if (Features::forSite()->has('referrals')) { |
| | | if (Site::has('referrals')) { |
| | | $this->managers['referral'] = new ReferralManager(); |
| | | $this->routes['referral'] = new ReferralRoutes(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('dashboard')) { |
| | | if (Site::has('dashboard')) { |
| | | $this->managers['dash'] = new DashboardManager(); |
| | | } |
| | | |
| | | if (Features::hasIntegration('square')) { |
| | | if (Site::hasIntegration('square')) { |
| | | $this->routes['square'] = new IntegrationsSquareRoutes(); |
| | | } |
| | | if (Features::hasIntegration('helcim')) { |
| | | if (Site::hasIntegration('helcim')) { |
| | | $this->routes['helcim'] = new IntegrationsHelcimRoutes(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('feed_block')) { |
| | | if (Site::has('feed_block')) { |
| | | $this->routes['feed'] = new FeedRoutes(); |
| | | } |
| | | if (Features::forMembership()->has('notifications')) { |
| | | $membership = Site::membership(); |
| | | if ($membership && $membership->has('notifications')) { |
| | | $this->managers['notifications'] = new NotificationManager(); |
| | | $this->routes['notifications'] = new NotificationsRoutes(); |
| | | } |
| | | if (Features::forSite()->has('feed_block') || Features::forSite()->has('dashboard')) { |
| | | if (Site::has('feed_block') || Site::has('dashboard')) { |
| | | $this->routes['term'] = new TermRoutes(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('is_directory')) { |
| | | if (Site::has('is_directory')) { |
| | | $this->managers['directory'] = new DirectoryManager(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('dashboard')) { |
| | | if (Site::has('dashboard')) { |
| | | $this->routes['error'] = new ErrorRoutes(); |
| | | $this->routes['admin'] = new AdminRoutes(); |
| | | $this->routes['content'] = new ContentRoutes(); |
| | |
| | | $this->routes['options'] = new OptionsRoutes(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | $this->routes['favourites'] = new FavouritesRoutes(); |
| | | } |
| | | |
| | | if (Features::forMembership()->has('forum')) { |
| | | if ($membership && $membership->has('forum')) { |
| | | $this->routes['news'] = new NewsRoutes(); |
| | | } |
| | | if (Features::forMembership()->has('invitable')) { |
| | | if ($membership && $membership->has('invitable')) { |
| | | $this->managers['invitations'] = new InvitationsManager(); |
| | | } |
| | | if (!empty(Registrar::getFeatured('has_responses'))) { |
| | |
| | | $this->routes['vote'] = new VoteRoutes(); |
| | | } |
| | | if (!empty(Registrar::getFeatured('karma')) |
| | | || Features::forMembership()->has('member_verified') || |
| | | Features::forMembership()->has('term_approval')) { |
| | | || ($membership && $membership->has('member_verified')) || |
| | | ($membership && $membership->has('term_approval'))) { |
| | | $this->routes['approvals'] = new ApprovalRoutes(); |
| | | } |
| | | if (Features::forMembership()->has('can_invite')) { |
| | | if ($membership && $membership->has('can_invite')) { |
| | | $this->routes['invites'] = new Invitations(); |
| | | } |
| | | |
| | |
| | | |
| | | protected function setupIntegrations(): void |
| | | { |
| | | if (array_key_exists('integrations', JVB_SITE)) { |
| | | foreach (JVB_SITE['integrations'] as $service => $use) { |
| | | if (!$use) { |
| | | continue; |
| | | } |
| | | if (array_key_exists($service, $this->serviceMap)) { |
| | | $this->integrations[$service] = new $this->serviceMap[$service](); |
| | | } |
| | | |
| | | } |
| | | } |
| | | foreach(array_keys(Site::getIntegrations()) as $integration) { |
| | | $this->integrations[$integration] = new $this->serviceMap[$integration](); |
| | | } |
| | | } |
| | | |
| | | public function registeredContent(): array |
| | |
| | | <?php |
| | | |
| | | use JVBase\integrations\Umami; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\CustomTable; |
| | | use JVBase\managers\DirectoryManager; |
| | | use JVBase\managers\ErrorHandler; |
| | | use JVBase\managers\InvitationsManager; |
| | | use JVBase\base\Site; |
| | | use JVBase\managers\queue\Queue; |
| | | use JVBase\managers\ReferralManager; |
| | | use JVBase\managers\RoleManager; |
| | | use JVBase\managers\SEO\SEOAdminPage; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; // Exit if accessed directly |
| | |
| | | error_log('Roles removed!'); |
| | | error_log('New Roles done!'); |
| | | jvbRegisterAdminPages(); |
| | | if (array_key_exists('integrations', JVB_SITE) && array_key_exists('umami', JVB_SITE['integrations']) && JVB_SITE['integrations']['umami']=== true) { |
| | | error_log('Adding Umami tables'); |
| | | Umami::createTables(); |
| | | } |
| | | // if (array_key_exists('integrations', JVB_SITE) && array_key_exists('umami', JVB_SITE['integrations']) && JVB_SITE['integrations']['umami']=== true) { |
| | | // error_log('Adding Umami tables'); |
| | | // Umami::createTables(); |
| | | // } |
| | | |
| | | // if (Features::forSite()->has('is_directory')) { |
| | | // if (Site::has('is_directory')) { |
| | | // error_log('Activating DirectoryManager'); |
| | | // jvb_register_do_once('buildDirectory', ['JVBase\managers\DirectoryManager', 'activate']); |
| | | // } |
| | |
| | | |
| | | function jvbRegisterAdminPages():void |
| | | { |
| | | if (Features::forSite()->has('referrals')){ |
| | | if (Site::has('referrals')){ |
| | | ReferralManager::addSubpage(); |
| | | } |
| | | // SEOAdminPage::addSubpage(); |
| | |
| | | .icon-google-logo{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsMTI4YTk0LDk0LDAsMSwxLTIxLjQ5LTU5LjgyLDYsNiwwLDEsMS05LjI1LDcuNjRBODIsODIsMCwxLDAsMjA5Ljc4LDEzNEgxMjhhNiw2LDAsMCwxLDAtMTJoODhBNiw2LDAsMCwxLDIyMiwxMjhaIi8+PC9zdmc+');}.icon-apple-logo{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTkuNCwxNjcuODRDMjAxLjcxLDE1NS42OSwxOTgsMTM1LjEyLDE5OCwxMjBjMC0xOC40MiwxMy44Ni0zNC4yOSwyMi4xMi00Mi4xMmE2LDYsMCwwLDAsMC04LjcxQzIwOCw1Ny43LDE4Ny4wNyw1MCwxNjgsNTBhNzAuMjMsNzAuMjMsMCwwLDAtNDAsMTIuNTUsNjkuNiw2OS42LDAsMCwwLTg5LjMxLDguMDhBNzIuNjMsNzIuNjMsMCwwLDAsMTgsMTIzLjM1YTEyNS4xMSwxMjUuMTEsMCwwLDAsMzkuNTMsODguMzNBMzcuODUsMzcuODUsMCwwLDAsODMuNiwyMjJoODcuN0EzNy44MywzNy44MywwLDAsMCwxOTksMjEwLjA3YTEyMi42LDEyMi42LDAsMCwwLDE3LjU0LTI0LjJjNi41NS0xMiw1Ljc3LTEzLjc1LDUtMTUuNDhBNi4wNyw2LjA3LDAsMCwwLDIxOS40LDE2Ny44NFptLTI5LjIzLDM0QTI1LjgyLDI1LjgyLDAsMCwxLDE3MS4zLDIxMEg4My42QTI1Ljg1LDI1Ljg1LDAsMCwxLDY1Ljc4LDIwMywxMTMuMjEsMTEzLjIxLDAsMCwxLDMwLDEyM2E2MC41NSw2MC41NSwwLDAsMSwxNy4yMS00NEE1Ni44Miw1Ni44MiwwLDAsMSw4OCw2MmguODFhNTcuMzUsNTcuMzUsMCwwLDEsMzUuNDQsMTIuNzEsNiw2LDAsMCwwLDcuNSwwQTU3LjM5LDU3LjM5LDAsMCwxLDE2OCw2MmMxMy44OSwwLDI4LjgxLDQuNjgsMzkuMTEsMTItOS40NCwxMC4xNC0yMS4xLDI2LjU5LTIxLjEsNDYsMCwyMy43OCw3LjgxLDQyLjYsMjIuNjYsNTQuNzdBMTA3LjMzLDEwNy4zMywwLDAsMSwxOTAuMTcsMjAxLjg5Wm0tNjAtMTcxLjM5QTM4LDM4LDAsMCwxLDE2NywyaDFhNiw2LDAsMCwxLDAsMTJoLTFhMjYsMjYsMCwwLDAtMjUuMTgsMTkuNSw2LDYsMCwxLDEtMTEuNjItM1oiLz48L3N2Zz4=');}.icon-check-circle{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNzIuMjQsOTkuNzZhNiw2LDAsMCwxLDAsOC40OGwtNTYsNTZhNiw2LDAsMCwxLTguNDgsMGwtMjQtMjRhNiw2LDAsMCwxLDguNDgtOC40OEwxMTIsMTUxLjUxbDUxLjc2LTUxLjc1QTYsNiwwLDAsMSwxNzIuMjQsOTkuNzZaTTIzMCwxMjhBMTAyLDEwMiwwLDEsMSwxMjgsMjYsMTAyLjEyLDEwMi4xMiwwLDAsMSwyMzAsMTI4Wm0tMTIsMGE5MCw5MCwwLDEsMC05MCw5MEE5MC4xLDkwLjEsMCwwLDAsMjE4LDEyOFoiLz48L3N2Zz4=');}.icon-cloud-slash{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik01Mi40NCwzNkE2LDYsMCwwLDAsNDMuNTYsNDRsNDAuMTgsNDQuMmMtLjQ1Ljg3LS45LDEuNzUtMS4zMiwyLjY0QTYyLDYyLDAsMSwwLDcyLDIxNGg4OGE4NS4yMyw4NS4yMywwLDAsMCwzMi4zNS02LjNMMjAzLjU2LDIyMGE2LDYsMCwwLDAsOC44OC04LjA4Wk0xNjAsMjAySDcyYTUwLDUwLDAsMSwxLDUuOS05OS42NEE4Ni4yNSw4Ni4yNSwwLDAsMCw3NCwxMjhhNiw2LDAsMCwwLDEyLDAsNzMuOTIsNzMuOTIsMCwwLDEsNi40NC0zMC4ybDkxLjIyLDEwMC4zNEE3My42NSw3My42NSwwLDAsMSwxNjAsMjAyWm04Ni03NGE4NS44NSw4NS44NSwwLDAsMS0yMS44NSw1Ny4yNyw2LDYsMCwwLDEtNC40NywyLDYsNiwwLDAsMS00LjQ3LTEwLDc0LDc0LDAsMCwwLTk5LTEwOC45Miw2LDYsMCwxLDEtNy4xMS05LjY3QTg2LDg2LDAsMCwxLDI0NiwxMjhaIi8+PC9zdmc+');}.icon-exclamation-mark{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNDIsMjAwYTE0LDE0LDAsMSwxLTE0LTE0QTE0LDE0LDAsMCwxLDE0MiwyMDBabS0xNC00MmE2LDYsMCwwLDAsNi02VjQ4YTYsNiwwLDAsMC0xMiwwVjE1MkE2LDYsMCwwLDAsMTI4LDE1OFoiLz48L3N2Zz4=');}.icon-cloud-arrow-down{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDYsMTI4YTg1LjI3LDg1LjI3LDAsMCwxLTE3LjIsNTEuNiw2LDYsMCwxLDEtOS42LTcuMkE3NCw3NCwwLDEsMCw4NiwxMjhhNiw2LDAsMCwxLTEyLDAsODUuNTQsODUuNTQsMCwwLDEsMy45MS0yNS42NEE1MC42OCw1MC42OCwwLDAsMCw3MiwxMDJhNTAsNTAsMCwwLDAsMCwxMDBIOTZhNiw2LDAsMCwxLDAsMTJINzJBNjIsNjIsMCwxLDEsODIuNDMsOTAuODgsODYsODYsMCwwLDEsMjQ2LDEyOFptLTY2LjI0LDQzLjc2TDE1OCwxOTMuNTFWMTI4YTYsNiwwLDAsMC0xMiwwdjY1LjUxbC0yMS43Ni0yMS43NWE2LDYsMCwwLDAtOC40OCw4LjQ4bDMyLDMyYTYsNiwwLDAsMCw4LjQ4LDBsMzItMzJhNiw2LDAsMCwwLTguNDgtOC40OFoiLz48L3N2Zz4=');}.icon-caret-down{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTIuMjQsMTAwLjI0bC04MCw4MGE2LDYsMCwwLDEtOC40OCwwbC04MC04MGE2LDYsMCwwLDEsOC40OC04LjQ4TDEyOCwxNjcuNTFsNzUuNzYtNzUuNzVhNiw2LDAsMCwxLDguNDgsOC40OFoiLz48L3N2Zz4=');}.icon-cloud-arrow-up{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xODguMjQsMTY0LjI0YTYsNiwwLDAsMS04LjQ4LDBMMTU4LDE0Mi40OVYyMDhhNiw2LDAsMCwxLTEyLDBWMTQyLjQ5bC0yMS43NiwyMS43NWE2LDYsMCwwLDEtOC40OC04LjQ4bDMyLTMyYTYsNiwwLDAsMSw4LjQ4LDBsMzIsMzJBNiw2LDAsMCwxLDE4OC4yNCwxNjQuMjRaTTE2MCw0MkE4Ni4xLDg2LjEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDQwYTYsNiwwLDAsMCwwLTEySDcyYTUwLDUwLDAsMCwxLDAtMTAwLDUwLjY4LDUwLjY4LDAsMCwxLDUuOTEuMzZBODUuNTQsODUuNTQsMCwwLDAsNzQsMTI4YTYsNiwwLDAsMCwxMiwwLDc0LDc0LDAsMSwxLDEwMy42LDY3Ljg1LDYsNiwwLDAsMCw0LjgsMTFBODYsODYsMCwwLDAsMTYwLDQyWiIvPjwvc3ZnPg==');}.icon-cloud-check{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjAsNDJBODYuMTEsODYuMTEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDg4YTg2LDg2LDAsMCwwLDAtMTcyWm0wLDE2MEg3MmE1MCw1MCwwLDAsMSwwLTEwMCw1MC42Nyw1MC42NywwLDAsMSw1LjkxLjM1QTg1LjYxLDg1LjYxLDAsMCwwLDc0LDEyOGE2LDYsMCwwLDAsMTIsMCw3NCw3NCwwLDEsMSw3NCw3NFptMzYuMjQtOTQuMjRhNiw2LDAsMCwxLDAsOC40OGwtNDgsNDhhNiw2LDAsMCwxLTguNDgsMGwtMjQtMjRhNiw2LDAsMCwxLDguNDgtOC40OEwxNDQsMTUxLjUxbDQzLjc2LTQzLjc1QTYsNiwwLDAsMSwxOTYuMjQsMTA3Ljc2WiIvPjwvc3ZnPg==');}.icon-cloud-warning{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjAsNDJBODYuMTEsODYuMTEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDg4YTg2LDg2LDAsMCwwLDAtMTcyWm0wLDE2MEg3MmE1MCw1MCwwLDAsMSwwLTEwMCw1MC42Nyw1MC42NywwLDAsMSw1LjkxLjM1QTg1LjYxLDg1LjYxLDAsMCwwLDc0LDEyOGE2LDYsMCwwLDAsMTIsMCw3NCw3NCwwLDEsMSw3NCw3NFptLTYtNzRWODhhNiw2LDAsMCwxLDEyLDB2NDBhNiw2LDAsMCwxLTEyLDBabTE2LDM2YTEwLDEwLDAsMSwxLTEwLTEwQTEwLDEwLDAsMCwxLDE3MCwxNjRaIi8+PC9zdmc+');}.icon-syncing{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iY3VycmVudENvbG9yIiB2aWV3Qm94PSIwIDAgMjU2IDI1NiI+PHBhdGggaWQ9InJlZnJlc2giIGQ9Ik0xNjAuMDQ3IDEyMi44NzVhMzAuNzg0IDMwLjc4NCAwIDAgMC0yMS43NSA4Ljc5N2MtMi44NDIgMy4wMDMtLjQ2NyA0Ljk3MSAxLjMxMiAzLjE1NiAxMS4wNDMtMTAuNzg2IDI4LjcxLTEwLjY4IDM5LjYyNS4yMzRsNy4yMDMgNy4yMDRoLTEyLjg3NWMtMy4zNDcuMDA4LTMuMTY1IDMuODc1IDAgMy44NzVoMTYuMTFjMi4wNjIgMCAyLjU0LTEuNDE4IDIuNTYyLTQuOTdsLjA5NC0xNC45MjFjLjAyLTMuMjktMy40MzctMy4xNjUtMy40MzcgMHYxMi44NmwtNy4yMDMtNy4xODhhMzAuNzY4IDMwLjc2OCAwIDAgMC0yMS42NDEtOS4wNDd6bS0yOS41OTQgMzkuNzk3Yy0yLjA2MiAwLTIuNTI0IDEuNDAyLTIuNTQ3IDQuOTUzbC0uMDk0IDE0LjkyMmMtLjAyIDMuMjkgMy40MjIgMy4xNjQgMy40MjIgMHYtMTIuODZsNy4yMDMgNy4yMDRjMTEuOTU2IDExLjk1NSAzMS4zMTIgMTIuMDY0IDQzLjQwNy4yNSAyLjg0Mi0zLjAwMy40NTEtNC45ODgtMS4zMjgtMy4xNzItMTEuMDQzIDEwLjc4Ni0yOC43MSAxMC42OC0zOS42MjUtLjIzNWwtNy4xODgtNy4yMDNoMTIuODZjMy4zNDctLjAwOCAzLjE2NS0zLjg2IDAtMy44NmgtMTYuMTF6Ii8+PHBhdGggZD0iTTE2MCA0NGE4NC4xMSA4NC4xMSAwIDAgMC03Ni40MSA0OS4xMkE2MC43MSA2MC43MSAwIDAgMCA3MiA5MmE2MCA2MCAwIDAgMCAwIDEyMGg4OGE4NCA4NCAwIDAgMCAwLTE2OFptMCAxNjBINzJhNTIgNTIgMCAxIDEgOC41NS0xMDMuM0E4My42NiA4My42NiAwIDAgMCA3NiAxMjhhNCA0IDAgMCAwIDggMCA3NiA3NiAwIDEgMSA3NiA3NloiLz48L3N2Zz4=');}.icon-cloud-x{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjAsNDJBODYuMTEsODYuMTEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDg4YTg2LDg2LDAsMCwwLDAtMTcyWm0wLDE2MEg3MmE1MCw1MCwwLDAsMSwwLTEwMCw1MC42Nyw1MC42NywwLDAsMSw1LjkxLjM1QTg1LjYxLDg1LjYxLDAsMCwwLDc0LDEyOGE2LDYsMCwwLDAsMTIsMCw3NCw3NCwwLDEsMSw3NCw3NFptMjguMjQtODUuNzZMMTY4LjQ4LDEzNmwxOS43NiwxOS43NmE2LDYsMCwxLDEtOC40OCw4LjQ4TDE2MCwxNDQuNDhsLTE5Ljc2LDE5Ljc2YTYsNiwwLDAsMS04LjQ4LTguNDhMMTUxLjUyLDEzNmwtMTkuNzYtMTkuNzZhNiw2LDAsMCwxLDguNDgtOC40OEwxNjAsMTI3LjUybDE5Ljc2LTE5Ljc2YTYsNiwwLDAsMSw4LjQ4LDguNDhaIi8+PC9zdmc+');}.icon-arrows-clockwise{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsNDhWOTZhNiw2LDAsMCwxLTYsNkgxNjhhNiw2LDAsMCwxLDAtMTJoMzMuNTJMMTgzLjQ3LDcyYTgxLjUxLDgxLjUxLDAsMCwwLTU3LjUzLTI0aC0uNDZBODEuNSw4MS41LDAsMCwwLDY4LjE5LDcxLjI4YTYsNiwwLDEsMS04LjM4LTguNTgsOTMuMzgsOTMuMzgsMCwwLDEsNjUuNjctMjYuNzZIMTI2YTkzLjQ1LDkzLjQ1LDAsMCwxLDY2LDI3LjUzbDE4LDE4VjQ4YTYsNiwwLDAsMSwxMiwwWk0xODcuODEsMTg0LjcyYTgxLjUsODEuNSwwLDAsMS01Ny4yOSwyMy4zNGgtLjQ2YTgxLjUxLDgxLjUxLDAsMCwxLTU3LjUzLTI0TDU0LjQ4LDE2Nkg4OGE2LDYsMCwwLDAsMC0xMkg0MGE2LDYsMCwwLDAtNiw2djQ4YTYsNiwwLDAsMCwxMiwwVjE3NC40OGwxOCwxOC4wNWE5My40NSw5My40NSwwLDAsMCw2NiwyNy41M2guNTJhOTMuMzgsOTMuMzgsMCwwLDAsNjUuNjctMjYuNzYsNiw2LDAsMSwwLTguMzgtOC41OFoiLz48L3N2Zz4=');}.icon-share-fat{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzYuMjQsMTA3Ljc2bC04MC04MEE2LDYsMCwwLDAsMTQ2LDMyVjc0LjJjLTU0LjQ4LDMuNTktMTIwLjM5LDU1LTEyNy45MywxMjAuNjZhMTAsMTAsMCwwLDAsMTcuMjMsOGgwQzQ2LjU2LDE5MC44NSw4NywxNTIuNiwxNDYsMTUwLjEzVjE5MmE2LDYsMCwwLDAsMTAuMjQsNC4yNGw4MC04MEE2LDYsMCwwLDAsMjM2LjI0LDEwNy43NlpNMTU4LDE3Ny41MlYxNDRhNiw2LDAsMCwwLTYtNmMtMjcuNzMsMC01NC43Niw3LjI1LTgwLjMyLDIxLjU1YTE5My4zOCwxOTMuMzgsMCwwLDAtNDAuODEsMzAuNjVjNC43LTI2LjU2LDIwLjE2LTUyLDQ0LTcyLjI3Qzk4LjQ3LDk3Ljk0LDEyNy4yOSw4NiwxNTIsODZhNiw2LDAsMCwwLDYtNlY0Ni40OUwyMjMuNTEsMTEyWiIvPjwvc3ZnPg==');}.icon-trash{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTYsNTBIMTc0VjQwYTIyLDIyLDAsMCwwLTIyLTIySDEwNEEyMiwyMiwwLDAsMCw4Miw0MFY1MEg0MGE2LDYsMCwwLDAsMCwxMkg1MFYyMDhhMTQsMTQsMCwwLDAsMTQsMTRIMTkyYTE0LDE0LDAsMCwwLDE0LTE0VjYyaDEwYTYsNiwwLDAsMCwwLTEyWk05NCw0MGExMCwxMCwwLDAsMSwxMC0xMGg0OGExMCwxMCwwLDAsMSwxMCwxMFY1MEg5NFpNMTk0LDIwOGEyLDIsMCwwLDEtMiwySDY0YTIsMiwwLDAsMS0yLTJWNjJIMTk0Wk0xMTAsMTA0djY0YTYsNiwwLDAsMS0xMiwwVjEwNGE2LDYsMCwwLDEsMTIsMFptNDgsMHY2NGE2LDYsMCwwLDEtMTIsMFYxMDRhNiw2LDAsMCwxLDEyLDBaIi8+PC9zdmc+');}.icon-star{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzcuMjgsOTcuODdBMTQuMTgsMTQuMTgsMCwwLDAsMjI0Ljc2LDg4bC02MC4yNS00Ljg3LTIzLjIyLTU2LjJhMTQuMzcsMTQuMzcsMCwwLDAtMjYuNTgsMEw5MS40OSw4My4xMSwzMS4yNCw4OGExNC4xOCwxNC4xOCwwLDAsMC0xMi41Miw5Ljg5QTE0LjQzLDE0LjQzLDAsMCwwLDIzLDExMy4zMkw2OSwxNTIuOTNsLTE0LDU5LjI1YTE0LjQsMTQuNCwwLDAsMCw1LjU5LDE1LDE0LjEsMTQuMSwwLDAsMCwxNS45MS42TDEyOCwxOTYuMTJsNTEuNTgsMzEuNzFhMTQuMSwxNC4xLDAsMCwwLDE1LjkxLS42LDE0LjQsMTQuNCwwLDAsMCw1LjU5LTE1bC0xNC01OS4yNUwyMzMsMTEzLjMyQTE0LjQzLDE0LjQzLDAsMCwwLDIzNy4yOCw5Ny44N1ptLTEyLjE0LDYuMzctNDguNjksNDJhNiw2LDAsMCwwLTEuOTIsNS45MmwxNC44OCw2Mi43OWEyLjM1LDIuMzUsMCwwLDEtLjk1LDIuNTcsMi4yNCwyLjI0LDAsMCwxLTIuNi4xTDEzMS4xNCwxODRhNiw2LDAsMCwwLTYuMjgsMEw3MC4xNCwyMTcuNjFhMi4yNCwyLjI0LDAsMCwxLTIuNi0uMSwyLjM1LDIuMzUsMCwwLDEtMS0yLjU3bDE0Ljg4LTYyLjc5YTYsNiwwLDAsMC0xLjkyLTUuOTJsLTQ4LjY5LTQyYTIuMzcsMi4zNywwLDAsMS0uNzMtMi42NSwyLjI4LDIuMjgsMCwwLDEsMi4wNy0xLjY1bDYzLjkyLTUuMTZhNiw2LDAsMCwwLDUuMDYtMy42OWwyNC42My01OS42YTIuMzUsMi4zNSwwLDAsMSw0LjM4LDBsMjQuNjMsNTkuNmE2LDYsMCwwLDAsNS4wNiwzLjY5bDYzLjkyLDUuMTZhMi4yOCwyLjI4LDAsMCwxLDIuMDcsMS42NUEyLjM3LDIuMzcsMCwwLDEsMjI1LjE0LDEwNC4yNFoiLz48L3N2Zz4=');}.icon-alphabetical{--icon:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9ImN1cnJlbnRDb2xvciIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTgzLjc4IDE4NC4wNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtNTkuNTg2IDY5Ljc0MmMtMC44NTEzIDAtMS40NjEgMC4xOTY1Ni0xLjgzNjYgMC41OTcxOC0wLjM1MDU0IDAuMzc1NTgtMC41Mjk1OCAxLjAyMjktMC41Mjk1OCAxLjk0OTNzMC4xNzkwMyAxLjU5MzcgMC41Mjk1OCAxLjk5NDRjMC4zNzU1OCAwLjM3NTU4IDAuOTg1MjkgMC41NjMzOCAxLjgzNjYgMC41NjMzOGg3LjAxOTdsLTEyLjQyOCAzNC4zNjZoLTIuMTA3Yy0wLjg1MTMgMC0xLjQ2MSAwLjE5NjU2LTEuODM2NiAwLjU5NzE4LTAuMzUwNTQgMC4zNzU1OC0wLjUyOTU3IDEuMDM0MS0wLjUyOTU3IDEuOTYwNiAwIDAuOTI2NDQgMC4xNzkwMyAxLjU4MjUgMC41Mjk1NyAxLjk4MyAwLjM3NTU4IDAuMzc1NTkgMC45ODUyOSAwLjU2MzM4IDEuODM2NiAwLjU2MzM4aDEyLjU1MmMwLjg1MTMgMCAxLjQ1MjItMC4xODc3OSAxLjgwMjgtMC41NjMzOCAwLjM3NTU4LTAuNDAwNjIgMC41NjMzNy0xLjA1NjYgMC41NjMzNy0xLjk4MyAwLTAuOTI2NDUtMC4xODc3OS0xLjU4NS0wLjU2MzM3LTEuOTYwNi0wLjM1MDU0LTAuNDAwNjItMC45NTE0Ny0wLjU5NzE4LTEuODAyOC0wLjU5NzE4aC00LjU1MjFsMy4xMjExLTguOTM0OWgxOC4yMmwzLjA3NiA4LjkzNDloLTUuMDcwNGMtMC44NTEzIDAtMS40NjEgMC4xOTY1Ni0xLjgzNjYgMC41OTcxOC0wLjM1MDU0IDAuMzc1NTgtMC41Mjk1OCAxLjAzNDEtMC41Mjk1OCAxLjk2MDYgMCAwLjkyNjQ0IDAuMTc5MDMgMS41ODI1IDAuNTI5NTggMS45ODMgMC4zNzU1OCAwLjM3NTU5IDAuOTg1MjkgMC41NjMzOCAxLjgzNjYgMC41NjMzOGgxMy4yOTZjMC44NTEzIDAgMS40NTIyLTAuMTg3NzkgMS44MDI4LTAuNTYzMzggMC4zNzU1OC0wLjQwMDYyIDAuNTYzMzctMS4wNTY2IDAuNTYzMzctMS45ODMgMC0wLjkyNjQ1LTAuMTg3NzktMS41ODUtMC41NjMzNy0xLjk2MDYtMC4zNTA1NC0wLjQwMDYyLTAuOTUxNDctMC41OTcxOC0xLjgwMjgtMC41OTcxOGgtMi4yODczbC0xMy4yNjItMzcuMDM2Yy0wLjMwMDQ3LTAuODUxMy0wLjc1OTk0LTEuNDYxLTEuMzg1OS0xLjgzNjYtMC42MDA5My0wLjQwMDYyLTEuNDA5Ny0wLjU5NzE4LTIuNDExMy0wLjU5NzE4em00NC4xNDYgMGMtMC44NTEzIDAtMS40NzIzIDAuMTk2NTYtMS44NDc4IDAuNTk3MTgtMC4zNTA1NSAwLjM3NTU4LTAuNTE4MyAxLjAyMjktMC41MTgzIDEuOTQ5M3YxMS45MWMwIDAuODc2MzMgMC4yMDUzMiAxLjUwNjEgMC42MzA5OCAxLjg4MTcgMC40MjU2NiAwLjM3NTU4IDEuMTU5MyAwLjU2MzM3IDIuMTg1OSAwLjU2MzM3czEuNzQ5LTAuMTg3NzkgMi4xNzQ3LTAuNTYzMzdjMC40MjU2OS0wLjM3NTU4IDAuNjQyMjYtMS4wMDUzIDAuNjQyMjYtMS44ODE3di05LjM1MTdoMTguODUxbC0yNC43NTQgMzUuMzAxYy0wLjM1MDU0IDAuNTI1ODItMC41MTgzMSAxLjA3MTctMC41MTgzMSAxLjYyMjYgMCAwLjkyNjQ1IDAuMTY3NzcgMS41ODI1IDAuNTE4MzEgMS45ODMxIDAuMzc1NTggMC4zNzU1OCAwLjk5NjU0IDAuNTYzMzggMS44NDc4IDAuNTYzMzhoMjguNzY2YzAuODUxMyAwIDEuNDUyMi0wLjE4NzggMS44MDI4LTAuNTYzMzggMC4zNzU1OC0wLjQwMDYyIDAuNTYzMzgtMS4wNTY2IDAuNTYzMzgtMS45ODMxdi0xMi42NjVjMC0wLjg3NjMzLTAuMjE2NTgtMS40OTQ4LTAuNjQyMjUtMS44NzA0LTAuNDI1NjYtMC4zNzU1OC0xLjE0OC0wLjU2MzM4LTIuMTc0Ny0wLjU2MzM4LTEuMDI2NiAwLTEuNzQ5IDAuMTg3NzktMi4xNzQ3IDAuNTYzMzgtMC40MjU2NiAwLjM3NTU4LTAuNjQyMjQgMC45OTQwMi0wLjY0MjI0IDEuODcwNHYxMC4xMDdoLTE5Ljk3OGwyNC45MDEtMzUuNDU5YzAuMjUwMzktMC4zNTA1NCAwLjM3MTgzLTAuODM4ODMgMC4zNzE4My0xLjQ2NDggMC0wLjkyNjQ1LTAuMTg3OC0xLjU3MzctMC41NjMzOC0xLjk0OTMtMC4zNTA1NS0wLjQwMDYyLTAuOTUxNDctMC41OTcxOC0xLjgwMjgtMC41OTcxOHptLTMxLjc1MiA1LjEwNDJoMC43MDk4NWw2Ljk4NTkgMjAuMzE1aC0xNC43MTZ6bS0zNy43MjMtNDkuMTgzYy00LjczNDIgMC04LjYzMTMgMy44OTctOC42MzEzIDguNjMxM3YxMTUuNDdjMCA0LjczNDIgMy44OTcgOC42MzEzIDguNjMxMyA4LjYzMTNoMTE1LjI2YzQuNzM0MiAwIDguNjQyMS0zLjg5NyA4LjY0MjEtOC42MzEzdi0xMTUuNDdjMC00LjczNDItMy45MDgyLTguNjMxMy04LjY0MjEtOC42MzEzem0wIDUuNzI0aDExNS4yNmMxLjY1OCAwIDIuOTA3IDEuMjQ5MSAyLjkwNyAyLjkwNzF2MTE1LjQ3YzAgMS42NTgtMS4yNDkxIDIuOTA3LTIuOTA3IDIuOTA3aC0xMTUuMjZjLTEuNjU4IDAtMi44OTU4LTEuMjQ5MS0yLjg5NTgtMi45MDd2LTExNS40N2MwLTEuNjU4IDEuMjM3OC0yLjkwNzEgMi44OTU4LTIuOTA3MXoiIGZpbGw9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIuNzIxMTQiLz48L3N2Zz4=');}.icon-scribble{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDQuMjUsMTg4LjI0YTE2LjYzLDE2LjYzLDAsMCwwLDAsMjMuNTIsNiw2LDAsMSwxLTguNDgsOC40OCwyOC42MSwyOC42MSwwLDAsMSwwLTQwLjQ4bDkuMzctOS4zOGExNi42MywxNi42MywwLDAsMC0yMy41Mi0yMy41MWwtNjYuNzUsNjYuNzVhMjguNjMsMjguNjMsMCwwLDEtNDAuNDktNDAuNDlsOTguNzYtOTguNzVhMTYuNjMsMTYuNjMsMCwwLDAtMjMuNTItMjMuNTFMODIuODYsMTE3LjYyQTI4LjYzLDI4LjYzLDAsMCwxLDQyLjM3LDc3LjEzTDgzLjc1LDM1Ljc2YTYsNiwwLDEsMSw4LjQ5LDguNDhMNTAuODYsODUuNjJhMTYuNjMsMTYuNjMsMCwwLDAsMjMuNTIsMjMuNTFsNjYuNzUtNjYuNzVhMjguNjMsMjguNjMsMCwwLDEsNDAuNDksNDAuNDlMODIuODYsMTgxLjYyYTE2LjYzLDE2LjYzLDAsMCwwLDIzLjUyLDIzLjUxbDY2Ljc2LTY2Ljc1YTI4LjYzLDI4LjYzLDAsMCwxLDQwLjQ5LDQwLjQ5WiIvPjwvc3ZnPg==');}.icon-brackets-angle{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik04NS4wNiw0My4yMiwzMS4xMSwxMjhsNTQsODQuNzhhNiw2LDAsMCwxLTEuODQsOC4yOCw2LDYsMCwwLDEtOC4yOC0xLjg0bC01Ni04OGE2LDYsMCwwLDEsMC02LjQ0bDU2LTg4YTYsNiwwLDAsMSwxMC4xMiw2LjQ0Wm0xNTIsODEuNTYtNTYtODhhNiw2LDAsMSwwLTEwLjEyLDYuNDRMMjI0Ljg5LDEyOGwtNTMuOTUsODQuNzhhNiw2LDAsMCwwLDEuODQsOC4yOCw2LDYsMCwwLDAsOC4yOC0xLjg0bDU2LTg4QTYsNiwwLDAsMCwyMzcuMDYsMTI0Ljc4WiIvPjwvc3ZnPg==');}.icon-brain{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDYsMTI0YTU0LjEzLDU0LjEzLDAsMCwwLTMyLTQ5LjMzVjcyYTQ2LDQ2LDAsMCwwLTg2LTIyLjY3QTQ2LDQ2LDAsMCwwLDQyLDcydjIuNjdhNTQsNTQsMCwwLDAsMCw5OC42M1YxNzZhNDYsNDYsMCwwLDAsODYsMjIuNjdBNDYsNDYsMCwwLDAsMjE0LDE3NnYtMi43QTU0LjA3LDU0LjA3LDAsMCwwLDI0NiwxMjRaTTg4LDIxMGEzNCwzNCwwLDAsMS0zNC0zMi45NEE1My42Nyw1My42NywwLDAsMCw2NCwxNzhoOGE2LDYsMCwwLDAsMC0xMkg2NEE0Miw0MiwwLDAsMSw1MCw4NC4zOWE2LDYsMCwwLDAsNC01LjY2VjcyYTM0LDM0LDAsMCwxLDY4LDB2NzMuMDVBNDUuODksNDUuODksMCwwLDAsODgsMTMwYTYsNiwwLDAsMCwwLDEyLDM0LDM0LDAsMCwxLDAsNjhabTEwNC00NGgtOGE2LDYsMCwwLDAsMCwxMmg4YTUzLjY3LDUzLjY3LDAsMCwwLDEwLS45NEEzNCwzNCwwLDEsMSwxNjgsMTQyYTYsNiwwLDAsMCwwLTEyLDQ1Ljg5LDQ1Ljg5LDAsMCwwLTM0LDE1LjA1VjcyYTM0LDM0LDAsMCwxLDY4LDB2Ni43M2E2LDYsMCwwLDAsNCw1LjY2QTQyLDQyLDAsMCwxLDE5MiwxNjZabTE0LTU0YTYsNiwwLDAsMS02LDZoLTRhMzQsMzQsMCwwLDEtMzQtMzRWODBhNiw2LDAsMCwxLDEyLDB2NGEyMiwyMiwwLDAsMCwyMiwyMmg0QTYsNiwwLDAsMSwyMDYsMTEyWk02MCwxMThINTZhNiw2LDAsMCwxLDAtMTJoNEEyMiwyMiwwLDAsMCw4Miw4NFY4MGE2LDYsMCwwLDEsMTIsMHY0QTM0LDM0LDAsMCwxLDYwLDExOFoiLz48L3N2Zz4=');}.icon-palette{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xOTkuMzcsNTUuMzFBMTAxLjMyLDEwMS4zMiwwLDAsMCwxMjgsMjZoLTFBMTAyLDEwMiwwLDAsMCwyNiwxMjhjMCw0Mi4wOSwyNi4wNyw3Ny40NCw2OCw5Mi4yNkEzMC4yMSwzMC4yMSwwLDAsMCwxMDQuMTEsMjIyLDMwLjA2LDMwLjA2LDAsMCwwLDEzNCwxOTJhMTgsMTgsMCwwLDEsMTgtMThoNDYuMjFhMjkuODIsMjkuODIsMCwwLDAsMjkuMjUtMjMuMzFBMTAyLjcxLDEwMi43MSwwLDAsMCwyMzAsMTI3LjExLDEwMS4yNSwxMDEuMjUsMCwwLDAsMTk5LjM3LDU1LjMxWk0yMTUuNzYsMTQ4YTE3Ljg5LDE3Ljg5LDAsMCwxLTE3LjU1LDE0SDE1MmEzMCwzMCwwLDAsMC0zMCwzMCwxOCwxOCwwLDAsMS0yNCwxN0M2MSwxOTUuODYsMzgsMTY0Ljg1LDM4LDEyOGE5MCw5MCwwLDAsMSw4OS4wNy05MEgxMjhhOTAuMzQsOTAuMzQsMCwwLDEsOTAsODkuMjJBOTAuNDYsOTAuNDYsMCwwLDEsMjE1Ljc2LDE0OFpNMTM4LDc2YTEwLDEwLDAsMSwxLTEwLTEwQTEwLDEwLDAsMCwxLDEzOCw3NlpNOTQsMTAwQTEwLDEwLDAsMSwxLDg0LDkwLDEwLDEwLDAsMCwxLDk0LDEwMFptMCw1NmExMCwxMCwwLDEsMS0xMC0xMEExMCwxMCwwLDAsMSw5NCwxNTZabTg4LTU2YTEwLDEwLDAsMSwxLTEwLTEwQTEwLDEwLDAsMCwxLDE4MiwxMDBaIi8+PC9zdmc+');}.icon-pen-nib{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDYsOTIuNjhhMTMuOTQsMTMuOTQsMCwwLDAtNC4xLTkuOUwxNzMuMjEsMTQuMWExNCwxNCwwLDAsMC0xOS44LDBMMTI0LjY4LDQyLjgzLDY2LjIyLDY0Ljc2YTE0LDE0LDAsMCwwLTguOSwxMC44TDM0LjA4LDIxNUE2LDYsMCwwLDAsNDAsMjIyYTYuNjEsNi42MSwwLDAsMCwxLS4wOGwxMzkuNDQtMjMuMjRhMTQsMTQsMCwwLDAsMTAuODEtOC45bDIxLjkyLTU4LjQ2LDI4Ljc0LTI4Ljc0QTEzLjkyLDEzLjkyLDAsMCwwLDI0Niw5Mi42OFptLTY2LDkyLjg5YTIsMiwwLDAsMS0xLjU0LDEuMjdMNTcuNDksMjA3bDUyLjg3LTUyLjg4YTI2LDI2LDAsMSwwLTguNDgtOC40OEw0OSwxOTguNTNsMjAuMTctMTIxQTIsMiwwLDAsMSw3MC40Myw3Nmw1Ni4wNi0yMUwyMDEsMTI5LjUxWk0xMTAsMTMyYTE0LDE0LDAsMSwxLDE0LDE0QTE0LDE0LDAsMCwxLDExMCwxMzJaTTIzMy40MSw5NC4xLDIwOCwxMTkuNTEsMTM2LjQ4LDQ4LDE2MS45LDIyLjU4YTIsMiwwLDAsMSwyLjgzLDBsNjguNjgsNjguNjlhMiwyLDAsMCwxLDAsMi44M1oiLz48L3N2Zz4=');}.icon-question{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMzgsMTgwYTEwLDEwLDAsMSwxLTEwLTEwQTEwLDEwLDAsMCwxLDEzOCwxODBaTTEyOCw3NGMtMjEsMC0zOCwxNS4yNS0zOCwzNHY0YTYsNiwwLDAsMCwxMiwwdi00YzAtMTIuMTMsMTEuNjYtMjIsMjYtMjJzMjYsOS44NywyNiwyMi0xMS42NiwyMi0yNiwyMmE2LDYsMCwwLDAtNiw2djhhNiw2LDAsMCwwLDEyLDB2LTIuNDJjMTguMTEtMi41OCwzMi0xNi42NiwzMi0zMy41OEMxNjYsODkuMjUsMTQ5LDc0LDEyOCw3NFptMTAyLDU0QTEwMiwxMDIsMCwxLDEsMTI4LDI2LDEwMi4xMiwxMDIuMTIsMCwwLDEsMjMwLDEyOFptLTEyLDBhOTAsOTAsMCwxLDAtOTAsOTBBOTAuMSw5MC4xLDAsMCwwLDIxOCwxMjhaIi8+PC9zdmc+');}.icon-city{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDAsMjEwSDIzMFY4OGE2LDYsMCwwLDAtNi02SDE2MGE2LDYsMCwwLDAtNiw2djQySDEwMlY0MGE2LDYsMCwwLDAtNi02SDMyYTYsNiwwLDAsMC02LDZWMjEwSDE2YTYsNiwwLDAsMCwwLDEySDI0MGE2LDYsMCwwLDAsMC0xMlpNMTY2LDk0aDUyVjIxMEgxNjZabS0xMiw0OHY2OEgxMDJWMTQyWk0zOCw0Nkg5MFYyMTBIMzhaTTcwLDcyVjg4YTYsNiwwLDAsMS0xMiwwVjcyYTYsNiwwLDAsMSwxMiwwWm0wLDQ4djE2YTYsNiwwLDAsMS0xMiwwVjEyMGE2LDYsMCwwLDEsMTIsMFptMCw0OHYxNmE2LDYsMCwwLDEtMTIsMFYxNjhhNiw2LDAsMCwxLDEyLDBabTUyLDE2VjE2OGE2LDYsMCwwLDEsMTIsMHYxNmE2LDYsMCwwLDEtMTIsMFptNjQsMFYxNjhhNiw2LDAsMCwxLDEyLDB2MTZhNiw2LDAsMCwxLTEyLDBabTAtNDhWMTIwYTYsNiwwLDAsMSwxMiwwdjE2YTYsNiwwLDAsMS0xMiwwWiIvPjwvc3ZnPg==');}.icon-folder{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTYsNzRIMTMwLjQ5bC0yNy45LTI3LjlhMTMuOTQsMTMuOTQsMCwwLDAtOS45LTQuMUg0MEExNCwxNCwwLDAsMCwyNiw1NlYyMDAuNjJBMTMuMzksMTMuMzksMCwwLDAsMzkuMzgsMjE0SDIxNi44OUExMy4xMiwxMy4xMiwwLDAsMCwyMzAsMjAwLjg5Vjg4QTE0LDE0LDAsMCwwLDIxNiw3NFpNNDAsNTRIOTIuNjlhMiwyLDAsMCwxLDEuNDEuNTlMMTEzLjUxLDc0SDM4VjU2QTIsMiwwLDAsMSw0MCw1NFpNMjE4LDIwMC44OWExLjExLDEuMTEsMCwwLDEtMS4xMSwxLjExSDM5LjM4QTEuNCwxLjQsMCwwLDEsMzgsMjAwLjYyVjg2SDIxNmEyLDIsMCwwLDEsMiwyWiIvPjwvc3ZnPg==');}.icon-hash{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjQsOTBIMTczbDguODktNDguOTNhNiw2LDAsMSwwLTExLjgtMi4xNEwxNjAuODEsOTBIMTA5bDguODktNDguOTNhNiw2LDAsMCwwLTExLjgtMi4xNEw5Ni44MSw5MEg0OGE2LDYsMCwwLDAsMCwxMkg5NC42M2wtOS40Niw1MkgzMmE2LDYsMCwwLDAsMCwxMkg4M0w3NC4xLDIxNC45M2E2LDYsMCwwLDAsNC44Myw3QTUuNjQsNS42NCwwLDAsMCw4MCwyMjJhNiw2LDAsMCwwLDUuODktNC45M0w5NS4xOSwxNjZIMTQ3bC04Ljg5LDQ4LjkzYTYsNiwwLDAsMCw0LjgzLDcsNS42NCw1LjY0LDAsMCwwLDEuMDguMSw2LDYsMCwwLDAsNS44OS00LjkzTDE1OS4xOSwxNjZIMjA4YTYsNiwwLDAsMCwwLTEySDE2MS4zN2w5LjQ2LTUySDIyNGE2LDYsMCwwLDAsMC0xMlptLTc0LjgzLDY0SDk3LjM3bDkuNDYtNTJoNTEuOFoiLz48L3N2Zz4=');}.icon-shapes{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik02OS42OSw2Mi4xYTYsNiwwLDAsMC0xMS4zOCwwbC00MCwxMjBBNiw2LDAsMCwwLDI0LDE5MGg4MGE2LDYsMCwwLDAsNS42OS03LjlaTTMyLjMyLDE3OCw2NCw4M2wzMS42OCw5NVpNMjA2LDc2YTUwLDUwLDAsMSwwLTUwLDUwQTUwLjA2LDUwLjA2LDAsMCwwLDIwNiw3NlptLTg4LDBhMzgsMzgsMCwxLDEsMzgsMzhBMzgsMzgsMCwwLDEsMTE4LDc2Wm0xMDYsNzBIMTM2YTYsNiwwLDAsMC02LDZ2NTZhNiw2LDAsMCwwLDYsNmg4OGE2LDYsMCwwLDAsNi02VjE1MkE2LDYsMCwwLDAsMjI0LDE0NlptLTYsNTZIMTQyVjE1OGg3NloiLz48L3N2Zz4=');}.icon-diamonds-four{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMjMuNzYsMTA4LjI0YTYsNiwwLDAsMCw4LjQ4LDBsNDAtNDBhNiw2LDAsMCwwLDAtOC40OGwtNDAtNDBhNiw2LDAsMCwwLTguNDgsMGwtNDAsNDBhNiw2LDAsMCwwLDAsOC40OFpNMTI4LDMyLjQ5LDE1OS41MSw2NCwxMjgsOTUuNTEsOTYuNDksNjRabTQuMjQsMTE1LjI3YTYsNiwwLDAsMC04LjQ4LDBsLTQwLDQwYTYsNiwwLDAsMCwwLDguNDhsNDAsNDBhNiw2LDAsMCwwLDguNDgsMGw0MC00MGE2LDYsMCwwLDAsMC04LjQ4Wk0xMjgsMjIzLjUxLDk2LjQ5LDE5MiwxMjgsMTYwLjQ5LDE1OS41MSwxOTJabTEwOC4yNC05OS43NS00MC00MGE2LDYsMCwwLDAtOC40OCwwbC00MCw0MGE2LDYsMCwwLDAsMCw4LjQ4bDQwLDQwYTYsNiwwLDAsMCw4LjQ4LDBsNDAtNDBBNiw2LDAsMCwwLDIzNi4yNCwxMjMuNzZaTTE5MiwxNTkuNTEsMTYwLjQ5LDEyOCwxOTIsOTYuNDksMjIzLjUxLDEyOFptLTgzLjc2LTM1Ljc1LTQwLTQwYTYsNiwwLDAsMC04LjQ4LDBsLTQwLDQwYTYsNiwwLDAsMCwwLDguNDhsNDAsNDBhNiw2LDAsMCwwLDguNDgsMGw0MC00MEE2LDYsMCwwLDAsMTA4LjI0LDEyMy43NlpNNjQsMTU5LjUxLDMyLjQ5LDEyOCw2NCw5Ni40OSw5NS41MSwxMjhaIi8+PC9zdmc+');}.icon-crosshair-simple{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMjgsMjZBMTAyLDEwMiwwLDEsMCwyMzAsMTI4LDEwMi4xMiwxMDIuMTIsMCwwLDAsMTI4LDI2Wm02LDE5MS44VjE4NGE2LDYsMCwwLDAtMTIsMHYzMy44QTkwLjE1LDkwLjE1LDAsMCwxLDM4LjIsMTM0SDcyYTYsNiwwLDAsMCwwLTEySDM4LjJBOTAuMTUsOTAuMTUsMCwwLDEsMTIyLDM4LjJWNzJhNiw2LDAsMCwwLDEyLDBWMzguMkE5MC4xNSw5MC4xNSwwLDAsMSwyMTcuOCwxMjJIMTg0YTYsNiwwLDAsMCwwLDEyaDMzLjhBOTAuMTUsOTAuMTUsMCwwLDEsMTM0LDIxNy44WiIvPjwvc3ZnPg==');}.icon-circle-notch{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzAsMTI4YTEwMiwxMDIsMCwwLDEtMjA0LDBjMC00MC4xOCwyMy4zNS03Ni44Niw1OS41LTkzLjQ1YTYsNiwwLDAsMSw1LDEwLjlDNTguNjEsNjAuMDksMzgsOTIuNDksMzgsMTI4YTkwLDkwLDAsMCwwLDE4MCwwYzAtMzUuNTEtMjAuNjEtNjcuOTEtNTIuNS04Mi41NWE2LDYsMCwwLDEsNS0xMC45QzIwNi42NSw1MS4xNCwyMzAsODcuODIsMjMwLDEyOFoiLz48L3N2Zz4=');}.icon-cards-three{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDgsOTBINDhhMTQsMTQsMCwwLDAtMTQsMTR2OTZhMTQsMTQsMCwwLDAsMTQsMTRIMjA4YTE0LDE0LDAsMCwwLDE0LTE0VjEwNEExNCwxNCwwLDAsMCwyMDgsOTBabTIsMTEwYTIsMiwwLDAsMS0yLDJINDhhMiwyLDAsMCwxLTItMlYxMDRhMiwyLDAsMCwxLDItMkgyMDhhMiwyLDAsMCwxLDIsMlpNNTAsNjRhNiw2LDAsMCwxLDYtNkgyMDBhNiw2LDAsMCwxLDAsMTJINTZBNiw2LDAsMCwxLDUwLDY0Wk02NiwzMmE2LDYsMCwwLDEsNi02SDE4NGE2LDYsMCwwLDEsMCwxMkg3MkE2LDYsMCwwLDEsNjYsMzJaIi8+PC9zdmc+');}.icon-house{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTcuOSwxMTAuMWwtODAtODBhMTQsMTQsMCwwLDAtMTkuOCwwbC04MCw4MEExMy45MiwxMy45MiwwLDAsMCwzNCwxMjB2OTZhNiw2LDAsMCwwLDYsNmg2NGE2LDYsMCwwLDAsNi02VjE1OGgzNnY1OGE2LDYsMCwwLDAsNiw2aDY0YTYsNiwwLDAsMCw2LTZWMTIwQTEzLjkyLDEzLjkyLDAsMCwwLDIxNy45LDExMC4xWk0yMTAsMjEwSDE1OFYxNTJhNiw2LDAsMCwwLTYtNkgxMDRhNiw2LDAsMCwwLTYsNnY1OEg0NlYxMjBhMiwyLDAsMCwxLC41OC0xLjQybDgwLTgwYTIsMiwwLDAsMSwyLjg0LDBsODAsODBBMiwyLDAsMCwxLDIxMCwxMjBaIi8+PC9zdmc+');}.icon-sun-dim{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMjIsNDBWMzJhNiw2LDAsMCwxLDEyLDB2OGE2LDYsMCwwLDEtMTIsMFptNjgsODhhNjIsNjIsMCwxLDEtNjItNjJBNjIuMDcsNjIuMDcsMCwwLDEsMTkwLDEyOFptLTEyLDBhNTAsNTAsMCwxLDAtNTAsNTBBNTAuMDYsNTAuMDYsMCwwLDAsMTc4LDEyOFpNNTkuNzYsNjguMjRhNiw2LDAsMSwwLDguNDgtOC40OGwtOC04YTYsNiwwLDAsMC04LjQ4LDguNDhabTAsMTE5LjUyLTgsOGE2LDYsMCwxLDAsOC40OCw4LjQ4bDgtOGE2LDYsMCwxLDAtOC40OC04LjQ4Wm0xMzYtMTM2LTgsOGE2LDYsMCwxLDAsOC40OCw4LjQ4bDgtOGE2LDYsMCwwLDAtOC40OC04LjQ4Wm0uNDgsMTM2YTYsNiwwLDAsMC04LjQ4LDguNDhsOCw4YTYsNiwwLDAsMCw4LjQ4LTguNDhaTTQwLDEyMkgzMmE2LDYsMCwwLDAsMCwxMmg4YTYsNiwwLDAsMCwwLTEyWm04OCw4OGE2LDYsMCwwLDAtNiw2djhhNiw2LDAsMCwwLDEyLDB2LThBNiw2LDAsMCwwLDEyOCwyMTBabTk2LTg4aC04YTYsNiwwLDAsMCwwLDEyaDhhNiw2LDAsMCwwLDAtMTJaIi8+PC9zdmc+');}.icon-moon{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzIuMTMsMTQzLjY0YTYsNiwwLDAsMC02LTEuNDlBOTAuMDcsOTAuMDcsMCwwLDEsMTEzLjg2LDI5Ljg1YTYsNiwwLDAsMC03LjQ5LTcuNDhBMTAyLjg4LDEwMi44OCwwLDAsMCw1NC40OCw1OC42OCwxMDIsMTAyLDAsMCwwLDE5Ny4zMiwyMDEuNTJhMTAyLjg4LDEwMi44OCwwLDAsMCwzNi4zMS01MS44OUE2LDYsMCwwLDAsMjMyLjEzLDE0My42NFptLTQyLDQ4LjI5YTkwLDkwLDAsMCwxLTEyNi0xMjZBOTAuOSw5MC45LDAsMCwxLDk5LjY1LDM3LjY2LDEwMi4wNiwxMDIuMDYsMCwwLDAsMjE4LjM0LDE1Ni4zNSw5MC45LDkwLjksMCwwLDEsMTkwLjEsMTkxLjkzWiIvPjwvc3ZnPg==');}.icon-sign-out{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMTgsMjE2YTYsNiwwLDAsMS02LDZINDhhNiw2LDAsMCwxLTYtNlY0MGE2LDYsMCwwLDEsNi02aDY0YTYsNiwwLDAsMSwwLDEySDU0VjIxMGg1OEE2LDYsMCwwLDEsMTE4LDIxNlptMTEwLjI0LTkyLjI0LTQwLTQwYTYsNiwwLDAsMC04LjQ4LDguNDhMMjA5LjUxLDEyMkgxMTJhNiw2LDAsMCwwLDAsMTJoOTcuNTFsLTI5Ljc1LDI5Ljc2YTYsNiwwLDEsMCw4LjQ4LDguNDhsNDAtNDBBNiw2LDAsMCwwLDIyOC4yNCwxMjMuNzZaIi8+PC9zdmc+');}.icon-list{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsMTI4YTYsNiwwLDAsMS02LDZINDBhNiw2LDAsMCwxLDAtMTJIMjE2QTYsNiwwLDAsMSwyMjIsMTI4Wk00MCw3MEgyMTZhNiw2LDAsMCwwLDAtMTJINDBhNiw2LDAsMCwwLDAsMTJaTTIxNiwxODZINDBhNiw2LDAsMCwwLDAsMTJIMjE2YTYsNiwwLDAsMCwwLTEyWiIvPjwvc3ZnPg==');}.icon-loading{--icon:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2Zw0gICAgd2lkdGg9IjMyIg0gICAgaGVpZ2h0PSIzMiINICAgIHZpZXdCb3g9IjAgMCAzMiAzMiINICAgIHZlcnNpb249IjEuMSINICAgIHhtbDpzcGFjZT0icHJlc2VydmUiDSAgICBzdHlsZT0iY2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEuNSINICAgIGlkPSJzdmcxMCINICAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyINICAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzDSAgICBpZD0iZGVmczEwIiAvPjxwYXRoDSAgICBpZD0icGF0aDExIg0gICAgc3R5bGU9ImJhc2VsaW5lLXNoaWZ0OmJhc2VsaW5lO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7dmVjdG9yLWVmZmVjdDpub25lO2ZpbGw6IzIyMjIyMjtlbmFibGUtYmFja2dyb3VuZDphY2N1bXVsYXRlO3N0b3AtY29sb3I6IzAwMDAwMDtzdG9wLW9wYWNpdHk6MSINICAgIGQ9Im0gMTYuNjIxMDk0LDEuMTQyNTc4MSBjIC04LjI2NjMyMzIsMCAtMTYuMjIwODY3MzgsNi40NDI4MDk1IC0xNS41ODU5Mzc4LDE0LjY4NTU0NjkgMC42MDEzNDU1LDcuODA3MzA4IDcuNDM0MTI2NCwxNC4xMjY5OCAxNC45MzM1OTM4LDE0Ljk0MzM1OSA4LjgzOTg0NSwwLjk2MjI4MyAxNS41MDU0NjksLTYuMzc2OTE5IDE1LjAwNTg1OSwtMTQuOTg2MzI4IEMgMzAuNDk1OSw3LjUzNjI2ODQgMjQuODgzMzk3LDEuMTQyNTc4MSAxNi42MjEwOTQsMS4xNDI1NzgxIFogbSAwLDAuNjUwMzkwNyBDIDI2LjQ4ODc4NiwxLjgwMzg2NDUgMjkuNzE0NTE4LDkuNTkzNTgzMyAzMC4zMDI3MzQsMTUuODA0Njg4IDMxLjE0MTk4MiwyNC42NjYzNjUgMjIuMTYwNDU5LDMxLjE2ODA3NyAxNi4wMzkwNjIsMzAuMTI1IDguODk1MTMyNywyOC45MDc2ODEgMi4yNjEzMTQyLDIzLjI3OTM3NiAxLjY4MzU5MzgsMTUuNzc5Mjk3IDEuMDc2OTMzOCw3LjkwMzI3NTQgOC43MjI1NDUxLDEuNzg0MjY5OSAxNi42MjEwOTQsMS43OTI5Njg4IFogbSAtMC4wNjQ0NSwxLjIxODc1IGMgLTMuNjEwMDgzLDAgLTcuMTU0Nzk5NSwxLjQwMTA2ODcgLTkuNzMwNDY5MSwzLjcwMzEyNSBDIDQuMjUwNTAyMyw5LjAxNjkwMDIgMi42NDIwMzcyLDEyLjIyNjI5NSAyLjkxOTkyMTksMTUuODMzOTg0IDMuNDQ2OTM1LDIyLjY3NTcxMiA5LjQyODk2NDksMjguMTk4OTg1IDE1Ljk5ODA0NywyOC45MTQwNjIgMjMuNzE0MjU2LDI5Ljc1NDAyMyAyOS41MzE2MDMsMjMuMzMxNyAyOS4wOTU3MDMsMTUuODIwMzEyIDI4LjY3Nzk0OCw4LjYyMTM5NTMgMjMuNzc2Njg2LDMuMDExNzE4OCAxNi41NTY2NDEsMy4wMTE3MTg4IFogbSAwLDAuMTk1MzEyNCBjIDcuMTE5MTM0LDAgMTEuOTMyNzEsNS41MDgxMzczIDEyLjM0NTcwMywxMi42MjQ5OTk4IEMgMjkuMzMyMDYyLDIzLjIzNjg5NiAyMy42MTg5NTgsMjkuNTQ1OTk4IDE2LjAxOTUzMSwyOC43MTg3NSA5LjU0NTQzMjEsMjguMDE0MDEyIDMuNjM0MTYzNywyMi41NTUxNDMgMy4xMTUyMzQ0LDE1LjgxODM1OSAyLjg0MjQ1NjMsMTIuMjc2OTY3IDQuNDE4NDEwOSw5LjEyODMxNjkgNi45NTcwMzEyLDYuODU5Mzc1IDkuNDk1NjUxNiw0LjU5MDQzMzEgMTIuOTk3MDkzLDMuMjA3MDMxMiAxNi41NTY2NDEsMy4yMDcwMzEyIFogbSAtMC4wNzAzMSwxLjQxNjAxNTcgYyAtMy4xNjE5NzMsMCAtNi4yNjM1MDksMS4yMjU4MTM5IC04LjUxOTUzMTEsMy4yNDIxODc1IEMgNS43MTA3NjkxLDkuODgxNjA4IDQuMzAxNDU0MiwxMi42OTQ1ODkgNC41NDQ5MjE5LDE1Ljg1NTQ2OSA1LjAwNjU2MjQsMjEuODQ4NTU0IDEwLjI0NDE3OCwyNi42ODYxNTkgMTUuOTk4MDQ3LDI3LjMxMjUgMjIuNzU3MDEzLDI4LjA0ODI2MSAyNy44NTQ0NTEsMjIuNDIwOTM2IDI3LjQ3MjY1NiwxNS44NDE3OTcgMjcuMTA2ODI0LDkuNTM3NjAyNSAyMi44MTAxNiw0LjYyMzA0NjkgMTYuNDg2MzI4LDQuNjIzMDQ2OSBaIG0gMCwwLjE5NTMxMjUgYyA2LjIyMjkyLDAgMTAuNDI5OTQ2LDQuODEzMDEzOCAxMC43OTEwMTYsMTEuMDM1MTU2NiAwLjM3NTYxMyw2LjQ3MjYxNSAtNC42MTc1ODQsMTEuOTg2NzIgLTExLjI1OTc2NiwxMS4yNjM2NzIgQyAxMC4zNTg2ODUsMjYuNTAxMTg2IDUuMTkxODM4MSwyMS43Mjc5ODUgNC43MzgyODEyLDE1LjgzOTg0NCA0LjQ5OTkyMDEsMTIuNzQ1MjYyIDUuODc2NzMxNSw5Ljk5NDk3NzggOC4wOTU3MDMxLDguMDExNzE4OCAxMC4zMTQ2NzUsNi4wMjg0NTk1IDEzLjM3NDg5LDQuODE4MzU5NCAxNi40ODYzMjgsNC44MTgzNTk0IFogbSAtMC4wNjgzNiwxLjQxNjAxNTYgYyAtMi43MTM4NzcsMCAtNS4zNzYxMTgsMS4wNTI1MTY0IC03LjMxMjUwMDIsMi43ODMyMDMxIC0xLjkzNjM4MjgsMS43MzA2ODY5IC0zLjE0NjU1MTcsNC4xNDUzMTE5IC0yLjkzNzUsNi44NTkzNzQ5IDAuMzk2MjY5OSw1LjE0NDQzIDQuODg5NDQ0Miw5LjI5NDQyOSA5LjgyODEyNTIsOS44MzIwMzEgNS44MDE3NDksMC42MzE1NjIgMTAuMTc5MjU3LC00LjE5ODgyOCA5Ljg1MTU2MiwtOS44NDU3MDMgQyAyNS41MzM3NSwxMC40NTM4MjIgMjEuODQ1NjE2LDYuMjM0Mzc1IDE2LjQxNzk3NCw2LjIzNDM3NSBaIG0gMCwwLjE5NTMxMjUgYyA1LjMyNjczLDAgOC45MjUyMjYsNC4xMTc5MDU1IDkuMjM0Mzc1LDkuNDQ1MzEyNSAwLjMyMTUxMyw1LjU0MDM1MSAtMy45NDk4MDEsMTAuMjU5NDc0IC05LjYzNDc2Niw5LjY0MDYyNSBDIDExLjE3Mzg3NSwyNC45ODgzNjIgNi43NDk1MTQzLDIwLjkwMDgxNCA2LjM2MTMyODEsMTUuODYxMzI4IDYuMTU3MzgzMSwxMy4yMTM1NjMgNy4zMzUwNDMxLDEwLjg1OTY4MiA5LjIzNDM3NSw5LjE2MjEwOTQgMTEuMTMzNzA3LDcuNDY0NTM3MiAxMy43NTQ2MjgsNi40Mjk2ODc1IDE2LjQxNzk2OSw2LjQyOTY4NzUgWiBtIC0wLjA2ODM2LDEuNDE2MDE1NiBjIC0yLjI2NTc3NSwwIC00LjQ4ODcyOSwwLjg3OTIxOTYgLTYuMTA1NDY4LDIuMzI0MjE4OSAtMS42MTY3NDA4LDEuNDQ0OTk5IC0yLjYyNzc2MDcsMy40NjEyNjkgLTIuNDUzMTI1NCw1LjcyODUxNiAwLjMzMDg5ODYsNC4yOTU3NjggNC4wODE1OTY0LDcuNzYwMTIgOC4yMDUwNzg0LDguMjA4OTg0IDQuODQ0NTI1LDAuNTI3MzYgOC41MDAxNTYsLTMuNTA2MDk3IDguMjI2NTYyLC04LjIyMDcwMyBDIDIzLjk2MDY3MiwxMS4zNzE5OTYgMjAuODgxMDYsNy44NDU3MDMxIDE2LjM0OTYxNCw3Ljg0NTcwMzEgWiBtIDAsMC4xOTUzMTI1IGMgNC40MzA1MzQsMCA3LjQyMjQ2MSwzLjQyMjc5OTQgNy42Nzk2ODgsNy44NTU0Njg0IDAuMjY3NDEyLDQuNjA4MDgyIC0zLjI4Mzk3OCw4LjUzMjIyNiAtOC4wMTE3MTksOC4wMTc1NzggQyAxMS45ODkwNzUsMjMuNDc1NTM4IDguMzA3MTg5OSwyMC4wNzU1OTMgNy45ODQzNzUsMTUuODg0NzY2IDcuODE0ODQ2MywxMy42ODM4MTkgOC43OTUzMTA1LDExLjcyNjMzOCAxMC4zNzUsMTAuMzE0NDUzIDExLjk1NDY4OSw4LjkwMjU2ODkgMTQuMTM0MzcsOC4wNDEwMTU2IDE2LjM0OTYwOSw4LjA0MTAxNTYgWiBtIC0wLjA2ODM2LDEuNDE2MDE1NiBjIC0xLjgxNzY3MiwwIC0zLjYwMTM0MiwwLjcwMzk2ODggLTQuODk4NDM4LDEuODYzMjgwOCAtMS4yOTcwOTUsMS4xNTkzMSAtMi4xMDg5NjgzLDIuNzc5MTg1IC0xLjk2ODc0OTUsNC41OTk2MSAwLjI2NTUyNjksMy40NDcxMTEgMy4yNzM3NTA1LDYuMjI1ODEzIDYuNTgyMDMxNSw2LjU4NTkzNyAzLjg4NzI5NSwwLjQyMzE2IDYuODIzMDA4LC0yLjgxNTMxOCA2LjYwMzUxNSwtNi41OTc2NTYgQyAyMi4zODk1NDEsMTIuMjg4MjIyIDE5LjkxNjQ5NSw5LjQ1NzAzMTEgMTYuMjgxMjUsOS40NTcwMzEyIFogbSAwLDAuMTk1MzEyNiBjIDMuNTM0MzMzLDAgNS45MTc3NDIsMi43Mjc2OTYyIDYuMTIzMDQ3LDYuMjY1NjI1MiAwLjIxMzMxMSwzLjY3NTgxNCAtMi42MTYyMDgsNi44MDMwMjUgLTYuMzg2NzE5LDYuMzkyNTc4IC0zLjIxMzI5OCwtMC4zNDk3ODUgLTYuMTUwNzU5NywtMy4wNjIxMyAtNi40MDgyMDMsLTYuNDA0Mjk3IC0wLjEzNTExMjIsLTEuNzU0MTI3IDAuNjQ0MjUyLC0zLjMxMzI1NyAxLjkwNDI5NywtNC40Mzk0NTMgMS4yNjAwNDUsLTEuMTI2MTk2IDMuMDAwNDQxLC0xLjgxNDQ1MzMgNC43Njc1NzgsLTEuODE0NDUzMiB6IG0gLTAuMDcwMzEsMS40MTYwMTUyIGMgLTEuMzY5NTcyLDAgLTIuNzEyLDAuNTMwNjc1IC0zLjY4OTQ1NCwxLjQwNDI5NyAtMC45Nzc0NTMsMC44NzM2MjIgLTEuNTkwMTc3LDIuMDk1MTQ1IC0xLjQ4NDM3NSwzLjQ2ODc1IDAuMjAwMTU2LDIuNTk4NDUyIDIuNDY1OSw0LjY4OTU1MSA0Ljk1ODk4NSw0Ljk2MDkzOCAyLjkzMDA3LDAuMzE4OTU4IDUuMTQzOTA4LC0yLjEyMjU4NyA0Ljk3ODUxNSwtNC45NzI2NTYgLTAuMTU4MTQ1LC0yLjcyNTI0NCAtMi4wMjQ2MjIsLTQuODYxMzI5IC00Ljc2MzY3MSwtNC44NjEzMjkgeiBtIDAsMC4xOTUzMTMgYyAyLjYzODEzNSwwIDQuNDE0OTc1LDIuMDM0NTQ0IDQuNTY4MzU5LDQuNjc3NzM0IDAuMTU5MjExLDIuNzQzNTQ2IC0xLjk1MDM4Niw1LjA3MzgyNCAtNC43NjM2NzIsNC43Njc1NzggLTIuMzk4MTAyLC0wLjI2MTA0NyAtNC41OTExMzEsLTIuMjg3NzQxIC00Ljc4MzIwMywtNC43ODEyNSAtMC4xMDA2OTYsLTEuMzA3MzA4IDAuNDc5NTE5LC0yLjQ3MDAzOSAxLjQxOTkyMiwtMy4zMTA1NDYgMC45NDA0MDMsLTAuODQwNTA4IDIuMjM5NTU3LC0xLjM1MzUxNiAzLjU1ODU5NCwtMS4zNTM1MTYgeiBtIC0wLjA2ODM2LDEuNDE2MDE2IGMgLTAuOTIxNDcyLDAgLTEuODIyNjU3LDAuMzU1NDI1IC0yLjQ4MDQ2OSwwLjk0MzM1OSAtMC42NTc4MTEsMC41ODc5MzQgLTEuMDczMzM5LDEuNDE1MDEgLTEuMDAxOTUzLDIuMzQxNzk3IDAuMTM0Nzg1LDEuNzQ5NzkyIDEuNjU2MDk1LDMuMTUzMjkxIDMuMzMzOTg1LDMuMzM1OTM3IDEuOTcyODQ2LDAuMjE0NzU5IDMuNDY2NzYsLTEuNDMxODA5IDMuMzU1NDY4LC0zLjM0OTYwOSAtMC4xMDYyMjQsLTEuODMwNTAzIC0xLjM2NDE3NywtMy4yNzE0ODcgLTMuMjA3MDMxLC0zLjI3MTQ4NCB6IG0gMCwwLjE5NTMxMiBjIDEuNzQxOTQyLDAgMi45MTIyMDksMS4zMzk0NCAzLjAxMzY3MiwzLjA4Nzg5MSAwLjEwNTExLDEuODExMjc2IC0xLjI4NDU2MiwzLjM0NjU3NyAtMy4xNDA2MjUsMy4xNDQ1MzEgLTEuNTgyOTA3LC0wLjE3MjMwNyAtMy4wMzM0NTUsLTEuNTEzMzU1IC0zLjE2MDE1NiwtMy4xNTgyMDMgLTAuMDY2MjgsLTAuODYwNDkgMC4zMTQ3ODUsLTEuNjI0ODY4IDAuOTM1NTQ3LC0yLjE3OTY4OCAwLjYyMDc0OSwtMC41NTQ4MTkgMS40ODA2MiwtMC44OTQ1MzEgMi4zNTE1NTYsLTAuODk0NTMxIHogbSAtMC4wNjgzNiwxLjQxNjAxNiBjIC0wLjQ3MzM2OSwwIC0wLjkzNTI3MSwwLjE4MjEyOSAtMS4yNzM0MzgsMC40ODQzNzUgLTAuMzM4MTY3LDAuMzAyMjQ2IC0wLjU1NDU0NiwwLjczMDk2OSAtMC41MTc1NzgsMS4yMTA5MzcgMC4wNjk0MSwwLjkwMTEzMyAwLjg0ODI0OSwxLjYxODk4MSAxLjcxMDkzOCwxLjcxMjg5MSAxLjAxNTYxNiwwLjExMDU1NyAxLjc4OTYxNCwtMC43NDEwMzEgMS43MzI0MjEsLTEuNzI2NTYzIC0wLjA1NDMsLTAuOTM1NzY2IC0wLjcwNTY5MSwtMS42ODE2NCAtMS42NTIzNDMsLTEuNjgxNjQgeiBtIDAsMC4xOTUzMTIgYyAwLjg0NTc0LDAgMS40MDc0OSwwLjY0NDMzMyAxLjQ1NzAzMSwxLjQ5ODA0NyAwLjA1MTAxLDAuODc5MDA4IC0wLjYxNjc5MywxLjYxOTMyOSAtMS41MTU2MjUsMS41MjE0ODQgLTAuNzY3NzA2LC0wLjA4MzU3IC0xLjQ3NTc4LC0wLjczODk2NyAtMS41MzcxMDksLTEuNTM1MTU2IC0wLjAzMTg2LC0wLjQxMzY3MSAwLjE1MDA1NSwtMC43Nzk2OTcgMC40NTExNzIsLTEuMDQ4ODI4IDAuMzAxMTE2LC0wLjI2OTEzMSAwLjcyMTY5OCwtMC40MzU1NDcgMS4xNDQ1MzEsLTAuNDM1NTQ3IHoiIC8+PC9zdmc+');}.icon-x{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDQuMjQsMTk1Ljc2YTYsNiwwLDEsMS04LjQ4LDguNDhMMTI4LDEzNi40OSw2MC4yNCwyMDQuMjRhNiw2LDAsMCwxLTguNDgtOC40OEwxMTkuNTEsMTI4LDUxLjc2LDYwLjI0YTYsNiwwLDAsMSw4LjQ4LTguNDhMMTI4LDExOS41MWw2Ny43Ni02Ny43NWE2LDYsMCwwLDEsOC40OCw4LjQ4TDEzNi40OSwxMjhaIi8+PC9zdmc+');}.icon-magnifying-glass{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjguMjQsMjE5Ljc2bC01MS4zOC01MS4zOGE4Ni4xNSw4Ni4xNSwwLDEsMC04LjQ4LDguNDhsNTEuMzgsNTEuMzhhNiw2LDAsMCwwLDguNDgtOC40OFpNMzgsMTEyYTc0LDc0LDAsMSwxLDc0LDc0QTc0LjA5LDc0LjA5LDAsMCwxLDM4LDExMloiLz48L3N2Zz4=');}.icon-floppy-disk{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTcuOSw3My40MiwxODIuNTgsMzguMWExMy45LDEzLjksMCwwLDAtOS44OS00LjFINDhBMTQsMTQsMCwwLDAsMzQsNDhWMjA4YTE0LDE0LDAsMCwwLDE0LDE0SDIwOGExNCwxNCwwLDAsMCwxNC0xNFY4My4zMUExMy45LDEzLjksMCwwLDAsMjE3LjksNzMuNDJaTTE3MCwyMTBIODZWMTUyYTIsMiwwLDAsMSwyLTJoODBhMiwyLDAsMCwxLDIsMlptNDAtMmEyLDIsMCwwLDEtMiwySDE4MlYxNTJhMTQsMTQsMCwwLDAtMTQtMTRIODhhMTQsMTQsMCwwLDAtMTQsMTR2NThINDhhMiwyLDAsMCwxLTItMlY0OGEyLDIsMCwwLDEsMi0ySDE3Mi42OWEyLDIsMCwwLDEsMS40MS41OEwyMDkuNDIsODEuOWEyLDIsMCwwLDEsLjU4LDEuNDFaTTE1OCw3MmE2LDYsMCwwLDEtNiw2SDk2YTYsNiwwLDAsMSwwLTEyaDU2QTYsNiwwLDAsMSwxNTgsNzJaIi8+PC9zdmc+');}.icon-plus-square{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDgsMzRINDhBMTQsMTQsMCwwLDAsMzQsNDhWMjA4YTE0LDE0LDAsMCwwLDE0LDE0SDIwOGExNCwxNCwwLDAsMCwxNC0xNFY0OEExNCwxNCwwLDAsMCwyMDgsMzRabTIsMTc0YTIsMiwwLDAsMS0yLDJINDhhMiwyLDAsMCwxLTItMlY0OGEyLDIsMCwwLDEsMi0ySDIwOGEyLDIsMCwwLDEsMiwyWm0tMzYtODBhNiw2LDAsMCwxLTYsNkgxMzR2MzRhNiw2LDAsMCwxLTEyLDBWMTM0SDg4YTYsNiwwLDAsMSwwLTEyaDM0Vjg4YTYsNiwwLDAsMSwxMiwwdjM0aDM0QTYsNiwwLDAsMSwxNzQsMTI4WiIvPjwvc3ZnPg==');}.icon-x-circle{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjQuMjQsMTAwLjI0LDEzNi40OCwxMjhsMjcuNzYsMjcuNzZhNiw2LDAsMSwxLTguNDgsOC40OEwxMjgsMTM2LjQ4bC0yNy43NiwyNy43NmE2LDYsMCwwLDEtOC40OC04LjQ4TDExOS41MiwxMjgsOTEuNzYsMTAwLjI0YTYsNiwwLDAsMSw4LjQ4LTguNDhMMTI4LDExOS41MmwyNy43Ni0yNy43NmE2LDYsMCwwLDEsOC40OCw4LjQ4Wk0yMzAsMTI4QTEwMiwxMDIsMCwxLDEsMTI4LDI2LDEwMi4xMiwxMDIuMTIsMCwwLDEsMjMwLDEyOFptLTEyLDBhOTAsOTAsMCwxLDAtOTAsOTBBOTAuMSw5MC4xLDAsMCwwLDIxOCwxMjhaIi8+PC9zdmc+');}.icon-infinity{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDYsMTI4YTU0LDU0LDAsMCwxLTkyLjE4LDM4LjE4LDMuMDcsMy4wNywwLDAsMS0uMjUtLjI2bC02MC02Ny43NGE0Miw0MiwwLDEsMCwwLDU5LjY0bDguNTctOS42N2E2LDYsMCwxLDEsOSw4bC04LjY5LDkuODFhMy4wNywzLjA3LDAsMCwxLS4yNS4yNiw1NCw1NCwwLDEsMSwwLTc2LjM2LDMuMDcsMy4wNywwLDAsMSwuMjUuMjZsNjAsNjcuNzRhNDIsNDIsMCwxLDAsMC01OS42NGwtOC41Nyw5LjY3YTYsNiwwLDEsMS05LThsOC42OS05LjgxYTMuMDcsMy4wNywwLDAsMSwuMjUtLjI2QTU0LDU0LDAsMCwxLDI0NiwxMjhaIi8+PC9zdmc+');}.icon-arrow-counter-clockwise{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsMTI4YTk0LDk0LDAsMCwxLTkyLjc0LDk0SDEyOGE5My40Myw5My40MywwLDAsMS02NC41LTI1LjY1LDYsNiwwLDEsMSw4LjI0LTguNzJBODIsODIsMCwxLDAsNzAsNzBsLS4xOS4xOUwzOS40NCw5OEg3MmE2LDYsMCwwLDEsMCwxMkgyNGE2LDYsMCwwLDEtNi02VjU2YTYsNiwwLDAsMSwxMiwwVjkwLjM0TDYxLjYzLDYxLjRBOTQsOTQsMCwwLDEsMjIyLDEyOFoiLz48L3N2Zz4=');}.icon-clock{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMjgsMjZBMTAyLDEwMiwwLDEsMCwyMzAsMTI4LDEwMi4xMiwxMDIuMTIsMCwwLDAsMTI4LDI2Wm0wLDE5MmE5MCw5MCwwLDEsMSw5MC05MEE5MC4xLDkwLjEsMCwwLDEsMTI4LDIxOFptNjItOTBhNiw2LDAsMCwxLTYsNkgxMjhhNiw2LDAsMCwxLTYtNlY3MmE2LDYsMCwwLDEsMTIsMHY1MGg1MEE2LDYsMCwwLDEsMTkwLDEyOFoiLz48L3N2Zz4=');}.icon-x-square{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDgsMzRINDhBMTQsMTQsMCwwLDAsMzQsNDhWMjA4YTE0LDE0LDAsMCwwLDE0LDE0SDIwOGExNCwxNCwwLDAsMCwxNC0xNFY0OEExNCwxNCwwLDAsMCwyMDgsMzRabTIsMTc0YTIsMiwwLDAsMS0yLDJINDhhMiwyLDAsMCwxLTItMlY0OGEyLDIsMCwwLDEsMi0ySDIwOGEyLDIsMCwwLDEsMiwyWk0xNjQuMjQsMTAwLjI0LDEzNi40OCwxMjhsMjcuNzYsMjcuNzZhNiw2LDAsMSwxLTguNDgsOC40OEwxMjgsMTM2LjQ4bC0yNy43NiwyNy43NmE2LDYsMCwwLDEtOC40OC04LjQ4TDExOS41MiwxMjgsOTEuNzYsMTAwLjI0YTYsNiwwLDAsMSw4LjQ4LTguNDhMMTI4LDExOS41MmwyNy43Ni0yNy43NmE2LDYsMCwwLDEsOC40OCw4LjQ4WiIvPjwvc3ZnPg==');}.icon-eye-closed{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjkuMjEsMTY1YTYsNiwwLDAsMS0xMC40Miw2bC0yMC0zNS4wOGExMjIsMTIyLDAsMCwxLTM5LDE4LjA5bDYuMTcsMzdhNiw2LDAsMCwxLTQuOTMsNi45MSw2Ljg1LDYuODUsMCwwLDEtMSwuMDgsNiw2LDAsMCwxLTUuOTEtNUwxNDgsMTU2LjQ0YTEyOC44NiwxMjguODYsMCwwLDEtNDAsMEwxMDEuOTIsMTkzQTYsNiwwLDAsMSw5NiwxOThhNi44NSw2Ljg1LDAsMCwxLTEtLjA4QTYsNiwwLDAsMSw5MC4wOCwxOTFsNi4xNy0zN2ExMjIsMTIyLDAsMCwxLTM5LTE4LjA5TDM3LjIxLDE3MWE2LDYsMCwxLDEtMTAuNDItNmwyMC44NS0zNi40OGExNTIsMTUyLDAsMCwxLTIwLjMxLTIwLjc3LDYsNiwwLDAsMSw5LjM0LTcuNTRDNTMuNTQsMTIxLjExLDgzLjA3LDE0NiwxMjgsMTQ2czc0LjQ2LTI0Ljg5LDkxLjMzLTQ1Ljc3YTYsNiwwLDAsMSw5LjM0LDcuNTQsMTUyLDE1MiwwLDAsMS0yMC4zMSwyMC43N1oiLz48L3N2Zz4=');}.icon-arrow-elbow-left-up{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzgsMTkyYTYsNiwwLDAsMS02LDZIODhhNiw2LDAsMCwxLTYtNlY2Mi40OUw0NC4yNCwxMDAuMjRhNiw2LDAsMCwxLTguNDgtOC40OGw0OC00OGE2LDYsMCwwLDEsOC40OCwwbDQ4LDQ4YTYsNiwwLDEsMS04LjQ4LDguNDhMOTQsNjIuNDlWMTg2SDIzMkE2LDYsMCwwLDEsMjM4LDE5MloiLz48L3N2Zz4=');}.icon-arrow-elbow-right-up{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjAuMjQsMTAwLjI0YTYsNiwwLDAsMS04LjQ4LDBMMTc0LDYyLjQ5VjE5MmE2LDYsMCwwLDEtNiw2SDI0YTYsNiwwLDAsMSwwLTEySDE2MlY2Mi40OWwtMzcuNzYsMzcuNzVhNiw2LDAsMCwxLTguNDgtOC40OGw0OC00OGE2LDYsMCwwLDEsOC40OCwwbDQ4LDQ4QTYsNiwwLDAsMSwyMjAuMjQsMTAwLjI0WiIvPjwvc3ZnPg==');}.icon-dots-six-vertical{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMDIsNjBBMTAsMTAsMCwxLDEsOTIsNTAsMTAsMTAsMCwwLDEsMTAyLDYwWm02MiwxMGExMCwxMCwwLDEsMC0xMC0xMEExMCwxMCwwLDAsMCwxNjQsNzBaTTkyLDExOGExMCwxMCwwLDEsMCwxMCwxMEExMCwxMCwwLDAsMCw5MiwxMThabTcyLDBhMTAsMTAsMCwxLDAsMTAsMTBBMTAsMTAsMCwwLDAsMTY0LDExOFpNOTIsMTg2YTEwLDEwLDAsMSwwLDEwLDEwQTEwLDEwLDAsMCwwLDkyLDE4NlptNzIsMGExMCwxMCwwLDEsMCwxMCwxMEExMCwxMCwwLDAsMCwxNjQsMTg2WiIvPjwvc3ZnPg==');}.icon-plus{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsMTI4YTYsNiwwLDAsMS02LDZIMTM0djgyYTYsNiwwLDAsMS0xMiwwVjEzNEg0MGE2LDYsMCwwLDEsMC0xMmg4MlY0MGE2LDYsMCwwLDEsMTIsMHY4Mmg4MkE2LDYsMCwwLDEsMjIyLDEyOFoiLz48L3N2Zz4=');}.icon-pencil-simple{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjUuOSw3NC43OCwxODEuMjEsMzAuMDlhMTQsMTQsMCwwLDAtMTkuOCwwTDM4LjEsMTUzLjQxYTEzLjk0LDEzLjk0LDAsMCwwLTQuMSw5LjlWMjA4YTE0LDE0LDAsMCwwLDE0LDE0SDkyLjY5YTEzLjk0LDEzLjk0LDAsMCwwLDkuOS00LjFMMjI1LjksOTQuNThhMTQsMTQsMCwwLDAsMC0xOS44Wk05NC4xLDIwOS40MWEyLDIsMCwwLDEtMS40MS41OUg0OGEyLDIsMCwwLDEtMi0yVjE2My4zMWEyLDIsMCwwLDEsLjU5LTEuNDFMMTM2LDcyLjQ4LDE4My41MSwxMjBaTTIxNy40MSw4Ni4xLDE5MiwxMTEuNTEsMTQ0LjQ5LDY0LDE2OS45LDM4LjU4YTIsMiwwLDAsMSwyLjgzLDBsNDQuNjgsNDQuNjlhMiwyLDAsMCwxLDAsMi44M1oiLz48L3N2Zz4=');}.icon-logo{--icon:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2Zw0gICAgd2lkdGg9IjMyIg0gICAgaGVpZ2h0PSIzMiINICAgIHZpZXdCb3g9IjAgMCAzMiAzMiINICAgIHZlcnNpb249IjEuMSINICAgIHhtbDpzcGFjZT0icHJlc2VydmUiDSAgICBzdHlsZT0iY2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxLjUiDSAgICBpZD0ic3ZnMTQiDSAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciDSAgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcw0gICAgaWQ9ImRlZnMxNCIgLz48cGF0aA0gICAgZD0iTSAxNi41ODAwNzgsMi4xMzI4MTI1IEMgOC44NjQ4NDQ5LDIuMTMyODEyNSAxLjQ0MDYwMjEsOC4xNDY2MjE4IDIuMDMzMjAzMSwxNS44Mzk4NDQgMi41OTQ0NTg4LDIzLjEyNjY2NiA4Ljk3MTIwMTIsMjkuMDI1MTU1IDE1Ljk3MDcwMywyOS43ODcxMDkgMjQuMjIxMjI0LDMwLjY4NTI0IDMwLjQ0MDkxMSwyMy44MzQyNzcgMjkuOTc0NjA5LDE1Ljc5ODgyOCAyOS41Mjc4MTMsOC4wOTk4NjU1IDI0LjI5MTU2LDIuMTMyODEyNSAxNi41ODAwNzgsMi4xMzI4MTI1IFogbSAwLDAuNjA3NDIxOSBjIDAuMDEwNDYsMCAwLjAyMDgzLDAgMC4wMzEyNSwwIFYgMjkuMjMyNDIyIGMgLTAuMTkwMzIzLC0wLjAxMjE4IC0wLjM4MTUyMSwtMC4wMjc4MyAtMC41NzQyMTksLTAuMDQ4ODMgQyA5LjMxMzA0NTMsMjguNDUxNjE1IDMuMTc3ODc3NSwyMi43OTMwNDQgMi42Mzg2NzE5LDE1Ljc5Mjk2OSAyLjA3MjQ1Niw4LjQ0MjAxNTMgOS4yMDgxMDA4LDIuNzQwMjM0NCAxNi41ODAwNzgsMi43NDAyMzQ0IFogTSAxNi4wOTE3OTcsMy44ODQ3NjU2IDE2LDMuODg4NjcxOSBDIDEyLjcyNTQ1NCw0LjAxODM0ODkgOS41NTIzMzc5LDUuMzY0NjgzOCA3LjI1NTg1OTQsNy41IDQuOTU5MzgwOSw5LjYzNTMxNjIgMy41NDAyNzAzLDEyLjU2NDk3MiAzLjc5Mjk2ODgsMTUuODQ1NzAzIDQuMjg0NzczOSwyMi4yMzAwNDUgOS44NjQ0ODEyLDI3LjM4MzYwNiAxNS45OTQxNDEsMjguMDUyNzM0IGwgMC4wODk4NCwwLjAwOTggMC4wMjE0OCwtMC4xODE2NDEgLTAuMDkxOCwtMC4wMDk4IEMgOS45NzI2NzQ5LDI3LjIxMTY0NCA0LjQ1ODg2OTEsMjIuMTE2NDY4IDMuOTc0NjA5NCwxNS44MzAwNzggMy43MjY1NTU5LDEyLjYwOTY1MSA1LjExNTgwODQsOS43MzkwNDM3IDcuMzc4OTA2Miw3LjYzNDc2NTYgOS42NDIwMDQxLDUuNTMwNDg3NSAxMi43Nzg1MzksNC4xOTgxOTY4IDE2LjAwNzgxMiw0LjA3MDMxMjUgbCAwLjA5MTgsLTAuMDAzOTEgeiBtIDAsMS41MDE5NTMxIEwgMTYsNS4zOTA2MjUgQyAxMy4xMzE5NDksNS41MDQyMDQ3IDEwLjM1MzI5OCw2LjY4NDM0MTUgOC4zNDE3OTY5LDguNTU0Njg3NSA2LjMzMDI5NjIsMTAuNDI1MDMzIDUuMDg3MTkyOSwxMi45OTA4MTkgNS4zMDg1OTM3LDE1Ljg2NTIzNCA1LjczOTM5NCwyMS40NTc2NjkgMTAuNjI1MTYxLDI1Ljk3MDU0NyAxNS45OTQxNDEsMjYuNTU2NjQxIGwgMC4wODk4NCwwLjAwOTggMC4wMjE0OCwtMC4xNzk2ODcgLTAuMDkxOCwtMC4wMDk4IEMgMTAuNzMzMzU0LDI1LjgwMDUzMyA1LjkxMzQ4OTIsMjEuMzQ2MDQ2IDUuNDkwMjM0NCwxNS44NTE1NjMgNS4yNzM0Nzg0LDEzLjAzNzQ1MSA2LjQ4NjcyMzcsMTAuNTI2ODA4IDguNDY0ODQzOCw4LjY4NzUgMTAuNDQyOTY0LDYuODQ4MTkyMiAxMy4xODUwMzIsNS42ODQwNTI2IDE2LjAwNzgxMiw1LjU3MjI2NTYgbCAwLjA5MTgsLTAuMDAzOTEgeiBtIDAsMS41MDM5MDYzIEwgMTYsNi44OTI1NzgxIGMgLTIuNDYxNTc3LDAuMDk3NDgzIC00Ljg0NTcyOCwxLjExMTQxNzQgLTYuNTcyMjY1NiwyLjcxNjc5NjkgLTEuNzI2NTM4LDEuNjA1MzggLTIuNzk1NTc0MSwzLjgwNzI4MiAtMi42MDU0Njg4LDYuMjc1MzkxIDAuMzY5Nzk4Niw0LjgwMDU0IDQuNTYzNTMzNCw4LjY3NDY3NCA5LjE3MTg3NTQsOS4xNzc3MzQgbCAwLjA4OTg0LDAuMDA5OCAwLjAyMTQ4LC0wLjE4MTY0MSAtMC4wOTE4LC0wLjAwOTggQyAxMS40OTQwMzcsMjQuMzg3NDgxIDcuMzY2MTU1NywyMC41NzM2MzQgNy4wMDM5MDYyLDE1Ljg3MTA5NCA2LjgxODQ0ODEsMTMuNDYzMzIgNy44NTc2NDA1LDExLjMxNjUxMyA5LjU1MDc4MTMsOS43NDIxODc1IDExLjI0MzkyMiw4LjE2Nzg2MTggMTMuNTkxNTI5LDcuMTcxODYwOCAxNi4wMDc4MTIsNy4wNzYxNzE5IGwgMC4wOTE4LC0wLjAwMzkxIHogbSAwLDEuNTAxOTUzMSBMIDE2LDguMzk2NDg0NCBjIC0yLjA1NTA3MywwLjA4MTM4NCAtNC4wNDQ3NzUsMC45MjUyMzM0IC01LjQ4NjMyOCwyLjI2NTYyNDYgLTEuNDQxNTUzNSwxLjM0MDM5MyAtMi4zMzQ1ODgxLDMuMTgyMzc5IC0yLjE3NTc4MTQsNS4yNDQxNDEgMC4zMDg3OTIsNC4wMDg1NzkgMy44MDg2MDU0LDcuMjQwMTM2IDcuNjU2MjUwNCw3LjY2MDE1NiBsIDAuMDg5ODQsMC4wMDk4IDAuMDA3OCwtMC4wNjgzNiB2IC0wLjAwMiBsIDAuMDAyLC0wLjAwOTggYyA5LjQ5ZS00LC0wLjAwMzQgMC4wMDM1LC0wLjAwNjIgMC4wMDM5LC0wLjAwOTggNi40MmUtNCwtMC4wMDY3IDguMDJlLTQsLTAuMDEzMDEgMCwtMC4wMTk1MyBsIDAuMDA3OCwtMC4wNzIyNyAtMC4wOTE4LC0wLjAwOTggQyAxMi4yNTQ2NjcsMjIuOTc0NDIyIDguODIwNzc5NiwxOS44MDMyMzEgOC41MTk1MzEzLDE1Ljg5MjU3OCA4LjM2NTM2ODIsMTMuODkxMTA1IDkuMjI4NTM3MywxMi4xMDYyMzcgMTAuNjM2NzE5LDEwLjc5Njg3NSAxMi4wNDQ5LDkuNDg3NTEzIDEzLjk5Nzk5OSw4LjY1NzcxNyAxNi4wMDc4MTIsOC41NzgxMjUgbCAwLjA5MTgsLTAuMDAzOTEgeiBtIDAsMS41MDE5NTMyIEwgMTYsOS44OTg0Mzc1IGMgLTEuNjQ4NTg4LDAuMDY1Mjg3IC0zLjI0NTc2MSwwLjc0MjkzODUgLTQuNDAyMzQ0LDEuODE4MzU5NSAtMS4xNTY1ODIsMS4wNzU0MjEgLTEuODcxNjUwNiwyLjU1MzUzOCAtMS43NDQxNDA0LDQuMjA4OTg0IDAuMjQ3Nzg4NCwzLjIxNjY2OSAzLjA1MzY0MTQsNS44MDk1MDEgNi4xNDA2MjU0LDYuMTQ2NDg1IGwgMC4wODk4NCwwLjAwOTggMC4wMjE0OCwtMC4xODE2NCAtMC4wOTE4LC0wLjAwOTggYyAtMi45OTgzNDQsLTAuMzI3MzA4IC01LjczODI3MywtMi44NTk3OTggLTUuOTc4NTE2LC01Ljk3ODUxNiAtMC4xMjI4NjQ1LC0xLjU5NTE0MiAwLjU2NDI5OCwtMy4wMTgxMTcgMS42ODc1LC00LjA2MjUgMS4xMjMyMDIsLTEuMDQ0MzgyIDIuNjgxODM5LC0xLjcwNjAzNyA0LjI4NTE1NiwtMS43Njk1MzEgbCAwLjA5MTgsLTAuMDAzOSB6IG0gMCwxLjUwMzkwNjcgLTAuMDkxOCwwLjAwMiBjIC0xLjI0MjA5NSwwLjA0OTE5IC0yLjQ0NDgsMC41NjA2NTIgLTMuMzE2NDA2LDEuMzcxMDkzIC0wLjg3MTYwNiwwLjgxMDQ0MiAtMS40MTI2MTksMS45MjQ3MTMgLTEuMzE2NDA2LDMuMTczODI5IDAuMTg2NzgzLDIuNDI0NzMyIDIuMzAwNjQzLDQuMzc2OTEzIDQuNjI2OTUzLDQuNjMwODU5IGwgMC4wODk4NCwwLjAwOTggMC4wMjE0OCwtMC4xODE2NCAtMC4wOTE4LC0wLjAwOTggYyAtMi4yMzc2OTIsLTAuMjQ0MjcyIC00LjI4NTYwNCwtMi4xMzYwODMgLTQuNDY0ODQ0LC00LjQ2Mjg5IC0wLjA5MTU3LC0xLjE4ODgyNiAwLjQyMTUzMiwtMi4yNDc5MzMgMS4yNTk3NjYsLTMuMDI3MzQ0IDAuODM4MjM0LC0wLjc3OTQxMSAyLjAwMjM4MywtMS4yNzI5MTYgMy4xOTkyMTgsLTEuMzIwMzEzIGwgMC4wOTE4LC0wLjAwMzkgeiBtIDAsMS41MDE5NTMgLTAuMDkxOCwwLjAwMzkgYyAtMC44MzU2MTMsMC4wMzMwOSAtMS42NDM4MzEsMC4zNzQ0NTIgLTIuMjMwNDY5LDAuOTE5OTIyIC0wLjU4NjYzNywwLjU0NTQ3IC0wLjk1MTYzNiwxLjI5OTc3OCAtMC44ODY3MTgsMi4xNDI1NzggMC4xMjU3OCwxLjYzMjgyMSAxLjU0NTY3MywyLjk0MjM3IDMuMTExMzI4LDMuMTEzMjgxIC0wLjAwMjYsLTIuOGUtNCAtMC4wMDUzLDIuODZlLTQgLTAuMDA3OCwwIDAuMDAzLDYuMDNlLTQgMC4wMDY2LDAuMDAxNyAwLjAwOTgsMC4wMDIgMC4wMDMxLDMuMDhlLTQgMC4wMDY3LDEuMmUtNSAwLjAwOTgsMCBsIDAuMDc4MTMsMC4wMDk4IDAuMDIxNDgsLTAuMTgxNjQxIC0wLjA5MTgsLTAuMDA5OCBjIC0xLjQ3NzAxNSwtMC4xNjEyMzUgLTIuODMwOTg0LC0xLjQxMjM5NiAtMi45NDkyMTksLTIuOTQ3MjY2IC0wLjA2MDI3LC0wLjc4MjQ5NiAwLjI3NjgyMiwtMS40Nzk3MDkgMC44MzAwNzgsLTEuOTk0MTQxIDAuNTUzMjU3LC0wLjUxNDQzMSAxLjMyMjkzOSwtMC44NDE3NDggMi4xMTMyODEsLTAuODczMDQ2IGwgMC4wOTE4LC0wLjAwMzkgeiBtIDAsMS41MDE5NTMgTCAxNiwxNC40MDYyNSBjIC0wLjQyOTExNywwLjAxNjk5IC0wLjg0Mjg3MywwLjE5MjE2NiAtMS4xNDQ1MzEsMC40NzI2NTYgLTAuMzAxNjU5LDAuMjgwNDkxIC0wLjQ5MDY0OCwwLjY3MDk1NSAtMC40NTcwMzEsMS4xMDc0MjIgMC4wNjQ3NywwLjg0MDg4NiAwLjc5MDcyOSwxLjUxMTczMiAxLjU5NTcwMywxLjU5OTYwOSBsIDAuMDg5ODQsMC4wMDk4IDAuMDIxNDgsLTAuMTgxNjQxIC0wLjA5MTgsLTAuMDA5OCBjIC0wLjcxNjM1NywtMC4wNzgyIC0xLjM3NjM2MiwtMC42ODg2ODEgLTEuNDMzNTk0LC0xLjQzMTY0MSAtMC4wMjg5NywtMC4zNzYxNzkgMC4xMzIxMDUsLTAuNzExNDc3IDAuNDAwMzkxLC0wLjk2MDkzNyAwLjI2ODI4NiwtMC4yNDk0NjEgMC42NDM0ODUsLTAuNDA4NjI3IDEuMDI3MzQzLC0wLjQyMzgyOCBsIDAuMDkxOCwtMC4wMDM5IHoiDSAgICBzdHlsZT0iYmFzZWxpbmUtc2hpZnQ6YmFzZWxpbmU7Y2xpcC1ydWxlOm5vbnplcm87ZGlzcGxheTppbmxpbmU7b3ZlcmZsb3c6dmlzaWJsZTt2ZWN0b3ItZWZmZWN0Om5vbmU7ZmlsbDojMjIyMjIyO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO2VuYWJsZS1iYWNrZ3JvdW5kOmFjY3VtdWxhdGU7c3RvcC1jb2xvcjojMDAwMDAwO3N0b3Atb3BhY2l0eToxIg0gICAgaWQ9InBhdGgyNyIgLz48L3N2Zz4=');}.icon-jakevan{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHN0eWxlPSJjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsLXJ1bGU6ZXZlbm9kZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MiIgdmlld0JveD0iMCAwIDMyIDMyIj48cGF0aCBkPSJNMTcuODggMTQuNjhIMTIuOWwtLjQzLTEuNjNIOS41OGwtLjQ1IDEuNjNINi41bDIuODktOC43NGgzLjJsMi44OSA4LjY0di04LjZoMi40djMuNzhjLjEtLjIuMjItLjM4LjM1LS41Ny4xMy0uMi4yNi0uMzcuMzktLjU0bDEuODYtMi42N2g3Ljh2MS44OUgyNS40djEuMzdoMi42NXYxLjg4SDI1LjR2MS42NWgyLjg2djEuOTFoLTcuOTNsLTEuNzUtMy4zMi0uNy40MXptNS4xMy04LjU5LTIuNyAzLjc5IDIuNyA0Ljc0em0tMTEuMDUgNS4wMy0uMzgtMS40M2ExMzYuODYgMTM2Ljg2IDAgMCAwLS40LTEuNTVMMTEgNy4zOGExNy43NiAxNy43NiAwIDAgMS0uMzYgMS42bC0uMTguNzEtLjM5IDEuNDN6bS04LjU4IDYuM2E1Ljc0IDUuNzQgMCAwIDEtMS4yNC0uMTN2LTEuODNsLjQxLjA4Yy4xNS4wMy4zLjA1LjQ3LjA1LjMgMCAuNTEtLjA2LjY3LS4xN2EuOTIuOTIgMCAwIDAgLjM0LS41MmMuMDYtLjIzLjEtLjUyLjEtLjg2VjUuOThoMi40djcuODVjMCAuODgtLjEzIDEuNTctLjQgMi4xLS4yNi41Mi0uNjMuOS0xLjEgMS4xNC0uNDguMjMtMS4wMy4zNS0xLjY1LjM1WiIgc3R5bGU9ImZpbGw6Y3VycmVudENvbG9yO3N0cm9rZS13aWR0aDouMDE4NDM5MiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40IC42Nikgc2NhbGUoLjk2MDUwMTM0KSIvPjxwYXRoIGQ9Ik0yMi44MiAyMi4yN2gtNC4wNmwtLjM3LTEuNEgxNS45bC0uMzkgMS40aC0yLjI2bDIuNDktNy41M2gyLjc1bDIuNDkgNy40NHYtNy40MWgyLjdsMi43NyA1LjIxaC4wM2E0MS4xIDQxLjEgMCAwIDEtLjA3LTEuODJ2LTMuMzloMS44M3Y3LjVoLTIuN2wtMi43OS01LjI4aC0uMDRhMTIuODMgMTIuODMgMCAwIDEgLjA4IDEuMjZsLjAyLjY0em0tNC44Ni0zLjA3LS4zMy0xLjIzYTg5LjA3IDg5LjA3IDAgMCAwLS4zNS0xLjM0bC0uMTQtLjY1YTE1LjA0IDE1LjA0IDAgMCAxLS4zMSAxLjM3bC0uMTYuNjItLjMzIDEuMjN6bS0zLjg1LTQuNDMtMi41IDcuNUg5LjJsLTIuNS03LjVoMi4zMmwxLjA0IDMuOGExNS4wMyAxNS4wMyAwIDAgMSAuMzYgMS43NiA3LjYxIDcuNjEgMCAwIDEgLjItMS4ybC4xNC0uNTQgMS4wNi0zLjgyeiIgc3R5bGU9ImZpbGw6Y3VycmVudENvbG9yO3N0cm9rZS13aWR0aDouMDE1OTg4NCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40IC42Nikgc2NhbGUoLjk2MDUwMTM0KSIvPjxwYXRoIGQ9Ik0xMS45IDI0LjIxYzAgLjQtLjA3LjcyLS4yLjk5LS4xNS4yNi0uMzYuNDYtLjYzLjYtLjI4LjEzLS42Mi4yLTEuMDMuMkg5LjJ2LTMuNWguOTdjLjM4IDAgLjcuMDYuOTYuMTkuMjUuMTMuNDUuMzIuNTguNTguMTQuMjUuMi41Ny4yLjk0em0tLjI2LjAxYzAtLjMzLS4wNS0uNjEtLjE2LS44M2ExLjEgMS4xIDAgMCAwLS41MS0uNTEgMS45NSAxLjk1IDAgMCAwLS44Ny0uMTdoLS42NnYzLjA3aC42Yy41MyAwIC45My0uMTMgMS4yLS4zOS4yNy0uMjYuNC0uNjUuNC0xLjE3ek0xNC4yNyAyNmgtMS45NXYtMy41aDEuOTV2LjIyaC0xLjd2MS4zMmgxLjZ2LjIzaC0xLjZ2MS41aDEuN3ptMS4yOC0zLjVjLjI4IDAgLjUyLjAyLjcuMDhhLjguOCAwIDAgMSAuNDQuM2MuMS4xNC4xNC4zMy4xNC41N2EuOS45IDAgMCAxLS4xLjQ1Ljg3Ljg3IDAgMCAxLS4yNy4zMmMtLjEyLjA4LS4yNS4xNC0uNC4xOGwuOTggMS42aC0uM2wtLjkyLTEuNTNoLS44OVYyNmgtLjI1di0zLjV6bS0uMDMuMjFoLS41OXYxLjU1aC43MWMuMyAwIC41Mi0uMDcuNjktLjIxLjE2LS4xNC4yNC0uMzQuMjQtLjYgMC0uMjgtLjA5LS40Ny0uMjYtLjU4LS4xNy0uMS0uNDMtLjE2LS43OS0uMTZ6bTUuNTctLjIyTDIwLjEyIDI2aC0uMjVsLS43Ni0yLjY1LS4wNS0uMTYtLjA0LS4xNGExOC44IDE4LjggMCAwIDEtLjA2LS4yNCAyMC42IDIwLjYgMCAwIDEtLjExLjQ4TDE4LjA5IDI2aC0uMjVsLS45Ni0zLjVoLjI2bC42NyAyLjQ3YTI3LjM2IDI3LjM2IDAgMCAxIC4wOS4zNWwuMDQuMTcuMDMuMTUuMDMtLjE2YTQuODMgNC44MyAwIDAgMSAuMTQtLjUzbC43LTIuNDZoLjI1bC43MyAyLjQ4YTExLjk4IDExLjk4IDAgMCAxIC4xMy41M2wuMDQuMTVhMTEuMDIgMTEuMDIgMCAwIDEgLjE1LS42OGwuNjktMi40OHpNMjMuMjYgMjZoLTEuOTV2LTMuNWgxLjk1di4yMmgtMS43djEuMzJoMS42di4yM2gtMS42djEuNWgxLjd6bTEuMjgtMy41Yy4yOCAwIC41Mi4wMi43MS4wOGEuOC44IDAgMCAxIC40My4zYy4xLjE0LjE0LjMzLjE0LjU3YS45LjkgMCAwIDEtLjEuNDUuODcuODcgMCAwIDEtLjI3LjMyYy0uMTEuMDgtLjI1LjE0LS40LjE4bC45OCAxLjZoLS4zbC0uOTItMS41M2gtLjg4VjI2aC0uMjZ2LTMuNXptLS4wMi4yMWgtLjZ2MS41NWguNzJjLjI5IDAgLjUxLS4wNy42OC0uMjEuMTYtLjE0LjI0LS4zNC4yNC0uNiAwLS4yOC0uMDgtLjQ3LS4yNi0uNTgtLjE3LS4xLS40My0uMTYtLjc4LS4xNnpNMjYuNSAyNmgtLjI1di0zLjVoMS45NXYuMjJoLTEuN3YxLjQ5aDEuNnYuMjJoLTEuNnoiIHN0eWxlPSJmaWxsOmN1cnJlbnRDb2xvcjtzdHJva2Utd2lkdGg6LjAxMDEwNjgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNCAuNjYpIHNjYWxlKC45NjA1MDEzNCkiLz48L3N2Zz4=');}.icon-chat{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTYsNTBINDBBMTQsMTQsMCwwLDAsMjYsNjRWMjI0YTEzLjg4LDEzLjg4LDAsMCwwLDguMDksMTIuNjlBMTQuMTEsMTQuMTEsMCwwLDAsNDAsMjM4YTEzLjg3LDEzLjg3LDAsMCwwLDktMy4zMWwuMDYtLjA1TDgyLjIzLDIwNkgyMTZhMTQsMTQsMCwwLDAsMTQtMTRWNjRBMTQsMTQsMCwwLDAsMjE2LDUwWm0yLDE0MmEyLDIsMCwwLDEtMiwySDgwYTYsNiwwLDAsMC0zLjkyLDEuNDZMNDEuMjYsMjI1LjUzQTIsMiwwLDAsMSwzOCwyMjRWNjRhMiwyLDAsMCwxLDItMkgyMTZhMiwyLDAsMCwxLDIsMloiLz48L3N2Zz4=');}.icon-envelope{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjQsNTBIMzJhNiw2LDAsMCwwLTYsNlYxOTJhMTQsMTQsMCwwLDAsMTQsMTRIMjE2YTE0LDE0LDAsMCwwLDE0LTE0VjU2QTYsNiwwLDAsMCwyMjQsNTBabS05Niw4NS44Nkw0Ny40Miw2MkgyMDguNThaTTEwMS42NywxMjgsMzgsMTg2LjM2VjY5LjY0Wm04Ljg4LDguMTRMMTI0LDE0OC40MmE2LDYsMCwwLDAsOC4xLDBsMTMuNC0xMi4yOEwyMDguNTgsMTk0SDQ3LjQzWk0xNTQuMzMsMTI4LDIxOCw2OS42NFYxODYuMzZaIi8+PC9zdmc+');}.icon-calendar{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDgsMzRIMTgyVjI0YTYsNiwwLDAsMC0xMiwwVjM0SDg2VjI0YTYsNiwwLDAsMC0xMiwwVjM0SDQ4QTE0LDE0LDAsMCwwLDM0LDQ4VjIwOGExNCwxNCwwLDAsMCwxNCwxNEgyMDhhMTQsMTQsMCwwLDAsMTQtMTRWNDhBMTQsMTQsMCwwLDAsMjA4LDM0Wk00OCw0Nkg3NFY1NmE2LDYsMCwwLDAsMTIsMFY0Nmg4NFY1NmE2LDYsMCwwLDAsMTIsMFY0NmgyNmEyLDIsMCwwLDEsMiwyVjgySDQ2VjQ4QTIsMiwwLDAsMSw0OCw0NlpNMjA4LDIxMEg0OGEyLDIsMCwwLDEtMi0yVjk0SDIxMFYyMDhBMiwyLDAsMCwxLDIwOCwyMTBabS05OC05MHY2NGE2LDYsMCwwLDEtMTIsMFYxMjkuNzFsLTcuMzIsMy42NmE2LDYsMCwxLDEtNS4zNi0xMC43NGwxNi04QTYsNiwwLDAsMSwxMTAsMTIwWm01OS41NywyOS4yNUwxNDgsMTc4aDIwYTYsNiwwLDAsMSwwLDEySDEzNmE2LDYsMCwwLDEtNC44LTkuNkwxNjAsMTQyYTEwLDEwLDAsMSwwLTE2LjY1LTExQTYsNiwwLDEsMSwxMzMsMTI1YTIyLDIyLDAsMSwxLDM2LjYyLDI0LjI2WiIvPjwvc3ZnPg==');}.icon-clock-clockwise{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMzQsODB2NDQuNmwzNy4wOSwyMi4yNWE2LDYsMCwwLDEtNi4xOCwxMC4zbC00MC0yNEE2LDYsMCwwLDEsMTIyLDEyOFY4MGE2LDYsMCwwLDEsMTIsMFptOTAtMjJhNiw2LDAsMCwwLTYsNlY4Ny4zNmMtNy40OC04LjgzLTE0Ljk0LTE3LjEzLTIzLjUzLTI1LjgzYTk0LDk0LDAsMSwwLTEuOTUsMTM0LjgzLDYsNiwwLDAsMC04LjI0LTguNzJBODIsODIsMCwxLDEsMTg2LDcwYzkuMjQsOS4zNiwxNy4xOCwxOC4zLDI1LjMxLDI4SDE4NGE2LDYsMCwwLDAsMCwxMmg0MGE2LDYsMCwwLDAsNi02VjY0QTYsNiwwLDAsMCwyMjQsNThaIi8+PC9zdmc+');}.icon-shuffle{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzYuMjQsMTc5Ljc2YTYsNiwwLDAsMSwwLDguNDhsLTI0LDI0YTYsNiwwLDAsMS04LjQ4LTguNDhMMjE3LjUyLDE5MEgyMDAuOTRhNzAuMTYsNzAuMTYsMCwwLDEtNTctMjkuMzFsLTQxLjcxLTU4LjRBNTguMTEsNTguMTEsMCwwLDAsNTUuMDYsNzhIMzJhNiw2LDAsMCwxLDAtMTJINTUuMDZhNzAuMTYsNzAuMTYsMCwwLDEsNTcsMjkuMzFsNDEuNzEsNTguNEE1OC4xMSw1OC4xMSwwLDAsMCwyMDAuOTQsMTc4aDE2LjU4bC0xMy43Ni0xMy43NmE2LDYsMCwwLDEsOC40OC04LjQ4Wm0tOTIuMDYtNzQuNDFhNS45MSw1LjkxLDAsMCwwLDMuNDgsMS4xMiw2LDYsMCwwLDAsNC44OS0yLjUxbDEuMTktMS42N0E1OC4xMSw1OC4xMSwwLDAsMSwyMDAuOTQsNzhoMTYuNThMMjAzLjc2LDkxLjc2YTYsNiwwLDEsMCw4LjQ4LDguNDhsMjQtMjRhNiw2LDAsMCwwLDAtOC40OGwtMjQtMjRhNiw2LDAsMCwwLTguNDgsOC40OEwyMTcuNTIsNjZIMjAwLjk0YTcwLjE2LDcwLjE2LDAsMCwwLTU3LDI5LjMxTDE0Mi43OCw5N0E2LDYsMCwwLDAsMTQ0LjE4LDEwNS4zNVptLTMyLjM2LDQ1LjNhNiw2LDAsMCwwLTguMzcsMS4zOWwtMS4xOSwxLjY3QTU4LjExLDU4LjExLDAsMCwxLDU1LjA2LDE3OEgzMmE2LDYsMCwwLDAsMCwxMkg1NS4wNmE3MC4xNiw3MC4xNiwwLDAsMCw1Ny0yOS4zMWwxLjE5LTEuNjdBNiw2LDAsMCwwLDExMS44MiwxNTAuNjVaIi8+PC9zdmc+');}.icon-sort-descending{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik00MiwxMjhhNiw2LDAsMCwxLDYtNmg3MmE2LDYsMCwwLDEsMCwxMkg0OEE2LDYsMCwwLDEsNDIsMTI4Wm02LTU4aDU2YTYsNiwwLDAsMCwwLTEySDQ4YTYsNiwwLDAsMCwwLDEyWk0xODQsMTg2SDQ4YTYsNiwwLDAsMCwwLDEySDE4NGE2LDYsMCwwLDAsMC0xMlpNMjI4LjI0LDgzLjc2bC00MC00MGE2LDYsMCwwLDAtOC40OCwwbC00MCw0MGE2LDYsMCwwLDAsOC40OCw4LjQ4TDE3OCw2Mi40OVYxNDRhNiw2LDAsMCwwLDEyLDBWNjIuNDlsMjkuNzYsMjkuNzVhNiw2LDAsMCwwLDguNDgtOC40OFoiLz48L3N2Zz4=');}.icon-sort-ascending{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMjYsMTI4YTYsNiwwLDAsMS02LDZINDhhNiw2LDAsMCwxLDAtMTJoNzJBNiw2LDAsMCwxLDEyNiwxMjhaTTQ4LDcwSDE4NGE2LDYsMCwwLDAsMC0xMkg0OGE2LDYsMCwwLDAsMCwxMlptNTYsMTE2SDQ4YTYsNiwwLDAsMCwwLDEyaDU2YTYsNiwwLDAsMCwwLTEyWm0xMjQuMjQtMjIuMjRhNiw2LDAsMCwwLTguNDgsMEwxOTAsMTkzLjUxVjExMmE2LDYsMCwwLDAtMTIsMHY4MS41MWwtMjkuNzYtMjkuNzVhNiw2LDAsMCwwLTguNDgsOC40OGw0MCw0MGE2LDYsMCwwLDAsOC40OCwwbDQwLTQwQTYsNiwwLDAsMCwyMjguMjQsMTYzLjc2WiIvPjwvc3ZnPg==');}.icon-arrow-elbow-left-down{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzgsNzJhNiw2LDAsMCwxLTYsNkg5NFYyMDEuNTFsMzcuNzYtMzcuNzVhNiw2LDAsMCwxLDguNDgsOC40OGwtNDgsNDhhNiw2LDAsMCwxLTguNDgsMGwtNDgtNDhhNiw2LDAsMCwxLDguNDgtOC40OEw4MiwyMDEuNTFWNzJhNiw2LDAsMCwxLDYtNkgyMzJBNiw2LDAsMCwxLDIzOCw3MloiLz48L3N2Zz4=');}.icon-arrow-elbow-right-down{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjguMjQsMTY0LjI0bC00OCw0OGE2LDYsMCwwLDEtOC40OCwwbC00OC00OGE2LDYsMCwxLDEsOC40OC04LjQ4TDE3MCwxOTMuNTFWNzBIMzJhNiw2LDAsMCwxLDAtMTJIMTc2YTYsNiwwLDAsMSw2LDZWMTkzLjUxbDM3Ljc2LTM3Ljc1YTYsNiwwLDAsMSw4LjQ4LDguNDhaIi8+PC9zdmc+');}.icon-caret-left{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjQuMjQsMjAzLjc2YTYsNiwwLDEsMS04LjQ4LDguNDhsLTgwLTgwYTYsNiwwLDAsMSwwLTguNDhsODAtODBhNiw2LDAsMCwxLDguNDgsOC40OEw4OC40OSwxMjhaIi8+PC9zdmc+');}.icon-caret-right{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xODAuMjQsMTMyLjI0bC04MCw4MGE2LDYsMCwwLDEtOC40OC04LjQ4TDE2Ny41MSwxMjgsOTEuNzYsNTIuMjRhNiw2LDAsMCwxLDguNDgtOC40OGw4MCw4MEE2LDYsMCwwLDEsMTgwLjI0LDEzMi4yNFoiLz48L3N2Zz4=');}.icon-heart{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNzgsNDJjLTIxLDAtMzkuMjYsOS40Ny01MCwyNS4zNEMxMTcuMjYsNTEuNDcsOTksNDIsNzgsNDJhNjAuMDcsNjAuMDcsMCwwLDAtNjAsNjBjMCwyOS4yLDE4LjIsNTkuNTksNTQuMSw5MC4zMWEzMzQuNjgsMzM0LjY4LDAsMCwwLDUzLjA2LDM3LDYsNiwwLDAsMCw1LjY4LDAsMzM0LjY4LDMzNC42OCwwLDAsMCw1My4wNi0zN0MyMTkuOCwxNjEuNTksMjM4LDEzMS4yLDIzOCwxMDJBNjAuMDcsNjAuMDcsMCwwLDAsMTc4LDQyWk0xMjgsMjE3LjExQzExMS41OSwyMDcuNjQsMzAsMTU3LjcyLDMwLDEwMkE0OC4wNSw0OC4wNSwwLDAsMSw3OCw1NGMyMC4yOCwwLDM3LjMxLDEwLjgzLDQ0LjQ1LDI4LjI3YTYsNiwwLDAsMCwxMS4xLDBDMTQwLjY5LDY0LjgzLDE1Ny43Miw1NCwxNzgsNTRhNDguMDUsNDguMDUsMCwwLDEsNDgsNDhDMjI2LDE1Ny43MiwxNDQuNDEsMjA3LjY0LDEyOCwyMTcuMTFaIi8+PC9zdmc+');}.icon-dots-three{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMzgsMTI4YTEwLDEwLDAsMSwxLTEwLTEwQTEwLDEwLDAsMCwxLDEzOCwxMjhaTTYwLDExOGExMCwxMCwwLDEsMCwxMCwxMEExMCwxMCwwLDAsMCw2MCwxMThabTEzNiwwYTEwLDEwLDAsMSwwLDEwLDEwQTEwLDEwLDAsMCwwLDE5NiwxMThaIi8+PC9zdmc+');}.icon-user-square{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMDgsMzRINDhBMTQsMTQsMCwwLDAsMzQsNDhWMjA4YTE0LDE0LDAsMCwwLDE0LDE0SDIwOGExNCwxNCwwLDAsMCwxNC0xNFY0OEExNCwxNCwwLDAsMCwyMDgsMzRaTTk0LDEyMGEzNCwzNCwwLDEsMSwzNCwzNEEzNCwzNCwwLDAsMSw5NCwxMjBaTTY1Ljc3LDIxMGE2Ni40Myw2Ni40MywwLDAsMSwyMC43Ny0yOS4zNiw2Niw2NiwwLDAsMSw4Mi45MiwwQTY2LjQzLDY2LjQzLDAsMCwxLDE5MC4yMywyMTBaTTIxMCwyMDhhMiwyLDAsMCwxLTIsMmgtNS4xN2E3Ny44NSw3Ny44NSwwLDAsMC00OS4zOC01MS43MSw0Niw0NiwwLDEsMC01MC45LDBBNzcuODUsNzcuODUsMCwwLDAsNTMuMTcsMjEwSDQ4YTIsMiwwLDAsMS0yLTJWNDhhMiwyLDAsMCwxLDItMkgyMDhhMiwyLDAsMCwxLDIsMloiLz48L3N2Zz4=');}.icon-chat-teardrop{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMzIsMjZhOTguMTEsOTguMTEsMCwwLDAtOTgsOTh2ODRhMTQsMTQsMCwwLDAsMTQsMTRoODRhOTgsOTgsMCwwLDAsMC0xOTZabTAsMTg0SDQ4YTIsMiwwLDAsMS0yLTJWMTI0YTg2LDg2LDAsMSwxLDg2LDg2WiIvPjwvc3ZnPg==');}.icon-house-simple{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTcuOSwxMTAuMWwtODAtODBhMTQsMTQsMCwwLDAtMTkuOCwwbC04MCw4MEExMy45MiwxMy45MiwwLDAsMCwzNCwxMjB2OTZhNiw2LDAsMCwwLDYsNkgyMTZhNiw2LDAsMCwwLDYtNlYxMjBBMTMuOTIsMTMuOTIsMCwwLDAsMjE3LjksMTEwLjFaTTIxMCwyMTBINDZWMTIwYTIsMiwwLDAsMSwuNTgtMS40Mmw4MC04MGEyLDIsMCwwLDEsMi44NCwwbDgwLDgwQTIsMiwwLDAsMSwyMTAsMTIwWiIvPjwvc3ZnPg==');}.icon-star-half-fi{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzkuMTgsOTcuMjZBMTYuMzgsMTYuMzgsMCwwLDAsMjI0LjkyLDg2bC01OS00Ljc2TDE0My4xNCwyNi4xNWExNi4zNiwxNi4zNiwwLDAsMC0zMC4yNywwTDkwLjExLDgxLjIzLDMxLjA4LDg2YTE2LjQ2LDE2LjQ2LDAsMCwwLTkuMzcsMjguODZsNDUsMzguODNMNTMsMjExLjc1YTE2LjQsMTYuNCwwLDAsMCwyNC41LDE3LjgyTDEyOCwxOTguNDlsNTAuNTMsMzEuMDhBMTYuNCwxNi40LDAsMCwwLDIwMywyMTEuNzVsLTEzLjc2LTU4LjA3LDQ1LTM4LjgzQTE2LjQzLDE2LjQzLDAsMCwwLDIzOS4xOCw5Ny4yNlptLTE1LjM0LDUuNDctNDguNyw0MmE4LDgsMCwwLDAtMi41Niw3LjkxbDE0Ljg4LDYyLjhhLjM3LjM3LDAsMCwxLS4xNy40OGMtLjE4LjE0LS4yMy4xMS0uMzgsMGwtNTQuNzItMzMuNjVBOCw4LDAsMCwwLDEyOCwxODEuMVYzMmMuMjQsMCwuMjcuMDguMzUuMjZMMTUzLDkxLjg2YTgsOCwwLDAsMCw2Ljc1LDQuOTJsNjMuOTEsNS4xNmMuMTYsMCwuMjUsMCwuMzQuMjlTMjI0LDEwMi42MywyMjMuODQsMTAyLjczWiIvPjwvc3ZnPg==');}.icon-star-fi{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzQuMjksMTE0Ljg1bC00NSwzOC44M0wyMDMsMjExLjc1YTE2LjQsMTYuNCwwLDAsMS0yNC41LDE3LjgyTDEyOCwxOTguNDksNzcuNDcsMjI5LjU3QTE2LjQsMTYuNCwwLDAsMSw1MywyMTEuNzVsMTMuNzYtNTguMDctNDUtMzguODNBMTYuNDYsMTYuNDYsMCwwLDEsMzEuMDgsODZsNTktNC43NiwyMi43Ni01NS4wOGExNi4zNiwxNi4zNiwwLDAsMSwzMC4yNywwbDIyLjc1LDU1LjA4LDU5LDQuNzZhMTYuNDYsMTYuNDYsMCwwLDEsOS4zNywyOC44NloiLz48L3N2Zz4=');}.icon-heart-fi{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDAsMTAyYzAsNzAtMTAzLjc5LDEyNi42Ni0xMDguMjEsMTI5YTgsOCwwLDAsMS03LjU4LDBDMTE5Ljc5LDIyOC42NiwxNiwxNzIsMTYsMTAyQTYyLjA3LDYyLjA3LDAsMCwxLDc4LDQwYzIwLjY1LDAsMzguNzMsOC44OCw1MCwyMy44OUMxMzkuMjcsNDguODgsMTU3LjM1LDQwLDE3OCw0MEE2Mi4wNyw2Mi4wNywwLDAsMSwyNDAsMTAyWiIvPjwvc3ZnPg==');} |
| | | .icon-google-logo{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsMTI4YTk0LDk0LDAsMSwxLTIxLjQ5LTU5LjgyLDYsNiwwLDEsMS05LjI1LDcuNjRBODIsODIsMCwxLDAsMjA5Ljc4LDEzNEgxMjhhNiw2LDAsMCwxLDAtMTJoODhBNiw2LDAsMCwxLDIyMiwxMjhaIi8+PC9zdmc+');}.icon-apple-logo{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTkuNCwxNjcuODRDMjAxLjcxLDE1NS42OSwxOTgsMTM1LjEyLDE5OCwxMjBjMC0xOC40MiwxMy44Ni0zNC4yOSwyMi4xMi00Mi4xMmE2LDYsMCwwLDAsMC04LjcxQzIwOCw1Ny43LDE4Ny4wNyw1MCwxNjgsNTBhNzAuMjMsNzAuMjMsMCwwLDAtNDAsMTIuNTUsNjkuNiw2OS42LDAsMCwwLTg5LjMxLDguMDhBNzIuNjMsNzIuNjMsMCwwLDAsMTgsMTIzLjM1YTEyNS4xMSwxMjUuMTEsMCwwLDAsMzkuNTMsODguMzNBMzcuODUsMzcuODUsMCwwLDAsODMuNiwyMjJoODcuN0EzNy44MywzNy44MywwLDAsMCwxOTksMjEwLjA3YTEyMi42LDEyMi42LDAsMCwwLDE3LjU0LTI0LjJjNi41NS0xMiw1Ljc3LTEzLjc1LDUtMTUuNDhBNi4wNyw2LjA3LDAsMCwwLDIxOS40LDE2Ny44NFptLTI5LjIzLDM0QTI1LjgyLDI1LjgyLDAsMCwxLDE3MS4zLDIxMEg4My42QTI1Ljg1LDI1Ljg1LDAsMCwxLDY1Ljc4LDIwMywxMTMuMjEsMTEzLjIxLDAsMCwxLDMwLDEyM2E2MC41NSw2MC41NSwwLDAsMSwxNy4yMS00NEE1Ni44Miw1Ni44MiwwLDAsMSw4OCw2MmguODFhNTcuMzUsNTcuMzUsMCwwLDEsMzUuNDQsMTIuNzEsNiw2LDAsMCwwLDcuNSwwQTU3LjM5LDU3LjM5LDAsMCwxLDE2OCw2MmMxMy44OSwwLDI4LjgxLDQuNjgsMzkuMTEsMTItOS40NCwxMC4xNC0yMS4xLDI2LjU5LTIxLjEsNDYsMCwyMy43OCw3LjgxLDQyLjYsMjIuNjYsNTQuNzdBMTA3LjMzLDEwNy4zMywwLDAsMSwxOTAuMTcsMjAxLjg5Wm0tNjAtMTcxLjM5QTM4LDM4LDAsMCwxLDE2NywyaDFhNiw2LDAsMCwxLDAsMTJoLTFhMjYsMjYsMCwwLDAtMjUuMTgsMTkuNSw2LDYsMCwxLDEtMTEuNjItM1oiLz48L3N2Zz4=');}.icon-check-circle{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNzIuMjQsOTkuNzZhNiw2LDAsMCwxLDAsOC40OGwtNTYsNTZhNiw2LDAsMCwxLTguNDgsMGwtMjQtMjRhNiw2LDAsMCwxLDguNDgtOC40OEwxMTIsMTUxLjUxbDUxLjc2LTUxLjc1QTYsNiwwLDAsMSwxNzIuMjQsOTkuNzZaTTIzMCwxMjhBMTAyLDEwMiwwLDEsMSwxMjgsMjYsMTAyLjEyLDEwMi4xMiwwLDAsMSwyMzAsMTI4Wm0tMTIsMGE5MCw5MCwwLDEsMC05MCw5MEE5MC4xLDkwLjEsMCwwLDAsMjE4LDEyOFoiLz48L3N2Zz4=');}.icon-cloud-slash{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik01Mi40NCwzNkE2LDYsMCwwLDAsNDMuNTYsNDRsNDAuMTgsNDQuMmMtLjQ1Ljg3LS45LDEuNzUtMS4zMiwyLjY0QTYyLDYyLDAsMSwwLDcyLDIxNGg4OGE4NS4yMyw4NS4yMywwLDAsMCwzMi4zNS02LjNMMjAzLjU2LDIyMGE2LDYsMCwwLDAsOC44OC04LjA4Wk0xNjAsMjAySDcyYTUwLDUwLDAsMSwxLDUuOS05OS42NEE4Ni4yNSw4Ni4yNSwwLDAsMCw3NCwxMjhhNiw2LDAsMCwwLDEyLDAsNzMuOTIsNzMuOTIsMCwwLDEsNi40NC0zMC4ybDkxLjIyLDEwMC4zNEE3My42NSw3My42NSwwLDAsMSwxNjAsMjAyWm04Ni03NGE4NS44NSw4NS44NSwwLDAsMS0yMS44NSw1Ny4yNyw2LDYsMCwwLDEtNC40NywyLDYsNiwwLDAsMS00LjQ3LTEwLDc0LDc0LDAsMCwwLTk5LTEwOC45Miw2LDYsMCwxLDEtNy4xMS05LjY3QTg2LDg2LDAsMCwxLDI0NiwxMjhaIi8+PC9zdmc+');}.icon-exclamation-mark{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNDIsMjAwYTE0LDE0LDAsMSwxLTE0LTE0QTE0LDE0LDAsMCwxLDE0MiwyMDBabS0xNC00MmE2LDYsMCwwLDAsNi02VjQ4YTYsNiwwLDAsMC0xMiwwVjE1MkE2LDYsMCwwLDAsMTI4LDE1OFoiLz48L3N2Zz4=');}.icon-cloud-arrow-down{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yNDYsMTI4YTg1LjI3LDg1LjI3LDAsMCwxLTE3LjIsNTEuNiw2LDYsMCwxLDEtOS42LTcuMkE3NCw3NCwwLDEsMCw4NiwxMjhhNiw2LDAsMCwxLTEyLDAsODUuNTQsODUuNTQsMCwwLDEsMy45MS0yNS42NEE1MC42OCw1MC42OCwwLDAsMCw3MiwxMDJhNTAsNTAsMCwwLDAsMCwxMDBIOTZhNiw2LDAsMCwxLDAsMTJINzJBNjIsNjIsMCwxLDEsODIuNDMsOTAuODgsODYsODYsMCwwLDEsMjQ2LDEyOFptLTY2LjI0LDQzLjc2TDE1OCwxOTMuNTFWMTI4YTYsNiwwLDAsMC0xMiwwdjY1LjUxbC0yMS43Ni0yMS43NWE2LDYsMCwwLDAtOC40OCw4LjQ4bDMyLDMyYTYsNiwwLDAsMCw4LjQ4LDBsMzItMzJhNiw2LDAsMCwwLTguNDgtOC40OFoiLz48L3N2Zz4=');}.icon-caret-down{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTIuMjQsMTAwLjI0bC04MCw4MGE2LDYsMCwwLDEtOC40OCwwbC04MC04MGE2LDYsMCwwLDEsOC40OC04LjQ4TDEyOCwxNjcuNTFsNzUuNzYtNzUuNzVhNiw2LDAsMCwxLDguNDgsOC40OFoiLz48L3N2Zz4=');}.icon-cloud-arrow-up{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xODguMjQsMTY0LjI0YTYsNiwwLDAsMS04LjQ4LDBMMTU4LDE0Mi40OVYyMDhhNiw2LDAsMCwxLTEyLDBWMTQyLjQ5bC0yMS43NiwyMS43NWE2LDYsMCwwLDEtOC40OC04LjQ4bDMyLTMyYTYsNiwwLDAsMSw4LjQ4LDBsMzIsMzJBNiw2LDAsMCwxLDE4OC4yNCwxNjQuMjRaTTE2MCw0MkE4Ni4xLDg2LjEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDQwYTYsNiwwLDAsMCwwLTEySDcyYTUwLDUwLDAsMCwxLDAtMTAwLDUwLjY4LDUwLjY4LDAsMCwxLDUuOTEuMzZBODUuNTQsODUuNTQsMCwwLDAsNzQsMTI4YTYsNiwwLDAsMCwxMiwwLDc0LDc0LDAsMSwxLDEwMy42LDY3Ljg1LDYsNiwwLDAsMCw0LjgsMTFBODYsODYsMCwwLDAsMTYwLDQyWiIvPjwvc3ZnPg==');}.icon-cloud-check{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjAsNDJBODYuMTEsODYuMTEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDg4YTg2LDg2LDAsMCwwLDAtMTcyWm0wLDE2MEg3MmE1MCw1MCwwLDAsMSwwLTEwMCw1MC42Nyw1MC42NywwLDAsMSw1LjkxLjM1QTg1LjYxLDg1LjYxLDAsMCwwLDc0LDEyOGE2LDYsMCwwLDAsMTIsMCw3NCw3NCwwLDEsMSw3NCw3NFptMzYuMjQtOTQuMjRhNiw2LDAsMCwxLDAsOC40OGwtNDgsNDhhNiw2LDAsMCwxLTguNDgsMGwtMjQtMjRhNiw2LDAsMCwxLDguNDgtOC40OEwxNDQsMTUxLjUxbDQzLjc2LTQzLjc1QTYsNiwwLDAsMSwxOTYuMjQsMTA3Ljc2WiIvPjwvc3ZnPg==');}.icon-cloud-warning{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjAsNDJBODYuMTEsODYuMTEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDg4YTg2LDg2LDAsMCwwLDAtMTcyWm0wLDE2MEg3MmE1MCw1MCwwLDAsMSwwLTEwMCw1MC42Nyw1MC42NywwLDAsMSw1LjkxLjM1QTg1LjYxLDg1LjYxLDAsMCwwLDc0LDEyOGE2LDYsMCwwLDAsMTIsMCw3NCw3NCwwLDEsMSw3NCw3NFptLTYtNzRWODhhNiw2LDAsMCwxLDEyLDB2NDBhNiw2LDAsMCwxLTEyLDBabTE2LDM2YTEwLDEwLDAsMSwxLTEwLTEwQTEwLDEwLDAsMCwxLDE3MCwxNjRaIi8+PC9zdmc+');}.icon-syncing{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgZmlsbD0iY3VycmVudENvbG9yIiB2aWV3Qm94PSIwIDAgMjU2IDI1NiI+PHBhdGggaWQ9InJlZnJlc2giIGQ9Ik0xNjAuMDQ3IDEyMi44NzVhMzAuNzg0IDMwLjc4NCAwIDAgMC0yMS43NSA4Ljc5N2MtMi44NDIgMy4wMDMtLjQ2NyA0Ljk3MSAxLjMxMiAzLjE1NiAxMS4wNDMtMTAuNzg2IDI4LjcxLTEwLjY4IDM5LjYyNS4yMzRsNy4yMDMgNy4yMDRoLTEyLjg3NWMtMy4zNDcuMDA4LTMuMTY1IDMuODc1IDAgMy44NzVoMTYuMTFjMi4wNjIgMCAyLjU0LTEuNDE4IDIuNTYyLTQuOTdsLjA5NC0xNC45MjFjLjAyLTMuMjktMy40MzctMy4xNjUtMy40MzcgMHYxMi44NmwtNy4yMDMtNy4xODhhMzAuNzY4IDMwLjc2OCAwIDAgMC0yMS42NDEtOS4wNDd6bS0yOS41OTQgMzkuNzk3Yy0yLjA2MiAwLTIuNTI0IDEuNDAyLTIuNTQ3IDQuOTUzbC0uMDk0IDE0LjkyMmMtLjAyIDMuMjkgMy40MjIgMy4xNjQgMy40MjIgMHYtMTIuODZsNy4yMDMgNy4yMDRjMTEuOTU2IDExLjk1NSAzMS4zMTIgMTIuMDY0IDQzLjQwNy4yNSAyLjg0Mi0zLjAwMy40NTEtNC45ODgtMS4zMjgtMy4xNzItMTEuMDQzIDEwLjc4Ni0yOC43MSAxMC42OC0zOS42MjUtLjIzNWwtNy4xODgtNy4yMDNoMTIuODZjMy4zNDctLjAwOCAzLjE2NS0zLjg2IDAtMy44NmgtMTYuMTF6Ii8+PHBhdGggZD0iTTE2MCA0NGE4NC4xMSA4NC4xMSAwIDAgMC03Ni40MSA0OS4xMkE2MC43MSA2MC43MSAwIDAgMCA3MiA5MmE2MCA2MCAwIDAgMCAwIDEyMGg4OGE4NCA4NCAwIDAgMCAwLTE2OFptMCAxNjBINzJhNTIgNTIgMCAxIDEgOC41NS0xMDMuM0E4My42NiA4My42NiAwIDAgMCA3NiAxMjhhNCA0IDAgMCAwIDggMCA3NiA3NiAwIDEgMSA3NiA3NloiLz48L3N2Zz4=');}.icon-cloud-x{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xNjAsNDJBODYuMTEsODYuMTEsMCwwLDAsODIuNDMsOTAuODgsNjIsNjIsMCwxLDAsNzIsMjE0aDg4YTg2LDg2LDAsMCwwLDAtMTcyWm0wLDE2MEg3MmE1MCw1MCwwLDAsMSwwLTEwMCw1MC42Nyw1MC42NywwLDAsMSw1LjkxLjM1QTg1LjYxLDg1LjYxLDAsMCwwLDc0LDEyOGE2LDYsMCwwLDAsMTIsMCw3NCw3NCwwLDEsMSw3NCw3NFptMjguMjQtODUuNzZMMTY4LjQ4LDEzNmwxOS43NiwxOS43NmE2LDYsMCwxLDEtOC40OCw4LjQ4TDE2MCwxNDQuNDhsLTE5Ljc2LDE5Ljc2YTYsNiwwLDAsMS04LjQ4LTguNDhMMTUxLjUyLDEzNmwtMTkuNzYtMTkuNzZhNiw2LDAsMCwxLDguNDgtOC40OEwxNjAsMTI3LjUybDE5Ljc2LTE5Ljc2YTYsNiwwLDAsMSw4LjQ4LDguNDhaIi8+PC9zdmc+');}.icon-arrows-clockwise{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMjIsNDhWOTZhNiw2LDAsMCwxLTYsNkgxNjhhNiw2LDAsMCwxLDAtMTJoMzMuNTJMMTgzLjQ3LDcyYTgxLjUxLDgxLjUxLDAsMCwwLTU3LjUzLTI0aC0uNDZBODEuNSw4MS41LDAsMCwwLDY4LjE5LDcxLjI4YTYsNiwwLDEsMS04LjM4LTguNTgsOTMuMzgsOTMuMzgsMCwwLDEsNjUuNjctMjYuNzZIMTI2YTkzLjQ1LDkzLjQ1LDAsMCwxLDY2LDI3LjUzbDE4LDE4VjQ4YTYsNiwwLDAsMSwxMiwwWk0xODcuODEsMTg0LjcyYTgxLjUsODEuNSwwLDAsMS01Ny4yOSwyMy4zNGgtLjQ2YTgxLjUxLDgxLjUxLDAsMCwxLTU3LjUzLTI0TDU0LjQ4LDE2Nkg4OGE2LDYsMCwwLDAsMC0xMkg0MGE2LDYsMCwwLDAtNiw2djQ4YTYsNiwwLDAsMCwxMiwwVjE3NC40OGwxOCwxOC4wNWE5My40NSw5My40NSwwLDAsMCw2NiwyNy41M2guNTJhOTMuMzgsOTMuMzgsMCwwLDAsNjUuNjctMjYuNzYsNiw2LDAsMSwwLTguMzgtOC41OFoiLz48L3N2Zz4=');}.icon-share-fat{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzYuMjQsMTA3Ljc2bC04MC04MEE2LDYsMCwwLDAsMTQ2LDMyVjc0LjJjLTU0LjQ4LDMuNTktMTIwLjM5LDU1LTEyNy45MywxMjAuNjZhMTAsMTAsMCwwLDAsMTcuMjMsOGgwQzQ2LjU2LDE5MC44NSw4NywxNTIuNiwxNDYsMTUwLjEzVjE5MmE2LDYsMCwwLDAsMTAuMjQsNC4yNGw4MC04MEE2LDYsMCwwLDAsMjM2LjI0LDEwNy43NlpNMTU4LDE3Ny41MlYxNDRhNiw2LDAsMCwwLTYtNmMtMjcuNzMsMC01NC43Niw3LjI1LTgwLjMyLDIxLjU1YTE5My4zOCwxOTMuMzgsMCwwLDAtNDAuODEsMzAuNjVjNC43LTI2LjU2LDIwLjE2LTUyLDQ0LTcyLjI3Qzk4LjQ3LDk3Ljk0LDEyNy4yOSw4NiwxNTIsODZhNiw2LDAsMCwwLDYtNlY0Ni40OUwyMjMuNTEsMTEyWiIvPjwvc3ZnPg==');}.icon-trash{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTYsNTBIMTc0VjQwYTIyLDIyLDAsMCwwLTIyLTIySDEwNEEyMiwyMiwwLDAsMCw4Miw0MFY1MEg0MGE2LDYsMCwwLDAsMCwxMkg1MFYyMDhhMTQsMTQsMCwwLDAsMTQsMTRIMTkyYTE0LDE0LDAsMCwwLDE0LTE0VjYyaDEwYTYsNiwwLDAsMCwwLTEyWk05NCw0MGExMCwxMCwwLDAsMSwxMC0xMGg0OGExMCwxMCwwLDAsMSwxMCwxMFY1MEg5NFpNMTk0LDIwOGEyLDIsMCwwLDEtMiwySDY0YTIsMiwwLDAsMS0yLTJWNjJIMTk0Wk0xMTAsMTA0djY0YTYsNiwwLDAsMS0xMiwwVjEwNGE2LDYsMCwwLDEsMTIsMFptNDgsMHY2NGE2LDYsMCwwLDEtMTIsMFYxMDRhNiw2LDAsMCwxLDEyLDBaIi8+PC9zdmc+');}.icon-star{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzcuMjgsOTcuODdBMTQuMTgsMTQuMTgsMCwwLDAsMjI0Ljc2LDg4bC02MC4yNS00Ljg3LTIzLjIyLTU2LjJhMTQuMzcsMTQuMzcsMCwwLDAtMjYuNTgsMEw5MS40OSw4My4xMSwzMS4yNCw4OGExNC4xOCwxNC4xOCwwLDAsMC0xMi41Miw5Ljg5QTE0LjQzLDE0LjQzLDAsMCwwLDIzLDExMy4zMkw2OSwxNTIuOTNsLTE0LDU5LjI1YTE0LjQsMTQuNCwwLDAsMCw1LjU5LDE1LDE0LjEsMTQuMSwwLDAsMCwxNS45MS42TDEyOCwxOTYuMTJsNTEuNTgsMzEuNzFhMTQuMSwxNC4xLDAsMCwwLDE1LjkxLS42LDE0LjQsMTQuNCwwLDAsMCw1LjU5LTE1bC0xNC01OS4yNUwyMzMsMTEzLjMyQTE0LjQzLDE0LjQzLDAsMCwwLDIzNy4yOCw5Ny44N1ptLTEyLjE0LDYuMzctNDguNjksNDJhNiw2LDAsMCwwLTEuOTIsNS45MmwxNC44OCw2Mi43OWEyLjM1LDIuMzUsMCwwLDEtLjk1LDIuNTcsMi4yNCwyLjI0LDAsMCwxLTIuNi4xTDEzMS4xNCwxODRhNiw2LDAsMCwwLTYuMjgsMEw3MC4xNCwyMTcuNjFhMi4yNCwyLjI0LDAsMCwxLTIuNi0uMSwyLjM1LDIuMzUsMCwwLDEtMS0yLjU3bDE0Ljg4LTYyLjc5YTYsNiwwLDAsMC0xLjkyLTUuOTJsLTQ4LjY5LTQyYTIuMzcsMi4zNywwLDAsMS0uNzMtMi42NSwyLjI4LDIuMjgsMCwwLDEsMi4wNy0xLjY1bDYzLjkyLTUuMTZhNiw2LDAsMCwwLDUuMDYtMy42OWwyNC42My01OS42YTIuMzUsMi4zNSwwLDAsMSw0LjM4LDBsMjQuNjMsNTkuNmE2LDYsMCwwLDAsNS4wNiwzLjY5bDYzLjkyLDUuMTZhMi4yOCwyLjI4LDAsMCwxLDIuMDcsMS42NUEyLjM3LDIuMzcsMCwwLDEsMjI1LjE0LDEwNC4yNFoiLz48L3N2Zz4=');}.icon-alphabetical{--icon:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9ImN1cnJlbnRDb2xvciIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTgzLjc4IDE4NC4wNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtNTkuNTg2IDY5Ljc0MmMtMC44NTEzIDAtMS40NjEgMC4xOTY1Ni0xLjgzNjYgMC41OTcxOC0wLjM1MDU0IDAuMzc1NTgtMC41Mjk1OCAxLjAyMjktMC41Mjk1OCAxLjk0OTNzMC4xNzkwMyAxLjU5MzcgMC41Mjk1OCAxLjk5NDRjMC4zNzU1OCAwLjM3NTU4IDAuOTg1MjkgMC41NjMzOCAxLjgzNjYgMC41NjMzOGg3LjAxOTdsLTEyLjQyOCAzNC4zNjZoLTIuMTA3Yy0wLjg1MTMgMC0xLjQ2MSAwLjE5NjU2LTEuODM2NiAwLjU5NzE4LTAuMzUwNTQgMC4zNzU1OC0wLjUyOTU3IDEuMDM0MS0wLjUyOTU3IDEuOTYwNiAwIDAuOTI2NDQgMC4xNzkwMyAxLjU4MjUgMC41Mjk1NyAxLjk4MyAwLjM3NTU4IDAuMzc1NTkgMC45ODUyOSAwLjU2MzM4IDEuODM2NiAwLjU2MzM4aDEyLjU1MmMwLjg1MTMgMCAxLjQ1MjItMC4xODc3OSAxLjgwMjgtMC41NjMzOCAwLjM3NTU4LTAuNDAwNjIgMC41NjMzNy0xLjA1NjYgMC41NjMzNy0xLjk4MyAwLTAuOTI2NDUtMC4xODc3OS0xLjU4NS0wLjU2MzM3LTEuOTYwNi0wLjM1MDU0LTAuNDAwNjItMC45NTE0Ny0wLjU5NzE4LTEuODAyOC0wLjU5NzE4aC00LjU1MjFsMy4xMjExLTguOTM0OWgxOC4yMmwzLjA3NiA4LjkzNDloLTUuMDcwNGMtMC44NTEzIDAtMS40NjEgMC4xOTY1Ni0xLjgzNjYgMC41OTcxOC0wLjM1MDU0IDAuMzc1NTgtMC41Mjk1OCAxLjAzNDEtMC41Mjk1OCAxLjk2MDYgMCAwLjkyNjQ0IDAuMTc5MDMgMS41ODI1IDAuNTI5NTggMS45ODMgMC4zNzU1OCAwLjM3NTU5IDAuOTg1MjkgMC41NjMzOCAxLjgzNjYgMC41NjMzOGgxMy4yOTZjMC44NTEzIDAgMS40NTIyLTAuMTg3NzkgMS44MDI4LTAuNTYzMzggMC4zNzU1OC0wLjQwMDYyIDAuNTYzMzctMS4wNTY2IDAuNTYzMzctMS45ODMgMC0wLjkyNjQ1LTAuMTg3NzktMS41ODUtMC41NjMzNy0xLjk2MDYtMC4zNTA1NC0wLjQwMDYyLTAuOTUxNDctMC41OTcxOC0xLjgwMjgtMC41OTcxOGgtMi4yODczbC0xMy4yNjItMzcuMDM2Yy0wLjMwMDQ3LTAuODUxMy0wLjc1OTk0LTEuNDYxLTEuMzg1OS0xLjgzNjYtMC42MDA5My0wLjQwMDYyLTEuNDA5Ny0wLjU5NzE4LTIuNDExMy0wLjU5NzE4em00NC4xNDYgMGMtMC44NTEzIDAtMS40NzIzIDAuMTk2NTYtMS44NDc4IDAuNTk3MTgtMC4zNTA1NSAwLjM3NTU4LTAuNTE4MyAxLjAyMjktMC41MTgzIDEuOTQ5M3YxMS45MWMwIDAuODc2MzMgMC4yMDUzMiAxLjUwNjEgMC42MzA5OCAxLjg4MTcgMC40MjU2NiAwLjM3NTU4IDEuMTU5MyAwLjU2MzM3IDIuMTg1OSAwLjU2MzM3czEuNzQ5LTAuMTg3NzkgMi4xNzQ3LTAuNTYzMzdjMC40MjU2OS0wLjM3NTU4IDAuNjQyMjYtMS4wMDUzIDAuNjQyMjYtMS44ODE3di05LjM1MTdoMTguODUxbC0yNC43NTQgMzUuMzAxYy0wLjM1MDU0IDAuNTI1ODItMC41MTgzMSAxLjA3MTctMC41MTgzMSAxLjYyMjYgMCAwLjkyNjQ1IDAuMTY3NzcgMS41ODI1IDAuNTE4MzEgMS45ODMxIDAuMzc1NTggMC4zNzU1OCAwLjk5NjU0IDAuNTYzMzggMS44NDc4IDAuNTYzMzhoMjguNzY2YzAuODUxMyAwIDEuNDUyMi0wLjE4NzggMS44MDI4LTAuNTYzMzggMC4zNzU1OC0wLjQwMDYyIDAuNTYzMzgtMS4wNTY2IDAuNTYzMzgtMS45ODMxdi0xMi42NjVjMC0wLjg3NjMzLTAuMjE2NTgtMS40OTQ4LTAuNjQyMjUtMS44NzA0LTAuNDI1NjYtMC4zNzU1OC0xLjE0OC0wLjU2MzM4LTIuMTc0Ny0wLjU2MzM4LTEuMDI2NiAwLTEuNzQ5IDAuMTg3NzktMi4xNzQ3IDAuNTYzMzgtMC40MjU2NiAwLjM3NTU4LTAuNjQyMjQgMC45OTQwMi0wLjY0MjI0IDEuODcwNHYxMC4xMDdoLTE5Ljk3OGwyNC45MDEtMzUuNDU5YzAuMjUwMzktMC4zNTA1NCAwLjM3MTgzLTAuODM4ODMgMC4zNzE4My0xLjQ2NDggMC0wLjkyNjQ1LTAuMTg3OC0xLjU3MzctMC41NjMzOC0xLjk0OTMtMC4zNTA1NS0wLjQwMDYyLTAuOTUxNDctMC41OTcxOC0xLjgwMjgtMC41OTcxOHptLTMxLjc1MiA1LjEwNDJoMC43MDk4NWw2Ljk4NTkgMjAuMzE1aC0xNC43MTZ6bS0zNy43MjMtNDkuMTgzYy00LjczNDIgMC04LjYzMTMgMy44OTctOC42MzEzIDguNjMxM3YxMTUuNDdjMCA0LjczNDIgMy44OTcgOC42MzEzIDguNjMxMyA4LjYzMTNoMTE1LjI2YzQuNzM0MiAwIDguNjQyMS0zLjg5NyA4LjY0MjEtOC42MzEzdi0xMTUuNDdjMC00LjczNDItMy45MDgyLTguNjMxMy04LjY0MjEtOC42MzEzem0wIDUuNzI0aDExNS4yNmMxLjY1OCAwIDIuOTA3IDEuMjQ5MSAyLjkwNyAyLjkwNzF2MTE1LjQ3YzAgMS42NTgtMS4yNDkxIDIuOTA3LTIuOTA3IDIuOTA3aC0xMTUuMjZjLTEuNjU4IDAtMi44OTU4LTEuMjQ5MS0yLjg5NTgtMi45MDd2LTExNS40N2MwLTEuNjU4IDEuMjM3OC0yLjkwNzEgMi44OTU4LTIuOTA3MXoiIGZpbGw9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIuNzIxMTQiLz48L3N2Zz4=');}.icon-sun-dim{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0xMjIsNDBWMzJhNiw2LDAsMCwxLDEyLDB2OGE2LDYsMCwwLDEtMTIsMFptNjgsODhhNjIsNjIsMCwxLDEtNjItNjJBNjIuMDcsNjIuMDcsMCwwLDEsMTkwLDEyOFptLTEyLDBhNTAsNTAsMCwxLDAtNTAsNTBBNTAuMDYsNTAuMDYsMCwwLDAsMTc4LDEyOFpNNTkuNzYsNjguMjRhNiw2LDAsMSwwLDguNDgtOC40OGwtOC04YTYsNiwwLDAsMC04LjQ4LDguNDhabTAsMTE5LjUyLTgsOGE2LDYsMCwxLDAsOC40OCw4LjQ4bDgtOGE2LDYsMCwxLDAtOC40OC04LjQ4Wm0xMzYtMTM2LTgsOGE2LDYsMCwxLDAsOC40OCw4LjQ4bDgtOGE2LDYsMCwwLDAtOC40OC04LjQ4Wm0uNDgsMTM2YTYsNiwwLDAsMC04LjQ4LDguNDhsOCw4YTYsNiwwLDAsMCw4LjQ4LTguNDhaTTQwLDEyMkgzMmE2LDYsMCwwLDAsMCwxMmg4YTYsNiwwLDAsMCwwLTEyWm04OCw4OGE2LDYsMCwwLDAtNiw2djhhNiw2LDAsMCwwLDEyLDB2LThBNiw2LDAsMCwwLDEyOCwyMTBabTk2LTg4aC04YTYsNiwwLDAsMCwwLDEyaDhhNiw2LDAsMCwwLDAtMTJaIi8+PC9zdmc+');}.icon-moon{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzIuMTMsMTQzLjY0YTYsNiwwLDAsMC02LTEuNDlBOTAuMDcsOTAuMDcsMCwwLDEsMTEzLjg2LDI5Ljg1YTYsNiwwLDAsMC03LjQ5LTcuNDhBMTAyLjg4LDEwMi44OCwwLDAsMCw1NC40OCw1OC42OCwxMDIsMTAyLDAsMCwwLDE5Ny4zMiwyMDEuNTJhMTAyLjg4LDEwMi44OCwwLDAsMCwzNi4zMS01MS44OUE2LDYsMCwwLDAsMjMyLjEzLDE0My42NFptLTQyLDQ4LjI5YTkwLDkwLDAsMCwxLTEyNi0xMjZBOTAuOSw5MC45LDAsMCwxLDk5LjY1LDM3LjY2LDEwMi4wNiwxMDIuMDYsMCwwLDAsMjE4LjM0LDE1Ni4zNSw5MC45LDkwLjksMCwwLDEsMTkwLjEsMTkxLjkzWiIvPjwvc3ZnPg==');}.icon-house{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMTcuOSwxMTAuMWwtODAtODBhMTQsMTQsMCwwLDAtMTkuOCwwbC04MCw4MEExMy45MiwxMy45MiwwLDAsMCwzNCwxMjB2OTZhNiw2LDAsMCwwLDYsNmg2NGE2LDYsMCwwLDAsNi02VjE1OGgzNnY1OGE2LDYsMCwwLDAsNiw2aDY0YTYsNiwwLDAsMCw2LTZWMTIwQTEzLjkyLDEzLjkyLDAsMCwwLDIxNy45LDExMC4xWk0yMTAsMjEwSDE1OFYxNTJhNiw2LDAsMCwwLTYtNkgxMDRhNiw2LDAsMCwwLTYsNnY1OEg0NlYxMjBhMiwyLDAsMCwxLC41OC0xLjQybDgwLTgwYTIsMiwwLDAsMSwyLjg0LDBsODAsODBBMiwyLDAsMCwxLDIxMCwxMjBaIi8+PC9zdmc+');}.icon-star-half-fi{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzkuMTgsOTcuMjZBMTYuMzgsMTYuMzgsMCwwLDAsMjI0LjkyLDg2bC01OS00Ljc2TDE0My4xNCwyNi4xNWExNi4zNiwxNi4zNiwwLDAsMC0zMC4yNywwTDkwLjExLDgxLjIzLDMxLjA4LDg2YTE2LjQ2LDE2LjQ2LDAsMCwwLTkuMzcsMjguODZsNDUsMzguODNMNTMsMjExLjc1YTE2LjQsMTYuNCwwLDAsMCwyNC41LDE3LjgyTDEyOCwxOTguNDlsNTAuNTMsMzEuMDhBMTYuNCwxNi40LDAsMCwwLDIwMywyMTEuNzVsLTEzLjc2LTU4LjA3LDQ1LTM4LjgzQTE2LjQzLDE2LjQzLDAsMCwwLDIzOS4xOCw5Ny4yNlptLTE1LjM0LDUuNDctNDguNyw0MmE4LDgsMCwwLDAtMi41Niw3LjkxbDE0Ljg4LDYyLjhhLjM3LjM3LDAsMCwxLS4xNy40OGMtLjE4LjE0LS4yMy4xMS0uMzgsMGwtNTQuNzItMzMuNjVBOCw4LDAsMCwwLDEyOCwxODEuMVYzMmMuMjQsMCwuMjcuMDguMzUuMjZMMTUzLDkxLjg2YTgsOCwwLDAsMCw2Ljc1LDQuOTJsNjMuOTEsNS4xNmMuMTYsMCwuMjUsMCwuMzQuMjlTMjI0LDEwMi42MywyMjMuODQsMTAyLjczWiIvPjwvc3ZnPg==');}.icon-star-fi{--icon:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiBmaWxsPSJjdXJyZW50Q29sb3IiPjxwYXRoIGQ9Ik0yMzQuMjksMTE0Ljg1bC00NSwzOC44M0wyMDMsMjExLjc1YTE2LjQsMTYuNCwwLDAsMS0yNC41LDE3LjgyTDEyOCwxOTguNDksNzcuNDcsMjI5LjU3QTE2LjQsMTYuNCwwLDAsMSw1MywyMTEuNzVsMTMuNzYtNTguMDctNDUtMzguODNBMTYuNDYsMTYuNDYsMCwwLDEsMzEuMDgsODZsNTktNC43NiwyMi43Ni01NS4wOGExNi4zNiwxNi4zNiwwLDAsMSwzMC4yNywwbDIyLjc1LDU1LjA4LDU5LDQuNzZhMTYuNDYsMTYuNDYsMCwwLDEsOS4zNywyOC44NloiLz48L3N2Zz4=');} |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\base; |
| | | /** |
| | | * Custom settings for the login page can be set here |
| | | */ |
| | | $jvbLogin = apply_filters('jvb_login', []); |
| | | define('JVB_LOGIN', $jvbLogin); |
| | | |
| | | class Login { |
| | | protected array $login; |
| | | protected array $favourites = [ |
| | | 'title' => 'Save your favourites', |
| | | 'description' => null, |
| | | 'submit' => null, |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '', |
| | | 'successTitle' => '', |
| | | 'successDescription' => [] |
| | | ]; |
| | | protected array $lostPassword; |
| | | protected array $resetPassword; |
| | | protected array $register; |
| | | protected array $logout; |
| | | protected array $magic; |
| | | |
| | | protected array $types = ['login', 'favourites','lostPassword','resetPassword','register','logout', 'magic']; |
| | | |
| | | public function __construct() { |
| | | $name = get_bloginfo('name'); |
| | | $this->login = [ |
| | | 'title' => 'Sign in', |
| | | 'description' => [], |
| | | 'submit' => 'Sign In', |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '', |
| | | 'successTitle' => '', |
| | | 'successDescription' => [] |
| | | ]; |
| | | $this->register = [ |
| | | 'title' => 'Create Your Account', |
| | | 'description' => [], |
| | | 'submit' => 'Create Account', |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '['.$name.'] Finish Creating Your Account', |
| | | 'successTitle' => 'Success!', |
| | | 'successDescription' => ['See your email for next steps','(Check your spam folder if you cannot find it after a couple minutes.)'] |
| | | ]; |
| | | |
| | | $this->lostPassword = [ |
| | | 'title' => 'Reset Password', |
| | | 'description' => ['Forgot your password?', 'We\'ll send you a reset link to your email'], |
| | | 'submit' => 'Send Reset Link', |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '', |
| | | 'successTitle' => 'Success!', |
| | | 'successDescription' => ['Check your email for reset instructions'] |
| | | ]; |
| | | $this->resetPassword = [ |
| | | 'title' => 'Reset Your Password', |
| | | 'description' => ['Enter your new password below.'], |
| | | 'submit' => 'Change Password', |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '', |
| | | 'successTitle' => '', |
| | | 'successDescription' => [] |
| | | ]; |
| | | |
| | | $this->logout = [ |
| | | 'title' => 'Logged out!', |
| | | 'description' => [''], |
| | | 'submit' => '', |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '', |
| | | 'successTitle' => '', |
| | | 'successDescription' => [] |
| | | ]; |
| | | |
| | | $this->magic = [ |
| | | 'title' => 'Log In with Magic Link!', |
| | | 'description' => ['Enter your email.','You\'ll get an email with a magic link.','Click it, and you\'re logged in!'], |
| | | 'submit' => jvbIcon('magic-wand').'Send Magic Link', |
| | | 'extra' => [], |
| | | 'footer' => '', |
| | | 'email' => '', |
| | | 'successTitle' => '', |
| | | 'successDescription' => [] |
| | | ]; |
| | | |
| | | |
| | | } |
| | | |
| | | protected function checkType(string $type):bool |
| | | { |
| | | return in_array($type, $this->types); |
| | | } |
| | | public function setTitle(string $type, string $title):void |
| | | { |
| | | if (!$this->checkType($type)) { |
| | | return; |
| | | } |
| | | $this->$type['title'] = $title; |
| | | } |
| | | public function getTitle(string $type):string |
| | | { |
| | | if (!$this->checkType($type) || |
| | | !array_key_exists('title', $this->$type)) { |
| | | return ''; |
| | | } |
| | | return $this->$type['title']; |
| | | } |
| | | |
| | | public function setDescription(string $type, array|string $description):void |
| | | { |
| | | if (!$this->checkType($type)) { |
| | | return; |
| | | } |
| | | $this->$type['description'] = $description; |
| | | } |
| | | public function getDescription(string $type):array |
| | | { |
| | | if (!$this->checkType($type) || |
| | | !array_key_exists('description', $this->$type) || |
| | | empty($this->$type['description'])) { |
| | | return []; |
| | | } |
| | | if (is_string($this->$type['description'])) { |
| | | return [$this->$type['description']]; |
| | | } |
| | | return $this->$type['description']; |
| | | } |
| | | public function setSubmit(string $type, string $submit):void |
| | | { |
| | | if (!$this->checkType($type)) { |
| | | return; |
| | | } |
| | | $this->$type['submit'] = $submit; |
| | | } |
| | | |
| | | public function getSubmit(string $type):string |
| | | { |
| | | if (!$this->checkType($type) || |
| | | !array_key_exists('submit', $this->$type) || |
| | | empty($this->$type['submit'])) { |
| | | return $this->login['submit']; |
| | | } |
| | | return $this->$type['submit']; |
| | | } |
| | | |
| | | public function getLabels(string $type):array |
| | | { |
| | | if (!$this->checkType($type)) { |
| | | return []; |
| | | } |
| | | return $this->$type; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\base; |
| | | /** |
| | | * JVB_MEMBERSHIP defines the structure of the directory |
| | | * Options include: |
| | | * - membership_expires = useful if members pay a yearly membership fee |
| | | * - hide_expired = removes users once membership expired; only used if membership_expires is true |
| | | * - clip_expired = keeps users once membership expires, but limits the information shown; only used if membership_expires is true |
| | | * - membership_approval = verified users can approve other users |
| | | * - term_approval = (bool) verified users can create new terms, but needs approval |
| | | * - member_only = (array) if empty, open to any registered user. otherwise an array of registered user roles |
| | | * |
| | | * |
| | | * Example: |
| | | * [ |
| | | * 'member_content' => true, |
| | | * 'invitable' => true, |
| | | * 'can_invite' => ['artist' => ['artist']], |
| | | * 'member_verified' => true, |
| | | * 'notifications' => true, |
| | | * 'forum' => true, |
| | | * 'member_only' => [ 'artist' ], |
| | | * 'member_expires' => false, |
| | | * 'hide_expired' => false, |
| | | * 'clip_expired' => false, |
| | | * 'term_approval' => true, |
| | | * 'can_approve' => [ 'artist' ] |
| | | * ] |
| | | */ |
| | | |
| | | $membership = apply_filters('jvb_membership', [ |
| | | 'can_invite' => [], |
| | | ]); |
| | | define('JVB_MEMBERSHIP', $membership); |
| | | |
| | | |
| | | class Membership |
| | | { |
| | | protected bool $member_content = true; |
| | | protected bool $invitable = false; |
| | | protected array $can_invite = []; |
| | | protected bool $notifications = true; |
| | | protected bool $member_expires = false; |
| | | protected bool $hide_expired = false; |
| | | protected bool $clip_expired = false; |
| | | protected bool $term_approval = false; |
| | | protected array $can_approve = []; |
| | | protected bool $forum = true; |
| | | protected array $member_only = []; |
| | | |
| | | public function __construct() { |
| | | |
| | | } |
| | | public function set(string $property, null|bool|array $value = null):void |
| | | { |
| | | if (is_null($value)) { |
| | | $value = true; |
| | | } |
| | | if (property_exists(self::class, $property)) { |
| | | $this->$property = $value; |
| | | } else { |
| | | error_log('[Membership]::set Could not set property '.$property.', it does not exist.'); |
| | | } |
| | | } |
| | | |
| | | public function setAll(array $properties):void |
| | | { |
| | | foreach ($properties as $property) { |
| | | if (is_array($property)) { |
| | | $this->set($property[0], $property[1]); |
| | | } else { |
| | | $this->set($property); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public function has(string $property):bool |
| | | { |
| | | return property_exists($this, $property) && $this->$property === true; |
| | | } |
| | | |
| | | public function hasAny(array $properties):bool |
| | | { |
| | | foreach ($properties as $property) { |
| | | if ($this->has($property)) { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public function getInviters():array |
| | | { |
| | | return $this->can_invite; |
| | | } |
| | | public function canInvite(string $role):bool |
| | | { |
| | | return ($this->invitable) && array_key_exists($role, $this->can_invite); |
| | | } |
| | | public function getInvitableFor(string $role):array |
| | | { |
| | | return array_key_exists($role, $this->can_invite) ? $this->can_invite[$role] : []; |
| | | } |
| | | |
| | | public function getApprovers():array |
| | | { |
| | | return $this->can_approve; |
| | | } |
| | | |
| | | public function canApprove(string $role):bool |
| | | { |
| | | return ($this->term_approval) && in_array($role, $this->can_approve); |
| | | } |
| | | |
| | | |
| | | public function canSeeForum(string $role):bool |
| | | { |
| | | return $this->forum && (empty($this->member_only) || in_array($role, $this->member_only)); |
| | | } |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\base; |
| | | |
| | | use JVBase\base\Login; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | /*********************************************** |
| | | * JVB_SITE defines base site options |
| | | ***********************************************/ |
| | | class Site { |
| | | protected static Login $loginConfig; |
| | | protected static Membership $membershipConfig; |
| | | protected static Site $instance; |
| | | protected static string $icons = 'regular'; |
| | | |
| | | /** |
| | | * @var bool $is_directory Whether this is a membership directory |
| | | */ |
| | | protected static bool $is_directory = false; |
| | | /** |
| | | * @var bool $has_membership Whether this site has membership |
| | | */ |
| | | protected static bool $membership = false; |
| | | /** |
| | | * @var bool $dashboard Whether to implement custom dashboard |
| | | */ |
| | | protected static bool $dashboard = false; |
| | | /** |
| | | * @var bool $referrals Whether to implement a referral system, with rewards |
| | | */ |
| | | protected static bool $referrals = false; |
| | | /** |
| | | * @var bool $magic_link Whether users can login without a password |
| | | */ |
| | | protected static bool $magic_link = true; |
| | | /** |
| | | * @var bool $support Whether to implement the support ticket system |
| | | */ |
| | | protected static bool $support = false; |
| | | /** |
| | | * @var bool $feed_block Whether to implement the feed block |
| | | */ |
| | | protected static bool $feed_block = false; |
| | | |
| | | /** |
| | | * @var bool $is_restaurant Whether this is a restaurant |
| | | */ |
| | | protected static bool $is_restaurant = false; |
| | | /** |
| | | * @var bool $limit_hours Whether things should not be able to be sold outside of business hours. |
| | | */ |
| | | protected static bool $limit_hours = false; |
| | | /** |
| | | * @var bool $enthusiast Whether to scaffold enthusiasts (users that can interact with and save favourites) |
| | | */ |
| | | protected static bool $enthusiast = false; |
| | | /** |
| | | * @var bool Optional flag to allow enthusiasts, but not favourites |
| | | */ |
| | | protected static bool $favourites = false; |
| | | |
| | | |
| | | protected static array $integrations = [ |
| | | 'bluesky' => false, |
| | | 'cloudflare'=> true, |
| | | 'facebook' => false, |
| | | 'instagram' => false, |
| | | 'maps' => false, |
| | | 'gmb' => false, |
| | | 'helcim' => false, |
| | | 'postmark' => false, |
| | | 'square' => false, |
| | | 'umami' => true, |
| | | ]; |
| | | private function __construct(){ |
| | | |
| | | } |
| | | |
| | | public static function getInstance():Site { |
| | | if (!isset(self::$instance)) { |
| | | self::$instance = new self(); |
| | | do_action('jvbLoadDefinitions'); |
| | | } |
| | | return self::$instance; |
| | | } |
| | | |
| | | public static function set(string $property, ?string $value = null):void |
| | | { |
| | | $property = strtolower($property); |
| | | if (property_exists(self::class, $property)) { |
| | | switch ($property) { |
| | | case 'icons': |
| | | $allowed = ['thin', 'light', 'regular','bold','fill','duotone']; |
| | | $value = strtolower($value); |
| | | if (in_array($value, $allowed)) { |
| | | self::$icons = $value; |
| | | } else { |
| | | error_log('[Site]::set Could not set icons to "'.$value.'", setting to default'); |
| | | } |
| | | break; |
| | | default: |
| | | self::${$property} = true; |
| | | } |
| | | } else { |
| | | error_log('[Site]::set Could not set property: '.$property); |
| | | } |
| | | } |
| | | public static function setAll(array $properties):void |
| | | { |
| | | foreach ($properties as $property) { |
| | | self::set($property); |
| | | } |
| | | } |
| | | |
| | | public static function has(string $property):bool |
| | | { |
| | | return property_exists(self::class, $property) && self::${$property} === true; |
| | | } |
| | | |
| | | public static function hasAny(array $properties):bool |
| | | { |
| | | foreach ($properties as $property) { |
| | | if (self::has($property)) { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public static function hasAll(array $properties):bool |
| | | { |
| | | foreach ($properties as $property) { |
| | | if (!self::has($property)) { |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | public static function icon():string |
| | | { |
| | | return self::$icons; |
| | | } |
| | | |
| | | public static function setIntegration(string $integration, bool $set = true):void |
| | | { |
| | | $integration = strtolower($integration); |
| | | if (array_key_exists($integration, self::$integrations)) { |
| | | self::$integrations[$integration] = $set; |
| | | }else { |
| | | error_log('[Site]::setIntegration Could not set integration: '.$integration); |
| | | } |
| | | } |
| | | public static function setIntegrations(array $integrations, bool $set = true):void |
| | | { |
| | | foreach ($integrations as $integration) { |
| | | self::setIntegration($integration, $set); |
| | | } |
| | | } |
| | | public static function hasIntegration(string $integration):bool |
| | | { |
| | | $integration = strtolower($integration); |
| | | return array_key_exists($integration, self::$integrations); |
| | | } |
| | | |
| | | public static function hasAnyIntegration(array $integrations = []):bool |
| | | { |
| | | if (empty($integrations)) { |
| | | $integrations = array_keys(self::$integrations); |
| | | } |
| | | foreach ($integrations as $integration) { |
| | | if (array_key_exists($integration, self::$integrations) && self::$integrations[$integration] === true) { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | public static function getIntegrations():array |
| | | { |
| | | return array_filter(self::$integrations); |
| | | } |
| | | |
| | | public static function login():Login|false |
| | | { |
| | | if (!isset(self::$loginConfig)) { |
| | | self::$loginConfig = new Login(); |
| | | } |
| | | return self::$loginConfig; |
| | | } |
| | | public static function membership():Membership|false |
| | | { |
| | | if (!self::$membership) { |
| | | return false; |
| | | } |
| | | if (!isset(self::$membershipConfig)) { |
| | | self::$membershipConfig = new Membership(); |
| | | } |
| | | return self::$membershipConfig; |
| | | } |
| | | } |
| | | |
| | | |
| | | $defaults = [ |
| | | 'icons' => 'light', |
| | | 'directory' => false, //as in, a membership directory |
| | | 'membership' => false, |
| | | 'has_map' => false, //TODO: migrate to integrations['gmb'] |
| | | 'dashboard' => false, |
| | | 'support' => false, |
| | | 'feed_block' => false, |
| | | 'email_notifications' => false, |
| | | 'integrations' => [ |
| | | 'bluesky' => false, |
| | | 'cloudflare' => false, |
| | | 'facebook' => false, |
| | | 'maps' => false, |
| | | 'gmb' => false, |
| | | 'helcim' => false, |
| | | 'instagram' => false, |
| | | 'square' => false, |
| | | 'umami' => false, |
| | | ], |
| | | 'is_restaurant' => false, |
| | | 'limit_hours' => false, |
| | | 'enthusiast' => false, |
| | | 'favourites' => false, //optional flag to allow enthusiasts, but not favourites |
| | | ]; |
| | | |
| | | $jvb_site = array_merge($defaults, apply_filters('jvb_site', [])); |
| | | |
| | | define('JVB_SITE', $jvb_site); |
| | |
| | | <?php |
| | | |
| | | require(JVB_DIR.'/base/site.php'); |
| | | use JVBase\base\Site; |
| | | |
| | | require(JVB_DIR.'/base/Site.php'); |
| | | |
| | | |
| | | add_action('plugins_loaded', 'jvbDefineSite', 1); |
| | | function jvbDefineSite() { |
| | | Site::getInstance(); |
| | | } |
| | | require(JVB_DIR.'/base/content.php'); |
| | | require(JVB_DIR.'/base/email.php'); |
| | | require(JVB_DIR.'/base/taxonomies.php'); |
| | | require(JVB_DIR.'/base/users.php'); |
| | | require(JVB_DIR.'/base/login.php'); |
| | | require(JVB_DIR.'/base/membership.php'); |
| | | require(JVB_DIR.'/base/Login.php'); |
| | | require(JVB_DIR.'/base/Membership.php'); |
| | | require(JVB_DIR.'/base/options.php'); |
| | | require(JVB_DIR.'/base/seo.php'); |
| | | |
| | |
| | | * - rewrites = (array) key = associated taxonomy; value = what to append to rewrite base |
| | | */ |
| | | $defaults = []; |
| | | if (array_key_exists('has_support', JVB_SITE) && JVB_SITE['has_support'] === true) { |
| | | if (!empty(JVB_SITE) && array_key_exists('has_support', JVB_SITE) && JVB_SITE['has_support'] === true) { |
| | | $defaults = array_merge($defaults, jvb_support_post_type()); |
| | | } |
| | | $content = array_merge($defaults, apply_filters('jvb_content', [])); |
| | |
| | | ], |
| | | default => [], |
| | | }; |
| | | error_log('Getting defaults for: '.BASE.ucfirst($type).ucfirst($format).'Default'); |
| | | |
| | | $result = apply_filters(BASE.ucfirst($type).ucfirst($format).'Default', $defaults); |
| | | if ($format === 'reference' && empty($result)) { |
| | | $full = self::getDefault($type, 'schema'); |
| | |
| | | <?php |
| | | |
| | | use JVBase\base\Site; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | |
| | | function jvbUserIsVerified():bool |
| | | { |
| | | return !(Features::forMembership()->has('member_verified')) || current_user_can('skip_moderation'); |
| | | $membership = Site::membership(); |
| | | |
| | | return !($membership && $membership->has('member_verified')) || current_user_can('skip_moderation'); |
| | | } |
| | | |
| | | function jvbUserTypes():array |
| | |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use JVBase\forms\TaxonomySelector; |
| | | use WP_Block; |
| | | |
| | |
| | | <?php } ?> |
| | | |
| | | |
| | | <?php if (Features::forSite()->has('favourites') && is_user_logged_in()) : ?> |
| | | <?php if (Site::has('favourites') && is_user_logged_in()) : ?> |
| | | <input type="checkbox" id="favourites" class="btn" name="favourites" value="on" |
| | | data-filter="favourites"> |
| | | <label for="favourites" title="Show Favourites" class="row"> |
| | |
| | | protected function getFavouritesButton(string $content):string |
| | | { |
| | | $registrar = Registrar::getInstance($content); |
| | | if (!$registrar || !Features::forSite()->has('favourites') || !$registrar->hasFeature('favouritable')) { |
| | | if (!$registrar || !Site::has('favourites') || !$registrar->hasFeature('favouritable')) { |
| | | return ''; |
| | | } |
| | | return '<button class="favourite" type="button" title="Add to favourites" data-action="favourite"> |
| | |
| | | protected function getUpvotesButton(string $content):string |
| | | { |
| | | $registrar = Registrar::getInstance($content); |
| | | if (!Features::forSite()->has('karma') || !$registrar || !$registrar->hasFeature('karma')){ |
| | | if (!Site::has('karma') || !$registrar || !$registrar->hasFeature('karma')){ |
| | | return ''; |
| | | } |
| | | return '<div class="karma row"> |
| | |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\meta\Form; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; // Exit if accessed directly |
| | |
| | | } |
| | | |
| | | // Enqueue Turnstile if needed |
| | | if (Features::forSite()->hasIntegration('cloudflare')) { |
| | | if (Site::hasIntegration('cloudflare')) { |
| | | $cloudflare = JVB()->connect('cloudflare'); |
| | | if ($cloudflare->isSetUp()) { |
| | | $cloudflare->enqueueTurnstileScripts(); |
| | |
| | | */ |
| | | protected function renderTurnstile(): void |
| | | { |
| | | if (!Features::hasIntegration('cloudflare')) { |
| | | if (!Site::hasIntegration('cloudflare')) { |
| | | return; |
| | | } |
| | | |
| | |
| | | <?php |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //Blocks |
| | | if (Features::forSite()->has('feed_block')) { |
| | | if (Site::has('feed_block')) { |
| | | require(JVB_DIR . '/build/feed/render.php'); |
| | | } |
| | | require(JVB_DIR . '/build/list/render.php'); |
| | |
| | | error_log('Has Glossary Type'); |
| | | require(JVB_DIR . '/build/glossary/render.php'); |
| | | } |
| | | if (Features::forSite()->has('faq')) { |
| | | if (Site::has('faq')) { |
| | | require(JVB_DIR . '/build/faq/render.php'); |
| | | } |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | require(JVB_DIR . '/build/gmbreviews/render.php'); |
| | | } |
| | | |
| | | |
| | | function jvbRegisterBlocks():void |
| | | { |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | register_block_type(JVB_DIR . '/build/gmb-reviews'); |
| | | } |
| | | // if (jvbSiteUsesFeedBlock()) { |
| | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_Block; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | <?php |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | //require(JVB_DIR . '/inc/blocks/RegisterBlocks.php'); |
| | | require(JVB_DIR . '/inc/blocks/CustomBlocks.php'); |
| | | |
| | | if (Features::forSite()->has('feed_block')) { |
| | | if (Site::has('feed_block')) { |
| | | require(JVB_DIR . '/inc/blocks/FeedBlock.php'); |
| | | new JVBase\blocks\FeedBlock(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('is_restaurant')) { |
| | | if (Site::has('is_restaurant')) { |
| | | require(JVB_DIR . '/inc/blocks/MenuBlock.php'); |
| | | new JVBase\blocks\MenuBlock(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('faq')) { |
| | | if (Site::has('faq')) { |
| | | require(JVB_DIR . '/inc/blocks/FAQBlock.php'); |
| | | new JVBase\blocks\FAQBlock(); |
| | | } |
| | |
| | | } |
| | | add_filter('block_categories_all', 'jvbRegisterBlockCategory'); |
| | | |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | require(JVB_DIR . '/build/gmbreviews/render.php'); |
| | | } |
| | | function jvbRegisterBlocks():void |
| | | { |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | register_block_type( |
| | | JVB_DIR . '/build/gmbreviews', |
| | | [ |
| | |
| | | <?php |
| | | |
| | | use JVBase\meta\Form; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use JVBase\utility\Image; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | |
| | | function jvbClientQueue():void |
| | | { |
| | | if (!Features::forSite()->has('dashboard') || !is_user_logged_in()) { |
| | | if (!Site::has('dashboard') || !is_user_logged_in()) { |
| | | return; |
| | | } |
| | | |
| | |
| | | */ |
| | | function jvbNotificationMenu():string |
| | | { |
| | | if (Features::forMembership()->has('notifications') && is_user_logged_in()) { |
| | | $membership = Site::membership(); |
| | | if ($membership && $membership->has('notifications') && is_user_logged_in()) { |
| | | |
| | | ob_start(); |
| | | ?> |
| | |
| | | */ |
| | | function jvbHelpMenu():string |
| | | { |
| | | if (!Features::forSite()->has('helpMenu')) { |
| | | if (!Site::has('helpMenu')) { |
| | | return ''; |
| | | } |
| | | $out = get_option(BASE.'help_menu'); |
| | |
| | | <?php |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | require(JVB_DIR . '/inc/integrations/Integrations.php'); |
| | | require(JVB_DIR . '/inc/integrations/CredentialsManager.php'); |
| | | |
| | | if (Features::hasIntegration('maps')) { |
| | | if (Site::hasIntegration('maps')) { |
| | | require(JVB_DIR . '/inc/integrations/GoogleMaps.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('umami')) { |
| | | if (Site::hasIntegration('umami')) { |
| | | require(JVB_DIR . '/inc/integrations/Umami.php'); |
| | | } |
| | | if (Features::hasIntegration('cloudflare')) { |
| | | if (Site::hasIntegration('cloudflare')) { |
| | | require(JVB_DIR . '/inc/integrations/Cloudflare.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('square')) { |
| | | if (Site::hasIntegration('square')) { |
| | | require(JVB_DIR . '/inc/integrations/Square.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('facebook')) { |
| | | if (Site::hasIntegration('facebook')) { |
| | | require(JVB_DIR . '/inc/integrations/Facebook.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('instagram')) { |
| | | if (!Features::hasIntegration('facebook')) { |
| | | if (Site::hasIntegration('instagram')) { |
| | | if (!Site::hasIntegration('facebook')) { |
| | | require(JVB_DIR . '/inc/integrations/Facebook.php'); |
| | | } |
| | | require(JVB_DIR . '/inc/integrations/Instagram.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('bluesky')) { |
| | | if (Site::hasIntegration('bluesky')) { |
| | | require(JVB_DIR . '/inc/integrations/BlueSky.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | require(JVB_DIR . '/inc/integrations/GoogleMyBusiness.php'); |
| | | } |
| | | |
| | | if (Features::hasIntegration('postmark')) { |
| | | if (Site::hasIntegration('postmark')) { |
| | | require(JVB_DIR . '/inc/integrations/PostMark.php'); |
| | | } |
| | | |
| | | |
| | | if (Features::hasIntegration('helcim')) { |
| | | if (Site::hasIntegration('helcim')) { |
| | | require(JVB_DIR . '/inc/integrations/Helcim.php'); |
| | | } |
| | |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\rest\Route; |
| | | use JVBase\rest\PermissionHandler; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Response; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | if (is_array($key)) { |
| | | $value = $key['value']; |
| | | // Ensure value is wrapped in parentheses |
| | | if (!str_starts_with(trim($value), '(')) { |
| | | if (!str_contains(trim($value), '(`')) { |
| | | $value = '(`' . $value . '`)'; |
| | | } |
| | | $parts[] = $key['key'] . ' KEY ' . $value; |
| | |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\forms\TaxonomySelector; |
| | | use JVBase\managers\CRUD; |
| | | use JVBase\base\Site; |
| | | use JVBase\meta\Form; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar;use JVBase\utility\Features; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\ui\Navigation; |
| | | use WP_User; |
| | | |
| | |
| | | // if ($page === 'integrations' || in_array($page, $integrationSlugs)) { |
| | | // // Check integration access |
| | | // if ($page === 'integrations') { |
| | | // if (!Features::hasAnyIntegration('user', $this->role)) { |
| | | // if (!Site::hasAnyIntegration('user', $this->role)) { |
| | | // $this->redirectToDashboard(); |
| | | // } |
| | | // } else { |
| | | // if (!Features::hasIntegration($page, 'user', $this->role)) { |
| | | // if (!Site::hasIntegration($page, 'user', $this->role)) { |
| | | // $this->redirectToDashboard(); |
| | | // } |
| | | // } |
| | |
| | | |
| | | switch ($page) { |
| | | case 'notifications': |
| | | if (Features::forSite()->has('notifications')) { |
| | | if (Site::has('notifications')) { |
| | | wp_enqueue_script('jvb-notification-manager'); |
| | | } |
| | | break; |
| | |
| | | wp_enqueue_script('jvb-crud'); |
| | | break; |
| | | } |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | wp_enqueue_script('jvb-favourites'); |
| | | wp_localize_script('jvb-favourites-manager', 'favouritesSettings', [ |
| | | 'strings' => [ |
| | |
| | | |
| | | wp_enqueue_script('jvb-creator'); |
| | | |
| | | if (Features::forSite()->has('forum')) { |
| | | if (Site::has('forum')) { |
| | | wp_enqueue_script('jvb-news'); |
| | | } |
| | | do_action('jvbDashScripts', $page); |
| | |
| | | return $content; |
| | | } |
| | | |
| | | if (Features::forSite()->has('referrals')) { |
| | | if (Site::has('referrals')) { |
| | | $whatever = JVB()->referrals()->getReferralWelcomeMessage($this->user->ID); |
| | | if (!empty($whatever)) { |
| | | return $whatever; |
| | |
| | | $connection = (array_key_exists($page, $map)) ? $map[$page] : $page; |
| | | if ($connection !== 'integrations') { |
| | | |
| | | $userID = (Features::forSite()->has('has_membership')) ? $this->user->ID : null; |
| | | $userID = (Site::has('has_membership')) ? $this->user->ID : null; |
| | | $integration = JVB()->connect($connection, $userID); |
| | | |
| | | echo '<h1>Managing '.$integration->title.'</h1>'; |
| | |
| | | $pages = []; |
| | | $pages[] = 'SEO'; |
| | | // Add feature-dependent pages (non-config) |
| | | if (Features::forSite()->has('referrals')) { |
| | | if (Site::has('referrals')) { |
| | | $pages[] = 'Referrals'; |
| | | } |
| | | |
| | | if (Features::forMembership()->has('can_invite')) { |
| | | $membership = Site::membership(); |
| | | if ($membership && $membership->has('can_invite')) { |
| | | $pages[] = 'Invites'; |
| | | } |
| | | |
| | | if (Features::forMembership()->has('term_approval')) { |
| | | if ($membership && $membership->has('term_approval')) { |
| | | $pages[] = 'Approvals'; |
| | | } |
| | | |
| | | if (Features::forMembership()->has('forum')) { |
| | | if ($membership && $membership->has('forum')) { |
| | | $pages[] = 'News'; |
| | | } |
| | | |
| | | if (Features::forMembership()->has('member_content')) { |
| | | if ($membership && $membership->has('member_content')) { |
| | | $pages[] = 'Metrics'; |
| | | } |
| | | |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | $pages[] = 'Favourites'; |
| | | } |
| | | |
| | |
| | | $pages[] = 'Karmic Score'; |
| | | } |
| | | |
| | | if (Features::forSite()->has('notifications')) { |
| | | if (Site::has('notifications')) { |
| | | $pages[] = 'Notifications'; |
| | | } |
| | | |
| | | if (Features::forSite()->has('support')) { |
| | | if (Site::has('support')) { |
| | | $pages[] = 'Support'; |
| | | } |
| | | |
| | | if (Features::hasAnyIntegration()) { |
| | | if (Site::hasAnyIntegration()) { |
| | | $pages[] = 'Integrations'; |
| | | } |
| | | |
| | |
| | | return $pages; |
| | | } |
| | | |
| | | /** |
| | | * Get pages available to a specific role |
| | | * @param string $role The role slug (with or without BASE prefix) |
| | | * @return array |
| | | */ |
| | | protected function getRolePages(string $role):array |
| | | { |
| | | $role = jvbNoBase($role); |
| | | |
| | | if (!Registrar::getInstance($role)){ |
| | | return []; |
| | | } |
| | | |
| | | return Features::forUser($role)->getDashboardPages(); |
| | | } |
| | | |
| | | /** |
| | | * Get pages that a specific user is allowed to access |
| | |
| | | switch ($slug) { |
| | | case 'Integrations': |
| | | foreach($roles as $role) { |
| | | if (Features::hasAnyIntegration('user', $role)) { |
| | | if (Registrar::getInstance($role)->hasAnyIntegrations()) { |
| | | $remove = false; |
| | | } |
| | | } |
| | |
| | | break; |
| | | case 'Approvals': |
| | | $canApprove = false; |
| | | if (Features::forMembership()->has('term_approval')) { |
| | | if ($membership && $membership->has('term_approval')) { |
| | | if (array_key_exists('can_approve', JVB_MEMBERSHIP)) { |
| | | foreach ($roles as $role) { |
| | | if (in_array($role, JVB_MEMBERSHIP['can_approve'])) { |
| | |
| | | break; |
| | | case 'metrics': |
| | | foreach ($roles as $role) { |
| | | if (!empty(Features::forUser($role)->getCreatableContent())) { |
| | | if (!empty(Registrar::getInstance($role)?->getCreatable())) { |
| | | $remove = false; |
| | | } |
| | | } |
| | | break; |
| | | case 'karmic-score': |
| | | foreach ($roles as $role) { |
| | | $contents = Features::forUser($role)->getCreatableContent(); |
| | | $contents = Registrar::getInstance($role)?->getCreatable(); |
| | | if (!empty($contents)) { |
| | | $hasKarma = Registrar::getFeatured('karma'); |
| | | $remove = empty(array_intersect($contents, $hasKarma)); |
| | |
| | | |
| | | $creatable = []; |
| | | foreach ($roles as $role) { |
| | | $roleCreatable = Features::forUser($role)->getCreatableContent(); |
| | | $roleCreatable = Registrar::getInstance($role)?->getCreatable(); |
| | | $creatable = array_merge($creatable, $roleCreatable); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\base\Site; |
| | | use WP_Block; |
| | | use WP_Query; |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // if (Features::forSite()->has('has_map')) { |
| | | // if (Site::has('has_map')) { |
| | | // $ID = wp_insert_post([ |
| | | // 'post_type' => BASE.'directory', |
| | | // 'post_title' => 'Map', |
| | |
| | | |
| | | class ErrorHandler |
| | | { |
| | | protected object $wpdb; |
| | | protected string $tableName; |
| | | protected int $notification_threshold = 5; // Critical errors within 1 hour |
| | | |
| | | protected array $error_levels = [ |
| | |
| | | } |
| | | |
| | | try { |
| | | $table = $this->tableName; |
| | | |
| | | // Extract error data |
| | | $component = sanitize_text_field($data['component'] ?? ''); |
| | | $message = sanitize_textarea_field($data['message'] ?? ''); |
| | |
| | | } |
| | | |
| | | // Insert into database |
| | | $result = $this->wpdb->insert( |
| | | $table, |
| | | $result = $this->table->insert( |
| | | [ |
| | | 'error_type' => $error_type, |
| | | 'component' => $component, |
| | |
| | | 'severity' => $severity, |
| | | 'user_id' => get_current_user_id(), |
| | | 'created_at' => current_time('mysql') |
| | | ], |
| | | [ |
| | | '%s', // error_type |
| | | '%s', // component |
| | | '%s', // message |
| | | '%s', // context (JSON) |
| | | '%s', // severity |
| | | '%d', // user_id |
| | | '%s' // created_at |
| | | ] |
| | | ); |
| | | |
| | | if ($result === false) { |
| | | if (!$result) { |
| | | // If insert fails, log to PHP error log as fallback |
| | | error_log("[ErrorHandler] Database insert failed: " . $this->wpdb->last_error); |
| | | error_log("[ErrorHandler] Database insert failed: " . $$this->table->getLastError()); |
| | | return [ |
| | | 'success' => false, |
| | | 'message' => "[ErrorHandler] Database insert failed: " . $this->wpdb->last_error |
| | | 'message' => "[ErrorHandler] Database insert failed: " . $$this->table->getLastError() |
| | | ]; |
| | | } |
| | | |
| | |
| | | protected function checkErrorThreshold(string $error_type, string $component) |
| | | { |
| | | // Get count of similar critical errors in the last hour |
| | | $count = $this->wpdb->get_var($this->wpdb->prepare( |
| | | "SELECT COUNT(*) |
| | | FROM {$this->tableName} |
| | | WHERE error_type = %s |
| | | AND component = %s |
| | | AND severity = 'critical' |
| | | AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)", |
| | | $error_type, |
| | | $component |
| | | )); |
| | | $count = $this->table->count([ |
| | | 'error_type' => $error_type, |
| | | 'component' => $component, |
| | | 'severity' => $this->error_levels[$error_type], |
| | | 'created_at' => ['>','DATE_SUB(NOW(), INTERVAL 1 HOUR)'] |
| | | ]); |
| | | |
| | | // If threshold reached, take additional actions (e.g., notify developers) |
| | | if ((int)$count >= $this->notification_threshold) { |
| | | if ($count >= $this->notification_threshold) { |
| | | // You could send an urgent notification, Slack message, etc. |
| | | $admin_email = get_option('admin_email'); |
| | | $subject = "[URGENT] Error Threshold Exceeded for {$component}"; |
| | |
| | | public function log(string $component, string $message, array $context = [], string $severity = 'error'): array |
| | | { |
| | | try { |
| | | $table = $this->wpdb->prefix . BASE . 'error_log'; |
| | | |
| | | // Validate severity |
| | | if (!array_key_exists($severity, $this->error_levels)) { |
| | | $severity = 'error'; |
| | |
| | | $source = isset($context['source']) ? $context['source'] : |
| | | (isset($context['url']) ? 'frontend' : 'backend'); |
| | | |
| | | $result = $this->wpdb->insert( |
| | | $table, |
| | | $result = $this->table->insert( |
| | | [ |
| | | 'error_type' => $error_type, |
| | | 'component' => $component, |
| | |
| | | 'user_was_logged_in' => $user_was_logged_in ? 1 : 0, |
| | | 'source' => $source, |
| | | 'created_at' => current_time('mysql') |
| | | ], |
| | | ['%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d', '%d', '%s', '%s'] |
| | | ); |
| | | ]); |
| | | |
| | | if ($result === false) { |
| | | error_log("[ErrorHandler] Database insert failed: " . $this->wpdb->last_error); |
| | | return ['success' => false, 'message' => $this->wpdb->last_error]; |
| | | if (!$result) { |
| | | error_log("[ErrorHandler] Database insert failed: " . $this->table->getLastError()); |
| | | return ['success' => false, 'message' => $this->table->getLastError()]; |
| | | } |
| | | |
| | | if ($severity === 'critical') { |
| | | $this->checkErrorThreshold($error_type, $component); |
| | | } |
| | | |
| | | return ['success' => true, 'id' => $this->wpdb->insert_id]; |
| | | return ['success' => true, 'id' => $result]; |
| | | |
| | | } catch (Exception $e) { |
| | | error_log("[ErrorHandler Exception] " . $e->getMessage()); |
| | |
| | | */ |
| | | public function gatherErrorSummary(?string $start_date = null, ?string $end_date = null): array |
| | | { |
| | | $table = $this->wpdb->prefix . BASE . 'error_log'; |
| | | |
| | | if (!$start_date) { |
| | | $start_date = gmdate('Y-m-d 00:00:00', strtotime('-1 day')); |
| | | } |
| | |
| | | } |
| | | |
| | | // Most frequent error patterns (deduplicated by component/method/message) |
| | | $frequent = $this->wpdb->get_results($this->wpdb->prepare( |
| | | "SELECT |
| | | component, |
| | | method, |
| | | error_type, |
| | | message, |
| | | severity, |
| | | source, |
| | | COUNT(*) as count, |
| | | SUM(CASE WHEN user_was_logged_in = 1 THEN 1 ELSE 0 END) as logged_in_count, |
| | | SUM(CASE WHEN user_was_logged_in = 0 THEN 1 ELSE 0 END) as logged_out_count, |
| | | MIN(created_at) as first_seen, |
| | | MAX(created_at) as last_seen |
| | | FROM {$table} |
| | | WHERE created_at BETWEEN %s AND %s |
| | | GROUP BY component, method, error_type, message, severity, source |
| | | ORDER BY count DESC, severity DESC |
| | | LIMIT 10", |
| | | $start_date, |
| | | $end_date |
| | | )); |
| | | |
| | | // Critical errors |
| | | $critical = $this->wpdb->get_results($this->wpdb->prepare( |
| | | "SELECT |
| | | component, |
| | | method, |
| | | error_type, |
| | | message, |
| | | source, |
| | | COUNT(*) as count, |
| | | SUM(CASE WHEN user_was_logged_in = 1 THEN 1 ELSE 0 END) as logged_in_count, |
| | | SUM(CASE WHEN user_was_logged_in = 0 THEN 1 ELSE 0 END) as logged_out_count, |
| | | MIN(created_at) as first_seen, |
| | | MAX(created_at) as last_seen |
| | | FROM {$table} |
| | | WHERE created_at BETWEEN %s AND %s AND severity = 'critical' |
| | | GROUP BY component, method, error_type, message, source |
| | | ORDER BY count DESC |
| | | LIMIT 5", |
| | | $start_date, |
| | | $end_date |
| | | )); |
| | | |
| | | // Overall stats |
| | | $stats = $this->wpdb->get_row($this->wpdb->prepare( |
| | | "SELECT |
| | | COUNT(*) as total_errors, |
| | | COUNT(DISTINCT CONCAT(component, '-', COALESCE(method, ''), '-', error_type)) as unique_error_types, |
| | | SUM(CASE WHEN user_was_logged_in = 1 THEN 1 ELSE 0 END) as logged_in_errors, |
| | | SUM(CASE WHEN user_was_logged_in = 0 THEN 1 ELSE 0 END) as logged_out_errors, |
| | | SUM(CASE WHEN source = 'frontend' THEN 1 ELSE 0 END) as frontend_errors, |
| | | SUM(CASE WHEN source = 'backend' THEN 1 ELSE 0 END) as backend_errors, |
| | | SUM(CASE WHEN severity = 'critical' THEN 1 ELSE 0 END) as critical_count, |
| | | SUM(CASE WHEN severity = 'error' THEN 1 ELSE 0 END) as error_count, |
| | | SUM(CASE WHEN severity = 'warning' THEN 1 ELSE 0 END) as warning_count |
| | | FROM {$table} |
| | | WHERE created_at BETWEEN %s AND %s", |
| | | $start_date, |
| | | $end_date |
| | | )); |
| | | $frequent = $this->table->getMany([ |
| | | 'where' => [ |
| | | 'created_at' => ['BETWEEN', "{$start_date} AND {$end_date}"] |
| | | ] |
| | | ]); |
| | | |
| | | return [ |
| | | 'frequent' => $frequent, |
| | | 'critical' => $critical, |
| | | 'stats' => $stats, |
| | | 'errors' => $frequent, |
| | | 'date_range' => ['start' => $start_date, 'end' => $end_date] |
| | | ]; |
| | | } |
| | |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | $map = [ |
| | | 'seo' => 'robot' |
| | | ]; |
| | | if (Features::forSite()->has('referrals')) { |
| | | if (Site::has('referrals')) { |
| | | $map['referrals'] = 'hand-heart'; |
| | | } |
| | | if (Features::forSite()->has('dashboard')) { |
| | | if (Site::has('dashboard')) { |
| | | $map['dash'] = 'door'; |
| | | } |
| | | if (Features::forSite()->has('magicLink')) { |
| | | if (Site::has('magicLink')) { |
| | | $map['magicLink'] = 'magic-wand'; |
| | | } |
| | | if (Features::hasAnyIntegration()) { |
| | | if (Site::hasAnyIntegration()) { |
| | | $map['integrations'] = 'plugs-connected'; |
| | | } |
| | | update_option(BASE.'iconMap', $map); |
| | |
| | | use JVBase\managers\queue\executors\InvitationExecutor; |
| | | use JVBase\managers\queue\TypeConfig; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_Error; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | public function defineTable():void |
| | | { |
| | | $terms = Registrar::getFeatured('invitable', 'term'); |
| | | $roles = Features::forMembership()->get('can_invite'); |
| | | $membership = Site::membership(); |
| | | $roles = ($membership) ? Site::membership()->has('can_invite') :[]; |
| | | if (empty($terms) && empty($roles)) { |
| | | return; |
| | | } |
| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\base\Site; |
| | | use JVBase\forms\TaxonomySelector; |
| | | use JVBase\meta\Form; |
| | | |
| | | use JVBase\utility\Features; |
| | | use WP_Error; |
| | | use WP_User; |
| | | |
| | |
| | | |
| | | class LoginManager |
| | | { |
| | | protected Features $siteFeatures; |
| | | protected ?Form $form = null; |
| | | protected Cache $cache; |
| | | |
| | |
| | | |
| | | public function __construct() |
| | | { |
| | | $this->siteFeatures = Features::forSite(); |
| | | |
| | | |
| | | $this->cache = Cache::for('login'); |
| | | |
| | | // Initialize magic link support if enabled |
| | | if ($this->siteFeatures->has('magicLink')) { |
| | | if (Site::has('magicLink')) { |
| | | $this->initMagicLinkSupport(); |
| | | } |
| | | |
| | |
| | | 'placeholder'=> 'look@me.com' |
| | | ] |
| | | ]; |
| | | if (Features::forSite()->has('referrals')) { |
| | | if (Site::has('referrals')) { |
| | | $fields['referral_code'] = [ |
| | | 'type' => 'text', |
| | | 'required'=> false, |
| | |
| | | |
| | | protected function initMagicLinkSupport(): void |
| | | { |
| | | if (!Features::forSite()->has('magicLink')) { |
| | | if (!Site::has('magicLink')) { |
| | | return; |
| | | } |
| | | } |
| | |
| | | |
| | | protected function maybeTurnstile(): void |
| | | { |
| | | if (!Features::hasIntegration('cloudflare')) { |
| | | if (!Site::hasIntegration('cloudflare')) { |
| | | return; |
| | | } |
| | | JVB()->connect('cloudflare')->renderTurnstile(); |
| | |
| | | |
| | | protected function maybeTurnstileScripts(): void |
| | | { |
| | | if (!Features::hasIntegration('cloudflare')) { |
| | | if (!Site::hasIntegration('cloudflare')) { |
| | | return; |
| | | } |
| | | JVB()->connect('cloudflare')->enqueueTurnstileScripts(); |
| | |
| | | |
| | | protected function verifyTurnstile(): bool |
| | | { |
| | | if (!Features::hasIntegration('cloudflare')) { |
| | | if (!Site::hasIntegration('cloudflare')) { |
| | | return true; // Not enabled, pass verification |
| | | } |
| | | |
| | |
| | | { |
| | | switch ($this->action) { |
| | | case 'register': |
| | | return [ |
| | | 'title' => JVB_LOGIN['register']['title'] ?? 'Create Your Account', |
| | | 'description' => JVB_LOGIN['register']['description'] ?? [], |
| | | 'extra' => JVB_LOGIN['register']['extra'] ?? [], |
| | | 'footer' => JVB_LOGIN['register']['footer'] ?? '', |
| | | 'email' => JVB_LOGIN['register']['email']['subject'] ?? '['.get_bloginfo('name').'] Finish Creating Your Account', |
| | | 'submit' => JVB_LOGIN['register']['submit'] ?? 'Create Account', |
| | | 'successTitle' => JVB_LOGIN['register']['success']['title'] ?? 'Success!', |
| | | 'successDescription' => JVB_LOGIN['register']['success']['description'] ?? ['See your email for next steps','(Check your spam folder if you cannot find it after a couple minutes.)'], |
| | | ]; |
| | | return Site::login()->getLabels('register'); |
| | | case 'lostpassword': |
| | | return [ |
| | | 'title' => JVB_LOGIN['forgot_password']['title'] ?? 'Reset Password', |
| | | 'description' => JVB_LOGIN['forgot_password']['description'] ?? [], |
| | | 'extra' => JVB_LOGIN['forgot_password']['extra'] ?? [], |
| | | 'footer' => JVB_LOGIN['forgot_password']['footer'] ?? '', |
| | | 'submit' => JVB_LOGIN['forgot_password']['submit'] ?? 'Send Reset Link', |
| | | 'successTitle' => JVB_LOGIN['forgot_password']['success']['title'] ?? 'Success!', |
| | | 'successDescription' => JVB_LOGIN['forgot_password']['success']['description'] ?? ['Check your email for reset instructions'], |
| | | ]; |
| | | return Site::login()->getLabels('lostPassword'); |
| | | case 'resetpass': |
| | | case 'rp': |
| | | return [ |
| | | 'title' => JVB_LOGIN['reset_pass']['title'] ?? 'Reset Your Password', |
| | | 'description' => JVB_LOGIN['reset_pass']['description'] ?? [], |
| | | 'extra' => JVB_LOGIN['reset_pass']['extra'] ?? [], |
| | | 'footer' => JVB_LOGIN['reset_pass']['footer'] ?? '', |
| | | 'submit' => JVB_LOGIN['reset_pass']['submit'] ?? 'Reset Password', |
| | | ]; |
| | | return Site::login()->getLabels('resetPassword'); |
| | | case 'logout': |
| | | return [ |
| | | 'title' => JVB_LOGIN['logout']['title'] ?? 'Logged Out!', |
| | | 'description' => JVB_LOGIN['logout']['description'] ?? [], |
| | | 'extra' => JVB_LOGIN['logout']['extra'] ?? [], |
| | | 'footer' => JVB_LOGIN['logout']['footer'] ?? '', |
| | | 'submit' => JVB_LOGIN['logout']['submit'] ?? '', |
| | | ]; |
| | | return Site::login()->getLabels('logout'); |
| | | case 'magic': |
| | | return [ |
| | | 'title' => JVB_LOGIN['magic']['title'] ?? 'Log in with Magic Link', |
| | | 'description' => JVB_LOGIN['magic']['description'] ?? ['Enter your email.','You\'ll get an email with a magic link.','Click it, and you\'re logged in!'], |
| | | 'extra' => JVB_LOGIN['magic']['extra'] ?? [], |
| | | 'footer' => JVB_LOGIN['magic']['footer'] ?? '', |
| | | 'submit' => JVB_LOGIN['magic']['submit'] ?? jvbIcon('magic-wand').'Send Magic Link', |
| | | |
| | | ]; |
| | | return Site::login()->getLabels('magic'); |
| | | case 'login': |
| | | default: |
| | | return [ |
| | | 'title' => JVB_LOGIN['login']['title'] ?? 'Sign in', |
| | | 'description' => JVB_LOGIN['login']['description'] ?? [], |
| | | 'extra' => JVB_LOGIN['login']['extra'] ?? [], |
| | | 'footer' => JVB_LOGIN['login']['footer'] ?? '', |
| | | 'submit' => JVB_LOGIN['login']['submit'] ?? 'Sign In', |
| | | ]; |
| | | return Site::login()->getLabels('login'); |
| | | } |
| | | } |
| | | |
| | |
| | | $action = $this->getAction(); |
| | | |
| | | $redirect_to = isset($_GET['redirect_to']) ? esc_url_raw($_GET['redirect_to']) : ''; |
| | | $has_turnstile = Features::hasIntegration('cloudflare'); |
| | | $has_turnstile = Site::hasIntegration('cloudflare'); |
| | | |
| | | ob_start(); |
| | | |
| | |
| | | use Exception; |
| | | use JVBase\managers\CustomTable; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; // Exit if accessed directly |
| | |
| | | 'icon' => 'info', |
| | | 'digest'=> true |
| | | ]]; |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | $types = array_merge($types, [ |
| | | 'new_favourite' => [ |
| | | 'icon' => 'heart', |
| | |
| | | <?php |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | require_once JVB_DIR . '/inc/managers/Notifications/Content.php'; |
| | | require_once JVB_DIR . '/inc/managers/Notifications/EmailDigests.php'; |
| | | require_once JVB_DIR . '/inc/managers/Notifications/Notifications.php'; |
| | | require_once JVB_DIR . '/inc/managers/Notifications/Preferences.php'; |
| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\managers\MagicLinkManager; |
| | | use JVBase\integrations\Cloudflare; |
| | | use JVBase\meta\Form; |
| | | use JVBase\ui\CRUDSkeleton; |
| | | use JVBase\ui\Tabs; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_User; |
| | | use WP_Error; |
| | | |
| | |
| | | |
| | | $table->setKeys([ |
| | | ['key' => 'PRIMARY', 'value' => 'id'], |
| | | ['key' => 'UNIQUE', 'value' => 'to_user (`to_user`)'], |
| | | ['key' => 'UNIQUE', 'value' => '(`to_user`)'], |
| | | 'from_user (`from_user`)', |
| | | 'status (`status`)', |
| | | 'code (`referral_code`)', |
| | |
| | | ]); |
| | | |
| | | $table->setKeys([ |
| | | ['key' => 'PRIMARY', 'value' => 'id'], |
| | | ['key' => 'UNIQUE', 'value' => 'code (`code`)'], |
| | | ['key' => 'PRIMARY', 'value' => '(`id`)'], |
| | | ['key' => 'UNIQUE', 'value' => '(`code`)'], |
| | | 'user (`user_id`)', |
| | | ]); |
| | | |
| | |
| | | |
| | | $table->setKeys([ |
| | | ['key' => 'PRIMARY', 'value' => '(`id`)'], |
| | | ['key' => 'UNIQUE', 'value' => 'patient_guid (`patient_guid`)'], |
| | | ['key' => 'UNIQUE', 'value' => '(`patient_guid`)'], |
| | | 'user (`user_id`)', |
| | | 'email (`email`)', |
| | | ]); |
| | |
| | | $base = BASE; |
| | | $table->setConstraints([ |
| | | "CONSTRAINT `{$base}reward_referral` FOREIGN KEY (`referral_id`) |
| | | REFERENCES {$this->referrals->getFullTableName()} (`id`) ON DELETE CASCADE", |
| | | REFERENCES `{$this->referrals->getFullTableName()}` (`id`) ON DELETE CASCADE", |
| | | "CONSTRAINT `{$base}reward_user` FOREIGN KEY (`user_id`) |
| | | REFERENCES {$table->getUserTable()}` (`ID`) ON DELETE CASCADE" |
| | | REFERENCES `{$table->getUserTable()}` (`ID`) ON DELETE CASCADE" |
| | | ]); |
| | | $table->defineTable(); |
| | | $this->rewards = $table; |
| | |
| | | 'jvb-data-store', |
| | | ]; |
| | | |
| | | if (Features::hasIntegration('cloudflare') && JVB()->connect('cloudflare')->isSetUp()) { |
| | | if (Site::hasIntegration('cloudflare') && JVB()->connect('cloudflare')->isSetUp()) { |
| | | JVB()->connect('cloudflare')->enqueueTurnstileScripts(); |
| | | } |
| | | if (is_singular(BASE.'dash')) { |
| | |
| | | * @param string|null $custom_code Optional custom code |
| | | * @return string|WP_Error |
| | | */ |
| | | public function getUserReferralCode(int $user_id, ?string $custom_code = null):array|wp_error |
| | | public function getUserReferralCode(int $user_id, ?string $custom_code = null):string|false |
| | | { |
| | | $user = get_userdata($user_id); |
| | | if (!$user) { |
| | | return new WP_Error('invalid_user', 'User not found'); |
| | | return false; |
| | | } |
| | | |
| | | $existing = $this->codes->pluck('code', ['user_id' => $user_id],'created_at', 'DESC'); |
| | | if ($existing && !$custom_code) { |
| | | return $existing; |
| | | if (!empty($existing) && !$custom_code) { |
| | | return $existing[0]; |
| | | } |
| | | if ($custom_code && !in_array($custom_code, $existing)) { |
| | | if ($custom_code && !empty($existing) && !in_array($custom_code, $existing)) { |
| | | $test = $this->createCode($user_id, $custom_code); |
| | | if ($test) { |
| | | return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC'); |
| | | } else { |
| | | return $existing[0]; |
| | | } |
| | | } else { |
| | | return $existing; |
| | | } |
| | | |
| | | // Generate new code if custom provided or none exists |
| | |
| | | |
| | | $success = $this->createCode($user_id, $code); |
| | | if ($success) { |
| | | return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC'); |
| | | return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC')[0]; |
| | | } |
| | | |
| | | return $code; |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | |
| | | public function getLoggedInReferral(int $user_id): string |
| | | { |
| | | $referral_code = $this->getUserReferralCode($user_id); |
| | | if (is_wp_error($referral_code)) { |
| | | if (!$referral_code) { |
| | | return ''; |
| | | } |
| | | |
| | |
| | | |
| | | $code = $this->getUserReferralCode($user->ID); |
| | | $yourCode = ''; |
| | | if (!is_wp_error($code)) { |
| | | if ($code) { |
| | | $share_url = $this->getShareURL($code); |
| | | $yourCode = sprintf( |
| | | '<div class="callout"> |
| | |
| | | $referrer = get_user_by('ID', $user_id); |
| | | $referral_code = $this->getUserReferralCode($user_id); |
| | | |
| | | if (is_wp_error($referral_code)) { |
| | | if ($referral_code) { |
| | | return $referral_code; |
| | | } |
| | | |
| | |
| | | |
| | | // Regular users get their referral dashboard |
| | | $user_id = get_current_user_id(); |
| | | $referral_code = get_user_meta($user_id, BASE . 'referral_code', true); |
| | | |
| | | $referral_code = $this->getUserReferralCode($user_id); |
| | | if (!$referral_code) { |
| | | $referral_code = $this->getUserReferralCode($user_id); |
| | | $referral_code = $this->generateReferralCode($user_id); |
| | | } |
| | | |
| | | $referrals = $this->getUserReferrals($user_id, ['limit' => 20]); |
| | |
| | | public function getShareButtons(int $user_id):void |
| | | { |
| | | $referral_code = $this->getUserReferralCode($user_id); |
| | | if (is_wp_error($referral_code)) { |
| | | if (!$referral_code) { |
| | | return; |
| | | } |
| | | |
| | |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_User; |
| | | use WP_Role; |
| | | |
| | |
| | | $capabilities['access_dashboard'] = true; |
| | | } |
| | | |
| | | if (Features::forSite()->has('favourites') && $registrar->hasFeature('can_favourite') ?? true) { |
| | | if (Site::has('favourites') && $registrar->hasFeature('can_favourite') ?? true) { |
| | | $capabilities['can_favourite'] = true; |
| | | } |
| | | |
| | |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_Post; |
| | | use WP_Term; |
| | | |
| | |
| | | |
| | | // Add directory if exists |
| | | if ($registrar && $registrar->hasFeature('directory')) { |
| | | $directory = JVB()->directories()?->directories($tax); |
| | | $crumbs[] = [ |
| | | 'name' => $directory['title'], |
| | | 'url' => $directory['url'] |
| | | ]; |
| | | $directory = JVB()->directories(); |
| | | if ($directory && !empty($directory->directories($tax))) { |
| | | $crumbs[] = [ |
| | | 'name' => $directory['title'], |
| | | 'url' => $directory['url'] |
| | | ]; |
| | | } |
| | | } |
| | | |
| | | // Add term hierarchy |
| | |
| | | } |
| | | |
| | | if($registrar && $registrar->hasFeature('show_directory')) { |
| | | $directory = JVB()->directories()?->directories($content)??[]; |
| | | if (!empty($directory)) { |
| | | $directory = JVB()->directories(); |
| | | if ($directory && !empty($directory->directories($content)??[])){ |
| | | $crumbs[] = [ |
| | | 'name' => $directory['title'], |
| | | 'url' =>$directory['url'] |
| | |
| | | if ($pos['title'] == 'Map') { |
| | | $crumbs[] = [ |
| | | 'name' => 'Tattoo Shops', |
| | | 'url' => JVB()->directories()?->directories(BASE.'shop')['url'] |
| | | 'url' => JVB()->directories()->directories(BASE.'shop')['url'] |
| | | ]; |
| | | } |
| | | |
| | |
| | | $name = jvbNoBase($type); |
| | | |
| | | $registrar = Registrar::getInstance($name); |
| | | if (Features::forSite()->has('is_directory') && $name === 'directory') { |
| | | if (Site::has('is_directory') && $name === 'directory') { |
| | | $crumbs[] = [ |
| | | 'name' => JVB()->directories()->referAs(true), |
| | | 'url' => get_post_type_archive_link($type) |
| | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\IconsManager; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | require(JVB_DIR . '/inc/managers/ScriptLoader.php'); |
| | | require(JVB_DIR . '/inc/managers/CustomTable.php'); |
| | |
| | | IconsManager::for('forms'); |
| | | |
| | | // Only initialize dash if feature is enabled |
| | | if (Features::forSite()->has('dashboard')) { |
| | | if (Site::has('dashboard')) { |
| | | IconsManager::for('dash'); |
| | | } |
| | | |
| | | if (Site::has('magicLink')) { |
| | | require(JVB_DIR . '/inc/managers/MagicLinkManager.php'); |
| | | } |
| | | |
| | | if (Site::hasAny(['dashboard', 'feed_block'])) { |
| | | require(JVB_DIR . '/inc/forms/TaxonomySelector.php'); |
| | | } |
| | | |
| | | if (Site::has('dashboard')) { |
| | | require(JVB_DIR . '/inc/managers/CRUDManager.php'); |
| | | require(JVB_DIR . '/inc/managers/UploadManager.php'); |
| | | } |
| | | |
| | | if (Site::has('feed_block')) { |
| | | require(JVB_DIR . '/inc/managers/TaxonomyRelationships.php'); |
| | | } |
| | | |
| | | if (Site::hasAll(['dashboard', 'membership'])) { |
| | | require(JVB_DIR . '/inc/managers/UserTermsManager.php'); |
| | | } |
| | | |
| | | if (Site::has('notifications')) { |
| | | require(JVB_DIR . '/inc/managers/Notifications/Content.php'); |
| | | require(JVB_DIR . '/inc/managers/Notifications/EmailDigests.php'); |
| | | require(JVB_DIR . '/inc/managers/Notifications/Notifications.php'); |
| | | require(JVB_DIR . '/inc/managers/Notifications/Preferences.php'); |
| | | require(JVB_DIR . '/inc/managers/NotificationManager.php'); |
| | | } |
| | | |
| | | $membership = Site::membership(); |
| | | if ($membership) { |
| | | if ($membership->has('forum') && !empty(Registrar::getFeatured('is_content', 'term'))) { |
| | | require(JVB_DIR . '/inc/managers/NewsRelationships.php'); |
| | | } |
| | | if ($membership->has('invitable')) { |
| | | require(JVB_DIR . '/inc/managers/InvitationsManager.php'); |
| | | } |
| | | } |
| | | |
| | | if (Site::has('is_directory')) { |
| | | require(JVB_DIR . '/inc/managers/DirectoryManager.php'); |
| | | } |
| | | |
| | | if (Site::has('dashboard')) { |
| | | require(JVB_DIR . '/inc/managers/DashboardManager.php'); |
| | | } |
| | | |
| | | if (Site::has('referrals')) { |
| | | require(JVB_DIR . '/inc/managers/ReferralManager.php'); |
| | | } |
| | | } |
| | | require(JVB_DIR . '/inc/managers/ErrorHandler.php'); |
| | | require(JVB_DIR . '/inc/managers/queue/_setup.php'); |
| | | //require(JVB_DIR . '/inc/managers/OperationQueue.php'); |
| | | require(JVB_DIR . '/inc/managers/EmailManager.php'); |
| | | |
| | | if (Features::forSite()->has('magicLink')) { |
| | | require(JVB_DIR . '/inc/managers/MagicLinkManager.php'); |
| | | } |
| | | |
| | | require(JVB_DIR . '/inc/managers/LoginManager.php'); |
| | | |
| | | |
| | | //IF SITE HAS DASHBOARD AND FEED BLOCK |
| | | //if (Features::forSite()->hasAny(['dashboard', 'feed_block'])) { |
| | | require(JVB_DIR . '/inc/forms/TaxonomySelector.php'); |
| | | //} |
| | | |
| | | //IF SITE HAS DASHBOARD |
| | | if (Features::forSite()->has('dashboard')) { |
| | | require(JVB_DIR . '/inc/managers/CRUDManager.php'); |
| | | require(JVB_DIR . '/inc/managers/UploadManager.php'); |
| | | } |
| | | |
| | | //IF SITE HAS FEED BLOCK |
| | | if (Features::forSite()->has('feed_block')) { |
| | | require(JVB_DIR . '/inc/managers/TaxonomyRelationships.php'); |
| | | new JVBase\managers\TaxonomyRelationships(); |
| | | } |
| | | |
| | | //if (Features::forSite()->hasAll(['dashboard', 'membership', 'feed_block'])) { |
| | | require(JVB_DIR . '/inc/managers/UserTermsManager.php'); |
| | | new JVBase\managers\UserTermsManager(); |
| | | //} |
| | | |
| | | if (Features::forSite()->has('notifications')) { |
| | | require(JVB_DIR . '/inc/managers/Notifications/Content.php'); |
| | | require(JVB_DIR . '/inc/managers/Notifications/EmailDigests.php'); |
| | | require(JVB_DIR . '/inc/managers/Notifications/Notifications.php'); |
| | | require(JVB_DIR . '/inc/managers/Notifications/Preferences.php'); |
| | | require(JVB_DIR . '/inc/managers/NotificationManager.php'); |
| | | |
| | | } |
| | | |
| | | if (Features::forMembership()->has('forum') && !empty(Registrar::getFeatured('is_content', 'term'))) { |
| | | require(JVB_DIR . '/inc/managers/NewsRelationships.php'); |
| | | } |
| | | |
| | | if (Features::forMembership()->has('invitable')) { |
| | | require(JVB_DIR . '/inc/managers/Invitations.php'); |
| | | } |
| | | |
| | | // |
| | | //require(JVB_DIR . '/inc/managers/SchemaManager.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEOMetaManager.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/_setup.php'); |
| | | if (Features::forSite()->has('is_directory')) { |
| | | require(JVB_DIR . '/inc/managers/DirectoryManager.php'); |
| | | } |
| | | |
| | | require(JVB_DIR . '/inc/managers/ImageGenerator.php'); |
| | | require(JVB_DIR . '/inc/managers/AdminPages.php'); |
| | | require(JVB_DIR . '/inc/managers/RoleManager.php'); |
| | | |
| | | |
| | | if (Features::forSite()->has('dashboard')) { |
| | | require(JVB_DIR . '/inc/managers/DashboardManager.php'); |
| | | } |
| | | |
| | | if (Features::forSite()->has('referrals')) { |
| | | require(JVB_DIR . '/inc/managers/ReferralManager.php'); |
| | | } |
| | |
| | | use JVBase\meta\Meta; |
| | | use Exception; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | 'user', 'integrations' => get_userdata($id), |
| | | default => null |
| | | }; |
| | | if (!$this->wpObject){ |
| | | return; |
| | | } |
| | | |
| | | $this->slug = match($type) { |
| | | 'post' => $this->wpObject->post_type, |
| | | 'term' => $this->wpObject->taxonomy, |
| | |
| | | <?php |
| | | namespace JVBase\registrar; |
| | | |
| | | use JVBase\forms\TaxonomySelector; |
| | | |
| | | use JVBase\base\Site; |
| | | use JVBase\inc\registrar\helpers\HideSingle; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\CRUD; |
| | |
| | | use JVBase\registrar\helpers\MakeTimelineType; |
| | | use JVBase\registrar\helpers\MakeTrackChanges; |
| | | use JVBase\registrar\helpers\MakeVerification; |
| | | use JVBase\utility\Features; |
| | | use WP_Post; |
| | | use WP_Query; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | } |
| | | public function setIntegration(string $integration):self |
| | | { |
| | | if (!Features::forSite()->has($integration)){ |
| | | |
| | | if (!Site::hasIntegration($integration)){ |
| | | error_log('Integration not available for '.$this->slug.': '.$integration); |
| | | return $this; |
| | | } |
| | |
| | | public function getIntegrationFields(string $integration):AddIntegrationFields|false |
| | | { |
| | | |
| | | if (!Features::forSite()->has($integration)){ |
| | | if (!Site::has($integration)){ |
| | | error_log('Integration not available for '.$this->slug.': '.$integration); |
| | | return false; |
| | | } |
| | |
| | | public function hasIntegration(string $integration) { |
| | | return in_array($integration, $this->integrationConfigs); |
| | | } |
| | | public function hasAnyIntegrations(array $integrations = []):bool |
| | | { |
| | | if (empty($integrations)) { |
| | | $integrations = array_keys($this->integrationConfigs); |
| | | return !empty($integrations); |
| | | } |
| | | return !empty(array_intersect($integrations, array_keys($this->integrationConfigs))); |
| | | } |
| | | public function setUploadTitle(string $title):self |
| | | { |
| | | $this->upload_title = $title; |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/registrar/config/Config.php'); |
| | | require(JVB_DIR . '/inc/registrar/config/Breadcrumbs.php'); |
| | | require(JVB_DIR . '/inc/registrar/config/Dashboard.php'); |
| | | require(JVB_DIR . '/inc/registrar/config/Directory.php'); |
| | | require(JVB_DIR . '/inc/registrar/config/Feed.php'); |
| | | require(JVB_DIR . '/inc/registrar/config/SEO.php'); |
| | | require(JVB_DIR . '/inc/registrar/config/seo/_setup.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/Config.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/Breadcrumbs.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/Dashboard.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/Directory.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/Feed.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/SEO.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/Integration.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/config/seo/_setup.php'); |
| | | |
| | | require(JVB_DIR . '/inc/registrar/fields/Field.php'); |
| | | require(JVB_DIR . '/inc/registrar/fields/GroupedField.php'); |
| | | require(JVB_DIR . '/inc/registrar/fields/RepeaterField.php'); |
| | | require(JVB_DIR . '/inc/registrar/fields/TagListField.php'); |
| | | require(JVB_DIR . '/inc/registrar/fields/OptionsField.php'); |
| | | require(JVB_DIR . '/inc/registrar/fields/SelectorField.php'); |
| | | require(JVB_DIR . '/inc/registrar/fields/UploadField.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/Field.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/GroupedField.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/RepeaterField.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/TagListField.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/OptionsField.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/SelectorField.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/fields/UploadField.php'); |
| | | |
| | | require(JVB_DIR . '/inc/registrar/helpers/AddIntegrationFields.php'); |
| | | require(JVB_DIR . '/inc/registrar/helpers/HideSingle.php'); |
| | | require(JVB_DIR . '/inc/registrar/helpers/MakeCalendarType.php'); |
| | | require(JVB_DIR . '/inc/registrar/helpers/MakeTimelineType.php'); |
| | | require(JVB_DIR . '/inc/registrar/helpers/MakeTrackChanges.php'); |
| | | require(JVB_DIR . '/inc/registrar/helpers/MakeVerification.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/helpers/AddIntegrationFields.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/helpers/HideSingle.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/helpers/MakeCalendarType.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/helpers/MakeTimelineType.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/helpers/MakeTrackChanges.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/helpers/MakeVerification.php'); |
| | | |
| | | require(JVB_DIR . '/inc/registrar/Fields.php'); |
| | | require(JVB_DIR . '/inc/registrar/Posts.php'); |
| | | require(JVB_DIR . '/inc/registrar/Terms.php'); |
| | | require(JVB_DIR . '/inc/registrar/Users.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/Fields.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/Posts.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/Terms.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/Users.php'); |
| | | |
| | | require(JVB_DIR . '/inc/registrar/Registrar.php'); |
| | | require_once(JVB_DIR . '/inc/registrar/Registrar.php'); |
| | |
| | | namespace JVBase\registrar\config; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | |
| | | |
| | | public function __construct(string $service) { |
| | | if (!Features::hasIntegration($service)) { |
| | | if (!Site::hasIntegration($service)) { |
| | | error_log('Could not link with integration, as it is not enabled: '.$service); |
| | | return; |
| | | } |
| | |
| | | $config = $this->getConfig(); |
| | | |
| | | $class = JVB()->schemaHelper()::classFromConfig($config, $meta); |
| | | |
| | | $class->setAuthor(JVB()->seo()->getCreator(true)); |
| | | return $class->outputSchema(); |
| | | } |
| | |
| | | error_log('[SEO]Schema::getConfig Invalid type: '.$type); |
| | | return []; |
| | | } |
| | | jvbDump($this->slug); |
| | | jvbDump($type); |
| | | return JVB()->schemaHelper()::getConfig($this->slug, $type); |
| | | } |
| | | |
| | |
| | | $config['type'] = $this->defaultSchema['type']; |
| | | update_option(BASE.ucfirst($this->slug).'Schema', $config); |
| | | } |
| | | $class = $this->getConfig()['type']; |
| | | $class = $config['type']; |
| | | if (!class_exists($class)) { |
| | | error_log('[SEO]Schema::defineReference Class not found: '.$class); |
| | | return; |
| | |
| | | if (is_singular($based)){ |
| | | $config = $this->getConfig('meta'); |
| | | $meta = Meta::forPost(get_the_ID()); |
| | | $title = Resolver::resolve($config['name']??$config['title'], $meta); |
| | | $title = Resolver::resolve($config['name']??$config['title']??'', $meta); |
| | | } elseif (is_post_type_archive($based) ) { |
| | | $config = $this->getConfig('archive'); |
| | | $title = $config['name']; |
| | |
| | | |
| | | use JVBase\registrar\config\Integration; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | protected function initAllowed():void |
| | | { |
| | | $allowed = []; |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | $allowed['gmb'] = 'Google My Business'; |
| | | } |
| | | if (Features::hasIntegration('facebook')) { |
| | | if (Site::hasIntegration('facebook')) { |
| | | $allowed['facebook'] = 'Facebook'; |
| | | } |
| | | if (Features::hasIntegration('square')) { |
| | | if (Site::hasIntegration('square')) { |
| | | $allowed['square'] = 'Square'; |
| | | } |
| | | if (Features::hasIntegration('instagram')) { |
| | | if (Site::hasIntegration('instagram')) { |
| | | $allowed['instagram'] = 'Instagram'; |
| | | } |
| | | if (Features::hasIntegration('bluesky')) { |
| | | if (Site::hasIntegration('bluesky')) { |
| | | $allowed['bluesky'] = 'BlueSky'; |
| | | } |
| | | if (Features::hasIntegration('helcim')) { |
| | | if (Site::hasIntegration('helcim')) { |
| | | $allowed['helcim'] = 'Helcim'; |
| | | } |
| | | $this->allowed = $allowed; |
| | |
| | | protected CustomTable $table; |
| | | public function __construct() |
| | | { |
| | | $this->defineTables(); |
| | | // $this->defineTables(); |
| | | } |
| | | |
| | | protected function defineTables():void |
| | | { |
| | | $types = implode(',', array_map(function($item) { return "`{$item}`"; },Registrar::getFeatured('verify_entry'))); |
| | | |
| | | $table = CustomTable::for('verify_entry'); |
| | | |
| | | $table->setColumns([ |
| | | 'id' => 'bigint(20) unsigned NOT NULL AUTO_INCREMENT', |
| | | 'user_id' => "{$table->getUserIDType()} NOT NULL", |
| | | 'content' |
| | | ]) |
| | | } |
| | | } |
| | |
| | | use JVBase\registry\providers\CalendarFieldProvider; |
| | | use JVBase\registry\providers\CommonFieldProvider; |
| | | use JVBase\registry\providers\FieldProviderInterface; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use JVBase\registry\providers\IntegrationFieldProvider; |
| | | |
| | | class FieldRegistry |
| | |
| | | } |
| | | } |
| | | |
| | | if (Features::hasIntegration('helcim') && jvbCheck('use_helcim', $config)) { |
| | | if (Site::hasIntegration('helcim') && jvbCheck('use_helcim', $config)) { |
| | | $helcim = JVB()->connect('helcim'); |
| | | if ($helcim) { |
| | | $contentType = $config['integrations']['helcim']['content_type'] ?? $helcim->getDefaultContentType(); |
| | |
| | | |
| | | use JVBase\forms\TaxonomySelector; |
| | | use JVBase\managers\CRUD; |
| | | use JVBase\utility\Features; |
| | | use WP_Post; |
| | | use JVBase\base\Site; |
| | | |
| | | use JVBase\meta\Registry; |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | <?php |
| | | namespace JVBase\registry\providers; |
| | | |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | protected array $allowed = []; |
| | | public function __construct() { |
| | | $allowed = []; |
| | | if (Features::hasIntegration('gmb')) { |
| | | if (Site::hasIntegration('gmb')) { |
| | | $allowed['gmb'] = 'Google My Business'; |
| | | } |
| | | if (Features::hasIntegration('facebook')) { |
| | | if (Site::hasIntegration('facebook')) { |
| | | $allowed['facebook'] = 'Facebook'; |
| | | } |
| | | if (Features::hasIntegration('square')) { |
| | | if (Site::hasIntegration('square')) { |
| | | $allowed['square'] = 'Square'; |
| | | } |
| | | if (Features::hasIntegration('instagram')) { |
| | | if (Site::hasIntegration('instagram')) { |
| | | $allowed['instagram'] = 'Instagram'; |
| | | } |
| | | if (Features::hasIntegration('bluesky')) { |
| | | if (Site::hasIntegration('bluesky')) { |
| | | $allowed['bluesky'] = 'BlueSky'; |
| | | } |
| | | if (Features::hasIntegration('helcim')) { |
| | | if (Site::hasIntegration('helcim')) { |
| | | $allowed['helcim'] = 'Helcim'; |
| | | } |
| | | $this->allowed = $allowed; |
| | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | | use Exception; |
| | |
| | | */ |
| | | protected function verifyTurnstile(string $token): bool |
| | | { |
| | | if (!Features::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) { |
| | | if (!Site::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) { |
| | | return true; |
| | | } |
| | | |
| | |
| | | use JVBase\managers\OperationQueue; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\NotificationManager; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Request; |
| | | use WP_Error; |
| | | use Exception; |
| | |
| | | |
| | | protected function verifyTurnstile(string $token): bool |
| | | { |
| | | if (!Features::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) { |
| | | if (!Site::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) { |
| | | return true; |
| | | } |
| | | |
| | |
| | | <?php |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | //NEW METHOD |
| | | require(JVB_DIR . '/inc/rest/Route.php'); |
| | |
| | | //require(JVB_DIR . '/inc/rest/RestRouteManager.php'); |
| | | //require(JVB_DIR . '/inc/rest/RegisterRoutes.php'); |
| | | |
| | | if (Features::forSite()->has('feed_block')) { |
| | | //if (Site::has('feed_block')) { |
| | | require(JVB_DIR . '/inc/rest/routes/FeedRoutes.php'); |
| | | } |
| | | //if (Features::forSite()->has('magicLink')) { |
| | | //} |
| | | //if (Site::has('magicLink')) { |
| | | // require(JVB_DIR . '/inc/rest/routes/MagicLinkRoutes.php'); |
| | | //} |
| | | if (Features::forSite()->has('favourites')) { |
| | | //if (Site::has('favourites')) { |
| | | require(JVB_DIR . '/inc/rest/routes/FavouritesRoutes.php'); |
| | | } |
| | | |
| | | if (Features::forMembership()->has('notifications')) { |
| | | //} |
| | | //$membership = Site::membership(); |
| | | //if ($membership && $membership->has('notifications')) { |
| | | require(JVB_DIR . '/inc/rest/routes/NotificationsRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | if (Features::forSite()->hasAny(['feed_block', 'dashboard'])) { |
| | | //if (Site::hasAny(['feed_block', 'dashboard'])) { |
| | | require(JVB_DIR . '/inc/rest/routes/TermRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | require(JVB_DIR . '/inc/rest/routes/QueueRoutes.php'); |
| | | require(JVB_DIR . '/inc/rest/routes/SEORoutes.php'); |
| | | require(JVB_DIR . '/inc/rest/routes/ErrorRoutes.php'); |
| | | require(JVB_DIR . '/inc/rest/routes/UploadRoutes.php'); |
| | | require(JVB_DIR . '/inc/rest/routes/SettingsRoutes.php'); |
| | | if (Features::forSite()->has('dashboard')) { |
| | | //if (Site::has('dashboard')) { |
| | | require(JVB_DIR . '/inc/rest/routes/AdminRoutes.php'); |
| | | require(JVB_DIR . '/inc/rest/routes/ContentRoutes.php'); |
| | | require(JVB_DIR . '/inc/rest/routes/ContentTermsRoutes.php'); |
| | | // require(JVB_DIR . '/inc/rest/routes/BioRoutes.php'); |
| | | // require(JVB_DIR . '/inc/rest/routes/ShopRoutes.php'); |
| | | } |
| | | if (Features::forMembership()->has('forum')) { |
| | | //} |
| | | //if ($membership && $membership->has('forum')) { |
| | | require(JVB_DIR . '/inc/rest/routes/NewsRoutes.php'); |
| | | } |
| | | if (Features::forSite()->has('referrals')) { |
| | | //} |
| | | //if (Site::has('referrals')) { |
| | | require(JVB_DIR . '/inc/rest/routes/ReferralRoutes.php'); |
| | | } |
| | | if (!empty(Registrar::getFeatured('has_responses'))) { |
| | | //} |
| | | //if (!empty(Registrar::getFeatured('has_responses'))) { |
| | | require(JVB_DIR . '/inc/rest/routes/ResponseRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | if (!empty(Registrar::getFeatured('karma'))) { |
| | | //if (!empty(Registrar::getFeatured('karma'))) { |
| | | require(JVB_DIR . '/inc/rest/routes/VoteRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | if (Features::forMembership()->has('can_invite')) { |
| | | //if ($membership && $membership->has('can_invite')) { |
| | | require(JVB_DIR . '/inc/rest/routes/Invitations.php'); |
| | | } |
| | | if (Features::forMembership()->has('member_verified')) { |
| | | //} |
| | | //if ($membership && $membership->has('member_verified')) { |
| | | require(JVB_DIR . '/inc/rest/routes/ApprovalRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | if (Features::hasIntegration('square')) { |
| | | //if (Site::hasIntegration('square')) { |
| | | require(JVB_DIR . '/inc/rest/routes/IntegrationsSquareRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | if (Features::hasIntegration('helcim')) { |
| | | //if (Site::hasIntegration('helcim')) { |
| | | require(JVB_DIR . '/inc/rest/routes/IntegrationsHelcimRoutes.php'); |
| | | } |
| | | //} |
| | | |
| | | require(JVB_DIR .'/inc/rest/routes/OptionsRoutes.php'); |
| | | require(JVB_DIR .'/inc/rest/routes/FormRoutes.php'); |
| | |
| | | use JVBase\rest\Rest; |
| | | use JVBase\rest\Route; |
| | | use JVBase\rest\Response; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | | use Exception; |
| | |
| | | public function __construct() |
| | | { |
| | | $this->cacheName = 'approvals'; |
| | | $this->hasMemberApproval = Features::forMembership()->has('member_verified'); |
| | | $this->hasMemberApproval = Site::membership() && Site::membership()->has('member_verified'); |
| | | parent::__construct(); |
| | | |
| | | $this->initTypes(); |
| | |
| | | $this->userTypes = Registrar::getFeatured('approve_new', 'user'); |
| | | $this->allTypes = $this->userTypes; |
| | | } |
| | | if (Features::forSite()->has('term_approval')) { |
| | | if (Site::has('term_approval')) { |
| | | $this->termTypes = Registrar::getFeatured('approve_new', 'term'); |
| | | $this->allTypes[] = 'term'; |
| | | } |
| | |
| | | use JVBase\rest\Rest; |
| | | use JVBase\rest\Route; |
| | | use JVBase\rest\PermissionHandler; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use JVBase\managers\CustomTable; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | |
| | | use JVBase\rest\Rest; |
| | | use JVBase\integrations\Umami; |
| | | use JVBase\rest\Route; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_Query; |
| | | use WP_Post; |
| | | use WP_Term; |
| | |
| | | |
| | | public function init():void |
| | | { |
| | | if (Features::hasIntegration('umami')) { |
| | | if (Site::hasIntegration('umami')) { |
| | | $this->tracker = JVB()->connect('umami'); |
| | | } |
| | | } |
| | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\blocks\FormBlock; |
| | | use JVBase\rest\Route; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | | use WP_Error; |
| | |
| | | |
| | | protected function verifyTurnstile(string $token): bool |
| | | { |
| | | if (!Features::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) { |
| | | if (!Site::hasIntegration('cloudflare') || !JVB()->connect('cloudflare')->isSetUp()) { |
| | | return true; |
| | | } |
| | | |
| | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\rest\Rest; |
| | | use JVBase\rest\Route; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | | use WP_Error; |
| | |
| | | |
| | | parent::__construct(); |
| | | |
| | | $this->hasMagicLink = Features::forSite()->has('magicLink'); |
| | | $this->hasMagicLink = Site::has('magicLink'); |
| | | } |
| | | |
| | | public function registerRoutes(): void |
| | |
| | | ]); |
| | | |
| | | // Process referral code if provided |
| | | if (!empty($referral_code) && Features::forSite()->has('referrals')) { |
| | | if (!empty($referral_code) && Site::has('referrals')) { |
| | | $this->processReferralCode($user_id, $referral_code); |
| | | } |
| | | |
| | |
| | | */ |
| | | protected function processReferralCode(int $user_id, string $referral_code): void |
| | | { |
| | | if (!Features::forSite()->has('referrals')) { |
| | | if (!Site::has('referrals')) { |
| | | return; |
| | | } |
| | | |
| | |
| | | $nonces = [ |
| | | 'wp_rest' => wp_create_nonce('wp_rest'), |
| | | ]; |
| | | if (Features::forSite()->has('dashboard')) { |
| | | if (Site::has('dashboard')) { |
| | | $nonces['dash'] = wp_create_nonce('dash-'.$userID); |
| | | } |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | $nonces['favourites'] = wp_create_nonce('favourites-'.$userID); |
| | | } |
| | | if (!empty(Registrar::getFeatured('karma'))) { |
| | | $nonces['votes'] = wp_create_nonce('votes-'.$userID); |
| | | } |
| | | if (Features::forSite()->has('notifications')) { |
| | | if (Site::has('notifications')) { |
| | | $nonces['notifications'] = wp_create_nonce('notifications-'.$userID); |
| | | } |
| | | return $nonces; |
| | |
| | | use JVBase\rest\Rest; |
| | | use JVBase\managers\UserTermsManager; |
| | | use JVBase\rest\Route; |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | use WP_REST_Request; |
| | | use WP_REST_Response; |
| | | use Exception; |
| | |
| | | ]]); |
| | | } |
| | | |
| | | if (Features::forMembership()->has('term_approval')) { |
| | | $membership = Site::membership(); |
| | | if ($membership && $membership->has('term_approval')) { |
| | | $approval_routes = JVB()->routes('approvals'); |
| | | $request_id = $approval_routes->createTermApprovalRequest( |
| | | $user_id, |
| | |
| | | |
| | | use JVBase\JVB; |
| | | use JVBase\managers\IconsManager; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | use JVBase\utility\Features; |
| | | use JVBase\base\Site; |
| | | |
| | | //security |
| | | if (!defined('ABSPATH')) { |
| | |
| | | |
| | | define('JVB_TESTING', str_contains(get_home_url(),'.test')); |
| | | |
| | | if (JVB_TESTING) { |
| | | //if (!JVB_TESTING) { |
| | | add_filter('show_admin_bar', '__return_false'); |
| | | } |
| | | //} |
| | | |
| | | //if (JVB_TESTING) { |
| | | // error_log('In testing mode...'); |
| | | //} else { |
| | |
| | | { |
| | | add_action('wp_head', 'jvbInlineNavStyles'); |
| | | |
| | | if (Features::forSite()->has('dashboard')) { |
| | | if (Site::has('dashboard')) { |
| | | wp_enqueue_script('jvb-queue'); |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | $interactions = []; |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | $interactions[] = 'favourites'; |
| | | } |
| | | if (!empty(Registrar::getFeatured('karma'))) { |
| | | $interactions[] = 'karma'; |
| | | } |
| | | if (Features::forSite()->has('notifications')) { |
| | | if (Site::has('notifications')) { |
| | | $interactions[] = 'notifications'; |
| | | } |
| | | |
| | |
| | | window.userFavourites = {}; |
| | | window.userVotes = {}; |
| | | '; |
| | | if (Features::forSite()->has('favourites')) { |
| | | if (Site::has('favourites')) { |
| | | wp_enqueue_script('jvb-favourites'); |
| | | $initUserSettings .= ' |
| | | //Fetch user favourites |
| | |
| | | // '); |
| | | // } |
| | | } |
| | | if (is_user_logged_in() && Features::forSite()->has('notifications')) { |
| | | if (is_user_logged_in() && Site::has('notifications')) { |
| | | wp_enqueue_script('jvb-notifications'); |
| | | |
| | | wp_localize_script('jvb-notifications', 'notificationSettings', array( |